美文网首页
[Java]02.实现猜数字

[Java]02.实现猜数字

作者: NiceBen | 来源:发表于2021-09-13 16:04 被阅读0次

    简介

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

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

    实现思路:

    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.实现猜数字

          本文链接:https://www.haomeiwen.com/subject/zzsfgltx.html