[Java]02.实现猜数字

简介

说明:猜数字是一个经典的小游戏,程序先产生一个随机数,然后用户输入数字,程序将输入的数字与随机数进行对比,给出用户相应的提示信息。

规则:按照猜数字的规则,系统随机生成一个数字,用户通过键盘输入数字进行猜测,并根据输入数字与生成的数字进行对比,返回结果,直到猜中为止。

实现思路:

  1. 初始化:通过 PropertiesFileWriter 类,创建 磁盘存储文件count.txtway.txt,分别存储游戏次数和是否付费
  2. 编写循环开始游戏:通过“是否付费”以及“游戏次数”,判断是否可以继续游戏
  3. 编写逻辑中用到的各个方法:通过PropertiesFileReader以及FileWriter等方法,来控制对应属性的操作
  4. 编写游戏逻辑:通过System.in键盘输入,判断大小来实现逻辑

实现代码

  1. 具体代码逻辑如下,这里为了方便,将所有的方法统一放到同一个类中了。

    public class BullsAndCows {
    
        // 磁盘文件存储地址
        private static String countFilePathname = "e:" + File.separator + "myJava" + File.separator + "count.txt";
        private static String wayFilePathname = "e:" + File.separator + "myJava" + File.separator + "way.txt";
    
        public static void main(String[] args) {
            userPlayGame();
            // 可以通过传入用户识别符,来区分多用户下进行游戏,项目需要进行调整,文件加锁,以及判断用户对应的参数进行修改
            // userPlayGame("用户识别符");
        }
    
        /**
         * 用户开始游戏
         */
        private static void userPlayGame() {
            init();
            while (true) {
                // free count
                int count = getCount();
                // is pay
                boolean flag = getCondition();
    
                if (flag) {
                    System.out.println("游戏已经付费,游戏次数已解封!");
                    playGame();
                } else {
                    if (count >= 5) {
                        System.out.println("试玩已经结束,请付费!");
                        payMoney();
                    } else {
                        System.out.println("这是第 " + ++count + " 次试玩!");
                        playGame();
                        writeCount();
                    }
                }
            }
        }
    
        /**
         * 初始化方法
         */
        private static void init() {
            mkdir();
            // 创建 Properties 对象
            Properties prop = new Properties();
            try (FileWriter countFw = new FileWriter(countFilePathname);
                 FileWriter wayFw = new FileWriter(wayFilePathname)) {
                prop.setProperty("count", "0");
                prop.store(countFw, null);
                prop.clear();
                prop.setProperty("way", "0");
                prop.store(wayFw, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 创建外层文件夹
         */
        private static void mkdir() {
            String countFileDirectoryPath = countFilePathname.substring(0, countFilePathname.lastIndexOf(File.separator) + 1);
            String wayFileDirectoryPath = wayFilePathname.substring(0, wayFilePathname.lastIndexOf(File.separator) + 1);
            File countDirectoryFile = new File(countFileDirectoryPath);
            File wayDirectoryFile = new File(wayFileDirectoryPath);
            if (!countDirectoryFile.exists()) {
                if (!countDirectoryFile.mkdirs()) {
                    throw new RuntimeException("创建 count.txt 外层文件夹失败!");
                }
            }
            if (!wayDirectoryFile.exists()) {
                if (!wayDirectoryFile.mkdirs()) {
                    throw new RuntimeException("创建 way.txt 外层文件夹失败!");
                }
            }
        }
    
        /**
         * 获取已经玩过的次数
         * @return  文件中的游戏次数
         */
        private static int getCount() {
            // 创建 Properties 对象
            Properties prop = new Properties();
            // 使用 FileReader 对象获取 count 文件中的游戏次数
            int tempCount = 0;
    
            try (FileReader fileReader = new FileReader(countFilePathname)) {
                prop.load(fileReader);
                String count = prop.getProperty("count");
                tempCount = Integer.parseInt(count);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return tempCount;
        }
    
        /**
         * 支付方法,支付成功则把支付状态改为“1”并存到数据库,之后可以无限次玩游戏
         */
        private static void payMoney() {
            System.out.println("please pay 5 dollar!");
            // 获取键盘录入数据
            Scanner in = new Scanner(System.in);
            // 捕获输入错误情况
            int nextInt = matchIntFigure(in);
            if (nextInt == 5) {
                // 创建 Properties 对象
                Properties prop = new Properties();
                prop.setProperty("way", "1");
                // 使用 FileWriter 类,将支付状态写入到 way 文件
                try (FileWriter fw = new FileWriter(wayFilePathname)) {
                    prop.store(fw, null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("付费失败,输入数字“5”,完成付费!");
            }
        }
    
        /**
         * 用来获取每次启动时的付费状态
         * @return 付费状态
         */
        private static boolean getCondition() {
            // 创建 Properties 对象
            Properties prop = new Properties();
            try (FileReader fr = new FileReader(wayFilePathname)) {
                prop.load(fr);
                String way = prop.getProperty("way");
                int parseInt = Integer.parseInt(way);
                if (parseInt == 1) {
                    return true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }
    
        /**
         * 将试玩的次数写入文档并保存
         */
        private static void writeCount() {
            // 创建 Properties 对象
            Properties prop = new Properties();
            // 获取当前试玩次数
            int count = getCount();
            prop.setProperty("count", String.valueOf(++count));
            try (FileWriter fw = new FileWriter(countFilePathname)) {
                prop.store(fw, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 实现游戏产生数字,获取玩家所猜数字等, 并对玩家每次输入,都会有相应的提示
         */
        private static void playGame() {
            // 产生随机数 1~100
            int random = (int) (Math.random() * 100 + 1);
            // 获取键盘录入数据
            Scanner in = new Scanner(System.in);
            System.out.println("欢迎开始 \"猜数字\" 游戏!");
            while (true) {
                System.out.println("请输入你猜的数字:");
                int guess = matchIntFigure(in);
                if (guess > random) {
                    System.out.println("猜大了!");
                } else if (guess < random) {
                    System.out.println("猜小了!");
                } else {
                    System.out.println("恭喜你, 猜对了!");
                    break;
                }
            }
        }
    
        /**
         * 匹配数字
         * @param in        键盘输入
         * @return          输入的数字
         */
        private static int matchIntFigure(Scanner in) {
            while (true) {
                if (in.hasNextInt()) {
                    return in.nextInt();
                } else {
                    System.out.println("输入类型错误,请重新输入数字:");
                    // 解决循环中使用 in.nextInt() 的无限循环问题
                    in.next();
                }
            }
        }
    }
    

你可能感兴趣的:([Java]02.实现猜数字)