Java菜鸟笔记:Java猜字母游戏完整代码 注释超详细(三次机会,计算总分,可运行)

import java.util.Scanner;
import java.util.regex.Pattern;
/**
 * 猜字母游戏,程序随机生成一个五个长度不重复的字母数组,要求用户也输入五个字母
 * 用户每猜对一个字母加十分;
 * 用户猜对字母而且位置也正确 加二十分
 */
public class GuessLetter {
    //表示用户输入的次数
    private static int count;
    //正则表达式表示只能输入五个大写字母
    private static Pattern pattern = Pattern.compile("^[A-Z]{5}$");

    public static void main(String[] args) {
        //设置用户输入次数的初始值为0
        count = 3;
        //记录分数
        int score = 0;

        //用于保存用户的输入
        char[] input = null;
        // 用于保存判断的结果
        int[] result = new int[2];
        Scanner scanner = new Scanner(System.in);
        System.out.println("GuessingLetter 欢迎尝试猜字母游戏!你一共有三次机会,只能输入五个字母,祝你好运!");
        // 表示猜测的字符串
        char[] chs = generate();
        System.out.println("GuessingLetter 游戏开始,请输入你所猜的5个字母序列:(exit——退出)");
        while (true) {
            //将用户的输入去空格且全部转换为大写
            String inputStr = scanner.next().trim().toUpperCase();

            //按EXIT游戏结束
            if ("EXIT".equals(inputStr)) {
                System.out.println("GuessingLetter 谢谢你的尝试,再见!");
                break;
            }
            //检查用户的输入是否合法,不合法直接让用户重新输入
            if (!pattern.matcher(inputStr).matches()) {
                System.out.println("GuessingLetter 只能输入五个字母!请再次输入:");
                continue;
            }

            //将用户的输入转换为char数组
            input = inputStr.toCharArray();
            //调用比较方法
            result = check(chs, input);

            if (result[0] == chs.length) {// 完全猜对的情况
                score += 20 * chs.length;
                System.out.println("GuessingLetter 恭喜你这次全猜对了,奖励一次机会!总次数=" + count + " +你目前得分是:" +
                        score + ",按exit—— 退出,请再次输入:");
            } else if (count > 1) {//普通情况
                count--;
                score += result[1] * 10 + result[0] * 10;
                System.out.println("GuessingLetter 你猜对" + result[1] + "个字符, 其中"
                        + result[0] + "个字符的位置正确!(总次数=" + count + "当前分数为" + +score + ",按exit—— 退出),请再次输入:");
            } else if (count == 1) {//游戏结束
                score += result[1] * 10 + result[0] * 10;
                System.out.println("GuessingLetter 游戏结束!你猜对" + result[1] + "个字符, 其中"
                        + result[0] + "个字符的位置正确!(总次数=" + count + ",总分数为" + +score + ")");
                break;
            }
        }
        scanner.close();

    }

    /**
     * 获取随机的五个长度字母数组且不重复
     *
     * @return 随机数组
     */
    public static char[] generate() {
        //设置一个五个长度的空数组
        char[] chs = new char[5];
        //所有字母的数组
        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'};
        //与所有字母数组同长度的布尔值数组,用于防止字母重复,默认值为false
        boolean[] flags = new boolean[letters.length];
        for (int i = 0; i < chs.length; i++) {
            int index;
            do {
                //随机一个数字,在0 - letters.length之间
                index = (int) (Math.random() * (letters.length));
            } while (flags[index]);// 判断生成的字符是否重复,如果index没出现过,程序可以继续往下运行,否则则重新随机数字
            chs[i] = letters[index];//赋值
            flags[index] = true;//设置index位置的布尔值数组为true,下次再遇到相同index就会重新随机数字
        }
        return chs;
    }

    /**
     * 比较玩家输入的字母序列和程序所生成的字母序列,逐一比较字符及其位置,并记载比较结果
     *
     * @param chs   程序生成的字符序列
     * @param input 玩家输入的字符序列
     * @return 存储比较的结果。返回值int数组 的长度为2,其中,索引为0的位置
     * 用于存放完全猜对的字母个数(字符和位置均正确),索引为1的位置用于存放猜对的字母个数(字符正确,但是位置不正确)。
     */
    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[1]++;
                    if (i == j) {// 判断位置是否正确
                        result[0]++;
                    }
                    break;
                }
            }
        }
        return result;
    }
}

你可能感兴趣的:(java开发工程师,自学java,java)