小项目-猜字符游戏

项目要求
系统自动生成5个不重复字母,用户来猜,若猜对了给出提示和分数,若没猜对,则说明猜对的字符数以及有多少个字符的位置是正确的。用户想结束游戏输入EXIT即可。

以这个项目为例学习开发一个项目的步骤

  • 分析需求,设计数据结构:变量
    char[] chs; //随机字符数组
    char[] input; //用户输入的字符数组
    int[] result; //对比的结果
    int score; //得分
  • 功能分块,设计程序结构:方法
  1. 主方法
    public static void main(String[] args){
    //…
    }
  2. 生成随机字符数组chs
    public static char[] generate(){
    char[] chs = new char[5];
    //…
    return chs;
    }
  3. 对比:随机字符数组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”)){
    }

该项目用到的小知识:

  1. 生成的字符数组不能重复,可以声明一个26位的标记数组(boolean),每使 用一个字符就把它对应的标记数组的元素值改变。
  2. 取随机数,要取[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]
  3. 字符串类型的几个操作
    • 比较值,例: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;
	}
	
}

如有错误,忘各路大神不吝赐教,感谢!

猜你喜欢

转载自blog.csdn.net/zhyue28/article/details/88251211