• Java案例——控制台实现QuickHit小游戏


    一、需求概述

    1.根据输入速率和正确率将玩家分为不同级别

    2.级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高

    3.规定时间内完成规定次数的输入,正确率达到规定要求,则升级

    4.玩家最高级别为6级、初始级别一律为1级

    5.用户错误输入一次,游戏结束

    二、发现类

    1.玩家(Player)类

    属性:

    (1)玩家当前级别号(levelNo

    (2)玩家当前级别积分(currScore

    (3)当前级别开始时间(startTime

    (4)当前级别已用时间(elapsedTime

    方法:

    玩游戏play()

    2.游戏(Game)类

    方法:

    (1)String printStr() 输出字符串,返回字符串用于和玩家输入比较

    (2)void printResult(String out,String in) :比较游戏输出out和玩家输入in,根据比较结果输出相应信息

    3.级别(Level)类

    属性:

    (1)各级别号(levelNo

    (2)各级别一次输出字符串的长度(strLength

    (3)各级别输出字符串的次数(strTimes

    (4)各级别闯关的时间限制(timeLimit

    (5)各级别正确输入一次的得分(perScore

    三、优化设计

    1.修改游戏类(Game),添加属性

    玩家: Player

    2.添加类: LevelParam

    public final static Level level[6]

    四、主要功能分析

    1.游戏输出字符串

    (1)生成字符串、输出字符串、返回字符串

    (2)生成长度固定但内容随机的字符串

    2.确认输入并输出结果

    (1)输入 :正确、未超时 ;输出: 当前级别、当前积分、已用时间

    (3)计算玩家的当前级别、当前积分和已用时间

    3.玩游戏

    (1)6个级别循环实现

    (2)每次晋级后积分清零、计时清零

    玩家类:Player类

    1. import java.util.Scanner;
    2. public class Player {
    3. private int levelNo; // 级别号
    4. private int curScore; // 当前积分
    5. private long startTime = 0; // 各级别开始时间
    6. private int elapsedTime; // 各级别已用时间
    7. //Getters/Setters方法
    8. public int getLevelNo() {
    9. return levelNo;
    10. }
    11. public void setLevelNo(int levelNo) {
    12. this.levelNo = levelNo;
    13. }
    14. public int getCurScore() {
    15. return curScore;
    16. }
    17. public void setCurScore(int curScore) {
    18. this.curScore = curScore;
    19. }
    20. public long getStartTime() {
    21. return startTime;
    22. }
    23. public void setStartTime(long startTime) {
    24. this.startTime = startTime;
    25. }
    26. public int getElapsedTime() {
    27. return elapsedTime;
    28. }
    29. public void setElapsedTime(int elapsedTime) {
    30. this.elapsedTime = elapsedTime;
    31. }
    32. /**
    33. * 玩家玩游戏。
    34. */
    35. public void play() {
    36. Game game = new Game(this);
    37. Scanner sc = new Scanner(System.in);
    38. // 外层循环,循环一次级别晋一级
    39. for (int i = 0; i < LevelParam.levels.length; i++) {
    40. // 1、 晋级
    41. this.levelNo += 1;
    42. // 2、 晋级后计时清零,积分清零
    43. this.startTime = System.currentTimeMillis();
    44. this.curScore = 0;
    45. // 3、 内层循环,循环一次完成一次字符串的输出、输入、比较
    46. for (int j = 0; j < LevelParam.levels[levelNo - 1].getstrTimes(); j++) {
    47. // 3.1、游戏输出字符串
    48. String outStr = game.printStr();
    49. // 3.2、接收用户输入
    50. String inStr = sc.next();
    51. // 3.3、游戏判断玩家输入是否正确,并输出相应结果信息
    52. game.printResult(outStr, inStr);
    53. }
    54. }
    55. sc.close();
    56. }
    57. }

    游戏类:Game类

    1. import java.util.Random;
    2. public class Game {
    3. private Player player;// 玩家
    4. /**
    5. * 无参构造方法
    6. */
    7. public Game() {
    8. super();
    9. }
    10. /**
    11. * 有参构造方法,传入玩家信息。
    12. *
    13. * @param player
    14. * 玩家
    15. */
    16. public Game(Player player) {
    17. this.player = player;
    18. }
    19. /**
    20. * 输出指定级别规定长度的字符串。
    21. *
    22. * @return 输出的字符串,用于和用户输入比较
    23. */
    24. public String printStr() {
    25. int strLength = LevelParam.levels[player.getLevelNo() - 1].getStrLength();
    26. StringBuffer buffer = new StringBuffer();
    27. Random random = new Random();
    28. // 1、通过循环生成要输出的字符串
    29. for (int i = 0; i < strLength; i++) {
    30. // 1.1、产生随机数
    31. int rand = random.nextInt(strLength);
    32. // 1.2、根据随机数拼接字符串
    33. switch (rand) {
    34. case 0:
    35. buffer.append(">");
    36. break;
    37. case 1:
    38. buffer.append("<");
    39. break;
    40. case 2:
    41. buffer.append("*");
    42. break;
    43. case 3:
    44. buffer.append("&");
    45. break;
    46. case 4:
    47. buffer.append("%");
    48. break;
    49. case 5:
    50. buffer.append("#");
    51. break;
    52. }
    53. }
    54. // 2、输出字符串
    55. System.out.println(buffer);
    56. // 3、返回字符串用于和玩家输入相比较
    57. return buffer.toString();
    58. }
    59. /**
    60. * 判断玩家输入是否正确,并输出相应结果信息。
    61. *
    62. * @param out
    63. * 游戏输出的字符串
    64. * @param in
    65. * 玩家输入的字符串
    66. */
    67. public void printResult(String out, String in) {
    68. boolean flag;
    69. if (out.equals(in)) {
    70. flag = true;
    71. } else {
    72. flag = false;
    73. }
    74. // 1、 如果输入正确
    75. if (flag) {
    76. long currentTime = System.currentTimeMillis();
    77. // 1.1、 如果超时
    78. if ((currentTime - player.getStartTime()) / 1000 > LevelParam.levels[player.getLevelNo() - 1]
    79. .getTimeLimit()) {
    80. System.out.println("你输入太慢了,已经超时,退出!");
    81. System.exit(1);
    82. // 1.2、 如果没有超时
    83. } else {
    84. // 1.2.1、 计算当前积分
    85. player.setCurScore(player.getCurScore() + LevelParam.levels[player.getLevelNo() - 1].getPerScore());
    86. // 1.2.2、 计算已用时间
    87. player.setElapsedTime((int) ((currentTime - player.getStartTime()) / 1000));
    88. // 1.2.3、输出当前积分、当前级别、已用时间
    89. System.out.println("输入正确,您的级别" + player.getLevelNo() + " ,您的积分" + player.getCurScore() + ",已用时间"
    90. + player.getElapsedTime() + "秒。");
    91. // 1.2.4、判断用户是否已经闯过最后一关
    92. if (player.getLevelNo() == 6) {
    93. int score = LevelParam.levels[player.getLevelNo() - 1].getPerScore()
    94. * LevelParam.levels[player.getLevelNo() - 1].getstrTimes();// 计算闯关分数
    95. if (player.getCurScore() == score) {
    96. System.out.println("你已闯关成功,成为绝世高手,恭喜你!!!");
    97. System.exit(0);
    98. }
    99. }
    100. }
    101. // 2、如果输入错误
    102. } else {
    103. System.out.println("输入错误,退出!");
    104. System.exit(1);
    105. }
    106. }
    107. }

    级别类:Level类

    1. public class Level {
    2. private int levelNo; // 级别号
    3. private int strLength; // 各级别一次输出字符串的长度
    4. private int strTimes; // 各级别输出字符串的次数
    5. private int timeLimit; // 各级别闯关的时间限制
    6. private int perScore; // 各级别成功输入一次字符串后增加的分值
    7. public Level(int levelNo, int strLength, int strTimes, int timeLimit, int perScore) {
    8. this.levelNo = levelNo;
    9. this.strLength = strLength;
    10. this.strTimes = strTimes;
    11. this.timeLimit = timeLimit;
    12. this.perScore = perScore;
    13. }
    14. public int getLevelNo() {
    15. return levelNo;
    16. }
    17. public int getStrLength() {
    18. return strLength;
    19. }
    20. public int getstrTimes() {
    21. return strTimes;
    22. }
    23. public int getTimeLimit() {
    24. return timeLimit;
    25. }
    26. public int getPerScore() {
    27. return perScore;
    28. }
    29. }

    LevelParam类:级别参数类,配置各个级别参数。

    1. public class LevelParam {
    2. public final static Level levels[] = new Level[6];// 对应六个级别
    3. static {
    4. // 各级别编号,各级别一次输出字符串的长度,各级别输出字符串的次数,各级别闯关的时间限制,各级别成功输入一次字符串后增加的分值
    5. levels[0] = new Level(1, 2, 10, 30, 1);
    6. levels[1] = new Level(2, 3, 9, 26, 2);
    7. levels[2] = new Level(3, 4, 8, 22, 5);
    8. levels[3] = new Level(4, 5, 7, 18, 8);
    9. levels[4] = new Level(5, 6, 6, 15, 10);
    10. levels[5] = new Level(6, 7, 5, 12, 15);
    11. }
    12. }

    测试类:

    1. public class Test {
    2. public static void main(String[] args) {
    3. Player player = new Player();
    4. player.play();
    5. }
    6. }

    结果:

     

  • 相关阅读:
    开发知识点-stm32/ESP32/Mega2560嵌入式设计
    3. 数组+【矩阵压缩存储】:对称、三角、三对角、稀疏矩阵
    Vue项目中监听全屏事件,实现全屏功能和按esc退出全屏(解决全屏踩坑难题)
    Maven | 依赖
    stack和queue和优先级队列(大堆和小堆)模拟实现和仿函数讲解
    【填坑】THERE IS A CHART INSTANCE ALREADY INITIALIZED ON THE DOM
    mysql 反斜杠\的坑
    电脑恢复永久删除文件的方法有哪些
    BAPI 和 RFC 的区别
    【状语从句练习题】because vs so
  • 原文地址:https://blog.csdn.net/lv121218/article/details/128071662