1、需求概述
根据输入速率和正确率将玩家分为不同级别
级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高
规定时间内完成规定次数的输入,正确率达到规定要求,则升级
l玩家最高级别为6级、初始级别一律为1级用户错误输入一次,游戏结束
2根据需求,可以分为玩家(Player)类,游戏类(Game);级别(Level)类
3类的属性
玩家类(Player)的属性
玩家当前的级别号(levelNo)
玩家当前级别的分数(Score)
玩家级别开始时间(startTime)
玩家已使用时间(usedTime)
玩家总用时常(totalTime)
级别类(Level)的属性
级别号(levelNo)
每次输入字符串的长度(strLength)
输入字符串的次数(typeCnt)
闯关的时间限制 (lvlTime)
每次打字的积分(perScore)
4、实现程序的运行
玩家类(Player)
public class Player{
String name;
int lvlNo=1;
long startTime=System.currentTimeMillis();
long usedTime;
long totalUsedTime;
int scores=0;
public void play(){
Game g=new Game();
g.run(p.this);
}
}
级别类(Level)
public class Level{
int lvlNo;
int typeCnt;
int strLength;
int lvlTime;
int perScore;
public Level(int lvlNo,int typeCnt,int strLength,int lvlTime,int perScore){
this.lvlNo=lvlNo;
this.typeCnt=typeCnt;
this.strLength=strLength;
this.lvlTime=lvlTime;
this.perScore=perScore;
}
}
游戏类(Games)
public class Game implements Printer {
private Scanner input = new Scanner(System.in);
public final Level[] LEVELS = {
new Level(1, 1, 2, 20,1),
new Level(2, 1, 3, 30, 2),
new Level(3, 2, 4, 40, 3),
new Level(4, 3, 5, 50, 4),
new Level(5, 3, 5, 60, 5),
new Level(6, 3, 6, 70, 6)
};
public String print(int levelNo){ //生成级别字符串
int length =LEVELS[levelNo-1].strLength;
String rst="";
char[] c =new char[length];
for(int i=0;i<c.length;i++)
//每次都是全小写字母(97-122)和全大写字母(65-90)
int chose = (int) (Math.random() * 2);
c[i]=(char)(Math.random()*26+(chose==0?65:97));
}
rst = new String(c);
return rst;
}
//每一轮的比较方法
public void round(Player p) {
Level level = LEVELS[p.lvlNo - 1];
System.out.println(p.name + ",当前级别:" + level.lvlNo + ",要输入" + level.typeCnt
+ "次,每次长度时:" + level.strLength + ",时常限时" + level.lvlTime
+ "秒,当前积分为:" + p.scores);
for (int i = 0; i < level.typeCnt; i++) {
String s=print(p.lvlNo);
System.out.println("请输入:" + s);
String in = input.next();
long now = System.currentTimeMillis();
if (!s.equals(in)) {
throw new GameErrException("输入错误,退出游戏");
}
long used = (now - p.startTime) / 1000;
p.usedTime = used;
if (used > level.lvlTime) {
throw new GameErrException("输入超时,退出游戏!");
}
p.scores += level.perScore;
}
long left = level.lvlTime - p.usedTime;
p.scores += left * level.perScore;
p.totalUsedTime+=p.usedTime;
System.out.println("恭喜升级,当前等级已用时常"+p.usedTime);
System.out.println("获得额外的附加分:"+left*level.perScore);
}
// public static void main(String[] args) {
// Player p=new Player();
// p.name="";
// Game g=new Game();
// g.round(p);
// }
public void run(Player p) {
if (p == null) {
p = new Player();
System.out.print("欢迎新用户");
}
if (p.name == null) {
p = new Player();
System.out.print("请输入您的姓名:");
p.name = input.next();
}
System.out.println("尊敬的"+p.name+"游戏已经开始了,请准备!");
do {//控制升级过程
round(p);
p.lvlNo++;
}while (p.lvlNo<=LEVELS.length);// lvlNo<=6
System.out.println("恭喜"+p.name+"选手通关!您的总积分为:"+p.scores+",总时常"+
p.totalUsedTime);
}
// public static void main(String[] args) {
// Game g=new Game();
// Player p=null;
// g.run(p);
// }
}
5、游戏类应用一个打印方法,可以用接口来实现
public interface Printer {
String print(int a);
}
6、测试类遇到问题需要抛出,所有建一个抛出异常类
public class GameErrException extends RuntimeException {
public GameErrException(String message) {
super(message);
}
}
7、测试类
public class GameZone { public static void main(String[] args) { Player p=new Player(); p.name="大力水手"; try { Game g = new Game(); p.play(); }catch (GameErrException e){ System.out.println(e.getMessage()); }finally { System.out.println(p.name+"您最终的积分为:"+p.scores); } } }
8、运行结果