Java 基础 猜字符小游戏

猜字符小游戏是对Java 语言基础的总结,几乎涵盖的了语言基础中的所有知识,包括 顺序机构,分支结构,循环结构,数组,以及方法的调用.

本文源码中有详细的注解,如果有看不懂的,欢迎留言问答!本文是提供给入门的新手的,还望路过的大牛,不喜勿喷.

package GuessGame;

import java.util.Scanner;

public class Guessing {

	public static void main(String[] args) {
		char [] chs = character();// 获取控制台权限
		System.out.println(chs);// 作弊,打印的结果
		Scanner scanner = new Scanner(System.in);//获取控制台权限
		int count = 0;//声明次数
		while(true){//自造死循环
			System.out.println("Guess!(猜吧)");
			String str = scanner.nextLine().toUpperCase();//将用户输入的转为大写
			if(str.equals("EXIT")) {//如果用户输入EXIT直接退出程序
				System.out.println("Game Over! Welcome to come again(游戏结束!欢迎下次再来) ");
				return;
			}
			char [] input = str.toCharArray();//将用户输入的字符串转为字符数组
			int [] result =check(chs,input);//对比随机数组chs 和用户输入的 input数组 是否正确
			if(result[1] == chs.length){// 如果字符对的位置个数与chs的长度相同,说明猜对了
				int score = 100 * chs.length - count * 10;
				System.out.println("Congratulations! Your score is(恭喜你猜对了,你的得分为):"+score);
				return;
			}else {
				count ++;//猜错的次数自增
				System.out.println("Number of characters correctly guessed(猜对的字符个数为):"+result[0]+
						" Number of correct character positions(猜对的字符位置个数为):" +result[1]);
			}
		}
	}
	// 生成随机字符数组
	public static char [] character(){
		char [] chs = new char [5]; // 随机字符数组
		char [] letters = new char [26];// 26个英文字符的范围,然后遍历赋值,此处可以有另外一种方法生成,虽然比较麻烦但不需要遍历赋值,下面注释中演示
		for (int i = 0; i < letters.length; i++) {
			letters [i] = (char) ('A'+i);
		}
		/*char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
				'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
				'W', 'X', 'Y', 'Z' };*/ //随机字符的范围
		boolean [] flags = new boolean [letters.length];// 开关数据用来比较去除重复
		for(int i = 0; i <chs.length; i++){//遍历赋值随机字符
			int index;// 下标
			do {
				index = (int)(Math.random()*letters.length);//生成随机下标
			} while (flags[index] == true);//当下标index对应的开关为true时,表示对应字符已存过,则重新生成下标index
            //当下标index对应的开头为false时,表示对应字符未存过,则循环结束
			chs [i] = letters[index];//基于下标index到letters中获取字符,并赋值给chs中的每一个元素
			flags [index] = true;// //将下标index对应的开关修改为true,表示对应字符已存过
		}
		return chs;
	}
	
	// 比较去重的过程
	/*i=0 index=0	chs[0]='A'  flags[0]=true
	 * i=1 index=25	chs[1]='Z'	flags[25]=true
	 * i=2 index=0/25/0/1	chs[2]='B'  flags[1]=true*/
	
	// 对比chs 字符数组和 input 字符数组
	public static int [] check(char [] chs, char [] input){
		int [] result = new int [2];// 对比结果(0,0) 假设 result[0]为字符对的个数,result[1]为字符位置对的个数
		for (int i = 0; i < chs.length; i++) {//遍历随机字符数组
			for (int j = 0; j < input.length; j++) {//遍历用户输入的字符数组
				if(chs[i] == input[j]){// 字符正确
					result [0]++;// 字符对的个数自增
					if(i == j){//字符位置正确
						result [1]++;//字符对的位置自增
					}
					break;//剩余的input元素本轮不再比较
				}
			}
		}
		return result;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43062870/article/details/85923069