项目要求:
系统自动生成5个不重复字母,用户来猜,若猜对了给出提示和分数,若没猜对,则说明猜对的字符数以及有多少个字符的位置是正确的。用户想结束游戏输入EXIT即可。
以这个项目为例学习开发一个项目的步骤
- 分析需求,设计数据结构:变量
char[] chs; //随机字符数组
char[] input; //用户输入的字符数组
int[] result; //对比的结果
int score; //得分 - 功能分块,设计程序结构:方法
- 主方法
public static void main(String[] args){
//…
} - 生成随机字符数组chs
public static char[] generate(){
char[] chs = new char[5];
//…
return chs;
} - 对比:随机字符数组chs与用户输入的字符数组input
public static int[] check(char[] chs,char[] input){
int[] result = new int[2];
//…
return result;
}
- 设计算法:方法体
String str = “hello”;
1)将字符串转换为字符数组:
char[] input = str.toCharArray();
2)将字符串转换为大写字母:
str = str.toUpperCase();
将字符串转换为小写字母:
str = str.toLowerCase();
3)判断字符串内容是否相等:
if(str.equals(“EXIT”)){
}
该项目用到的小知识:
- 生成的字符数组不能重复,可以声明一个26位的标记数组(boolean),每使 用一个字符就把它对应的标记数组的元素值改变。
- 取随机数,要取[m,n]之间的整数:(int)(Math.random()*(n-m+1)+m)
原理:
Math.random--------------------------[0,1)
*(n-m+1)--------------------------------[0,n-m+1)
取整--------------------------------------[0,n-m]
+m----------------------------------------[m,n] - 字符串类型的几个操作
- 比较值,例:if(str.equals(“exit”));
- 转成大写:str.toUpperCase();
- 转成小写:str.toLowerCase();
- 转成字符数组:str.toCharArray();
- 打印字符型数组:system.out.println(charArr)
代码
package mypackage;
import java.util.Arrays;
import java.util.Scanner;
public class GuessingGametest {
public static void main(String[] args) {
//System.out.println(Arrays.toString(generate(5)));
//System.out.println(generate(5));
Scanner scan = new Scanner(System.in);
System.out.println("游戏开始");
int n = 5;
int counts=0;//循环计数器,计算扣分
char[] chs = generate(n);//标准数组放在前面
System.out.println(Arrays.toString(chs));//作弊
for(;;) {
System.out.println("请输入"+n+"个字母");
String str = scan.next().toUpperCase();//字符串便大写
if(str.equals("EXIT")) {//退出游戏
System.out.println("GameOver!");
break;
}else if(str.length()!=n) {//输入不合法警报
System.out.println("字符个数错误,请重新输入"+n+"个字母");
continue;
}
char[] input = str.toCharArray();//字符串转成字符数组
int[] result = check(chs ,input);
int score = n*100-counts*10;
if(result[1]==n) {
System.out.println("恭喜你猜对了!得分:"+score);
break;
}else {//错
System.out.println("对了"+result[0]+"个字母,有"+result[1]+"个位置是正确的");
counts++;//答题次数
}
}
}
//生成目标数组
public static char[] generate( int n) {
char[] chs = new char[n];
boolean[] flags = new boolean[26];//标记数组,用来标记已使用过的字符,防止重复
for(int i=0;i<chs.length;i++) {
do {
chs[i]=(char)(int)(Math.random()*26+65);//生成固定范围的随机数(65(A)~90(Z))为字符数组赋值
}while(flags[chs[i]-65]);
flags[chs[i]-65]=true;//对应chs【i】的flags赋值为true
}
return chs;
}
//对比
public static int[] check(char[] chs ,char[] input) {
int[] result = new int[2];
for(int i=0;i<input.length;i++) {//用户输入放在外层,标准数组放在内层,因为标准数组是不重复的,可以防止用户重复输入时重复记数
for(int j=0;j<chs.length;j++) {
if(input[i]==chs[j]) {
result[0]++;//判断正确的字符数
if(i==j) {
result[1]++;//判断正确位置的字符数
}
}
}
}
return result;
}
}
如有错误,忘各路大神不吝赐教,感谢!