需求概述:
根据输入速率和正确率将玩家分为不同级别
级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高
规定时间内完成规定次数的输入,正确率达到规定要求,则升级
玩家最高级别为6
级、初始级别一律为
1
级
用户错误输入一次,游戏结束
逻辑分析
有几个对象(类型):
玩家Player:(姓名、级别编号=1、开始时间、已用时间、积分)、玩游戏(游戏 对象)
游戏Game:展示要匹配的字符()、匹配()、升级()、运行()
级别Level:(级别编号、字符数、得分、规定时间、规定次数)
接口LevelParams:预置所有级别
输入不匹配异常InputTypeMismatchException:
输入超时异常InputOutOfTimeException:
测试类:
生成随机字符串
A65、a97
public String randomStr(int charNum) { String str = ""; for (int i = 0; i < charNum; i++) { int num = (int) (Math.random() * 2); char c = (char) (int) ((Math.random() * 26 + (num == 0 ? 65 : 97))); str += c; } System.out.println(str); return str; }
代码如下:
package cn.kgc; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:级别Level:(级别编号、字符数、得分、规定时间、规定次数) */ public class Level { private int lvlNo;//级别编号 private int charNum;// 每次要匹配的字符数 private int perScore;//每次匹配成功获得的积分 private int limitTime;//每个级别限制的时间 private int typeCent;//每个级别要匹配的次数 public Level(int lvlNo, int charNum, int perScore, int limitTime, int typeCent) { this.lvlNo = lvlNo; this.charNum = charNum; this.perScore = perScore; this.limitTime = limitTime; this.typeCent = typeCent; } public int getLvlNo() { return lvlNo; } public void setLvlNo(int lvlNo) { this.lvlNo = lvlNo; } public int getCharNum() { return charNum; } public void setCharNum(int charNum) { this.charNum = charNum; } public int getPerScore() { return perScore; } public void setPerScore(int perScore) { this.perScore = perScore; } public int getLimitTime() { return limitTime; } public void setLimitTime(int limitTime) { this.limitTime = limitTime; } public int getTypeCent() { return typeCent; } public void setTypeCent(int typeCent) { this.typeCent = typeCent; } }
package cn.kgc; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:接口LevelParams:预置所有级别 */ public interface LevelParams { Level[] lEVELS={ new Level(1, 2, 2, 20,3), new Level(2, 3, 3, 35,4), new Level(3, 4, 4, 50,5), new Level(4, 5, 5, 60,5), new Level(5, 5, 6, 60,6), new Level(6, 6, 7, 50,5) }; }
package cn.kgc; import java.util.PrimitiveIterator; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:玩家Player(姓名、级别编号=1、开始时间、已用时间、积分)、 * 玩游戏(游戏 对象) */ public class Player { private String name; private int lvlNo=1; private long startTime=System.currentTimeMillis(); private long usedTime; private int totalScores=0; public void play(Game g){ g.run(this); } public Player(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getLvlNo() { return lvlNo; } public void setLvlNo(int lvlNo) { this.lvlNo = lvlNo; } public long getStartTime() { return startTime; } public void setStartTime(long startTime) { this.startTime = startTime; } public long getUsedTime() { return usedTime; } public void setUsedTime(long usedTime) { this.usedTime = usedTime; } public int getTotalScores() { return totalScores; } public void setTotalScores(int totalScores) { this.totalScores = totalScores; } }
package cn.kgc; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021 * @Description:输入超时异常InputOutOfTimeException: */ public class InputOutOfTimeException extends RuntimeException { public InputOutOfTimeException(String message) { super(message); } }
package cn.kgc; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:输入不匹配异常InputTypeMismatchException: */ public class InputTypeMismatchException extends RuntimeException{ public InputTypeMismatchException(String message) { super(message); } }
package cn.kgc; import java.sql.SQLOutput; import java.util.Random; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:负责整个游戏的运行流程 * 游戏Game:展示要匹配的字符()、匹配()、升级()、运行() */ public class Game { private Scanner s = new Scanner(System.in); private Level[] levels = LevelParams.lEVELS; //开始游戏 public void run(Player p) { int lvlNo = p.getLvlNo(); if(lvlNo>6){//递归的退出条件 System.out.println("恭喜"+p.getName()+",成功通关!"); return; }//欢迎词 System.out.println("欢迎" + p.getName() + ",您当前级别为:" + lvlNo+ ",积分为:" +p.getTotalScores()); int cnt = levels[lvlNo - 1].getTypeCent(); int charNum = levels[lvlNo - 1].getCharNum(); //根据级别来打印当前的字符串,同时匹配 for (int i = 0; i < cnt; i++) { String printStr = randomStr(charNum); System.out.println("要匹配的字符串为:" + printStr); boolean rst = isCorrect(printStr); long now = System.currentTimeMillis(); if (!rst) { throw new InputTypeMismatchException("输入错误!游戏结束!"); } long used = now - p.getStartTime(); p.setUsedTime(used); int timeLimit = levels[lvlNo - 1].getLimitTime(); if (used > timeLimit * 1000) { throw new InputOutOfTimeException("输入超时,游戏结束!"); } int score = p.getTotalScores() + levels[lvlNo - 1].getPerScore(); p.setTotalScores(score); System.out.println("输入正确" + p.getName() + ",您的积分为:" + score + ",已用时间为:" + used / 1000 + "秒"); } p.setLvlNo(lvlNo + 1);//升级 p.setStartTime(System.currentTimeMillis());//重置开始时间 run(p); } public String randomStr(int charNum) { String str = ""; for (int i = 0; i < charNum; i++) { int num = (int) (Math.random() * 2); char c = (char) (int) ((Math.random() * 26 + (num == 0 ? 65 : 97))); str += c; } return str; } public boolean isCorrect(String str) { System.out.println("请输入:"); String input = s.next(); if (str.equals(input)) { return true; } return false; } }
package cn.kgc; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:游戏设计逻辑 * 有那几个对象(类型): * 玩家Player(姓名、级别编号=1、开始时间、已用时间、积分)、玩游戏(游戏 对象) * 游戏Game:展示要匹配的字符()、匹配()、升级()、运行() * 级别Level:(级别编号、字符数、得分、规定时间、规定次数) * 接口LevelParams:预置所有级别 * 输入不匹配异常InputTypeMi smatchException: * 输入超时异常InputoutofTimeException: */ public class Test { public static void main(String[] args) { Player p=new Player("牛牛"); Game g=new Game(); p.play(g); } }
以上就是全部代码,下面是自己做的修改:
要求:
1、修改逻辑(不再是输错一次直接退出,而是计算准确率)
2、不再是超时退出,而是计算时间,计算打字平均速度
我是全部在Game类里改的,因此我下面只把Game类代码发一下就可以了,其他都没变!
package cn.kgc; import java.sql.SQLOutput; import java.util.Random; import java.util.Scanner; /** * @Author:Adminstrator * @Date:2021-11-08 * @Description:负责整个游戏的运行流程 * 游戏Game:展示要匹配的字符()、匹配()、升级()、运行() */ public class Game { private Scanner s = new Scanner(System.in); private Level[] levels = LevelParams.lEVELS; int c1=0;//表示错误次数 long used=0;//表示打字时间 int a1=0;//输入的总次数 double b1=0;//打字准确率 double speed=0; //开始游戏 public void run(Player p) { int lvlNo = p.getLvlNo(); if(lvlNo>6){//递归的退出条件 System.out.println("恭喜"+p.getName()+"完成本次练习!"); correctRate(); speed(); return; }//欢迎词 System.out.println("欢迎" + p.getName() + ",您当前级别为:" + lvlNo+ ",积分为:" +p.getTotalScores()); int cnt = levels[lvlNo - 1].getTypeCent(); int charNum = levels[lvlNo - 1].getCharNum(); //根据级别来打印当前的字符串,同时匹配 for (int i = 0; i < cnt; i++) { a1+=1; String printStr = randomStr(charNum); System.out.println("要匹配的字符串为:" + printStr); boolean rst = isCorrect(printStr); long now = System.currentTimeMillis(); // if (!rst) { // c1+=1; // } used = now - p.getStartTime(); p.setUsedTime(used); // int timeLimit = levels[lvlNo - 1].getLimitTime(); // if (used > timeLimit * 1000) { // throw new InputOutOfTimeException("输入超时,游戏结束!"); // } if (!rst) { c1+=1; }else{ int score = p.getTotalScores() + levels[lvlNo - 1].getPerScore(); p.setTotalScores(score); System.out.println("输入正确" + p.getName() + ",您的积分为:" + score + ",已用时间为:" + used / 1000 + "秒");} } p.setLvlNo(lvlNo + 1);//升级 // p.setStartTime(System.currentTimeMillis());//重置开始时间 run(p); } public String randomStr(int charNum) { String str = ""; for (int i = 0; i < charNum; i++) { int num = (int) (Math.random() * 2); char c = (char) (int) ((Math.random() * 26 + (num == 0 ? 65 : 97))); str += c; } System.out.println(str); return str; } public boolean isCorrect(String str) { System.out.println("请输入:"); String input = s.next(); if (str.equals(input)) { return true; } return false; }//计算准确率 public void correctRate(){ b1=(a1-c1)*100.0/a1; System.out.println("您打了"+a1+"个字,正确输入了"+(a1-c1)+"个字,准确率是"+b1+"%"); }//计算打字速度 public void speed(){ speed=a1/(used/1000.0); System.out.println("您本次打字用时为"+(used/1000)+"秒"+",您本次打字速度为"+speed+"字/秒"); } }
明天见!