需求分析:
1、随着等级的增加,输入字符数增加,时间不断减少,每一次答对的得分增加。
2、在规定时间内完成当前等级的输入次数,正确率达标后,则升级。六个级别
3、用户错误输入一次,游戏结束。
该练习需要创建四个类(玩家:play 游戏:game 级别:level 工具类:levelutils)
player类
属性:
玩家当前等级(levelNo)
玩家当前积分(currScore)
当前等级开始时间(startTime)
当前等级已用时间(elapsedTime)
方法:
玩游戏(play)
上面四个属性(get和set方法)
代码如下:
public class Player {
//当前玩家的等级号(默认等级:1)
private int levelNo=1;
//玩家当前积分
private int currScore;
//当前等级开始时间
private long startTime;
//当前等级已用的时间
private int elapsedTime;
Game game=new Game(this);
Scanner input=new Scanner(System.in);
//玩游戏方法
public void play() {
//外层循环:按照等级循环
for (int i = 0; i <LevelUtils.levels.length ; i++) {
if (levelNo>1){
System.out.println("恭喜你成功升级,当前级别:" + levelNo);
}
//升级后,清理上一等级的积分
currScore=0;
//获取当前系统时间
startTime=System.currentTimeMillis();
//内部循环:该级别输出字符串的次数
for (int j = 0; j <LevelUtils.levels[levelNo-1].getInputTimes() ; j++) {
//程序产生的随机字符串
String out=game.printStr();
//控制台输入字符串
String in=input.next();
//传入game的到结果
game.printResult(in,out);
}
//增加等级
levelNo++;
}
}
//玩家属性get和set方法
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public int getCurrScore() {
return currScore;
}
public void setCurrScore(int currScore) {
this.currScore = currScore;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public int getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(int elapsedTime) {
this.elapsedTime = elapsedTime;
}
}
game类
属性:
当前玩家:play
方法:
随机产生字符(printStr)
1.获取当前玩家等级
2.随机字符串
3.创建Stringbuffer
4.创建Random
5.随机产生与当前等级一样的字符串
代码如下:
public class Game {
//设置游戏玩家
private Player player;
public Game(Player player) {
this.player = player;
}
//产生随机字符串
public String printStr(){
//获取当前玩家等级(默认等级为1)数组下标从0开始
Level level01=LevelUtils.levels[player.getLevelNo()-1] ;
//字符串
String str="abcdefghijklmnopqrstuvwxyz1234567890~!";
//创建Stringbuffer
StringBuffer sb= new StringBuffer();
//产生当前等级的字符串
Random random=new Random();
for (int i = 0; i <level01.getStrLength() ; i++) {
//随机产生
char ch= str.charAt(random.nextInt(str.length()));
sb.append(ch);
}
System.out.println(sb);
return sb.toString();
}
//匹配字符串
public void printResult(String in , String out){
//获取当前等级(等级从0开始)
Level nowLevel=LevelUtils.levels[player.getLevelNo()-1];
//判断程序输出的字符串与控制台输入的字符串是否匹配
if (in.equals(out)){
//输入和输出匹配
//判断是否超时
long endTime=System.currentTimeMillis();
//获取当前等级限制时间
int timeLimit=nowLevel.getPerTimeLimit();
//转换单位为:秒
player.setElapsedTime((int)(endTime-player.getStartTime())/1000);
if (player.getElapsedTime()<=timeLimit){
//没有超时
//获取当前等级答对一次所获得的积分
int perScore=nowLevel.getPerScore();
//增加积分(获取当前积分,加上每一次答对的积分)
player.setCurrScore(player.getCurrScore()+perScore);
System.out.println("输入正确,当前级别:" + player.getLevelNo() + ",您的积分:" + player.getCurrScore() + ",已经用时:" + player.getElapsedTime());
//是否通过当前关卡
//当前等级答对的总积分(总分=当前等级答对一次的积分*当前等级答对多少次才能通过的次数)
int sumScore=nowLevel.getPerScore()*nowLevel.getInputTimes();
//等级大于等于level的长度并且当前的分数大于当前等级的总分
if (player.getLevelNo()>=LevelUtils.levels.length&&player.getCurrScore()>=sumScore){
//通关
System.out.println("恭喜你,已经成为绝世高手,成功通关!");
//正常退出程序
System.exit(0);
}
}else {
//超时
System.out.println("您输入太慢了,已经超时,程序退出!");
//退出程序(非正常退出,状态为:1)
System.exit(1);
}
}else {
//输入错误
System.out.println("输入错误,游戏退出!");
//退出程序(非正常退出,状态为:1)
System.exit(1);
}
}
//玩家属性的get和set方法
public Player getPlayer() {
return player;
}
public void setPlayer(Player player) {
this.player = player;
}
}
玩家输入的字符串,与电脑随机产生的字符串进行匹配(printResult)
玩家属性的get和set方法
level类
属性:
级别号(levelNo)
不同等级的字符串长度(strLength)
不同等级输入字符串的次数(inputTimes)
不同级别的时间限制( perTimeLimit)
不同等级答对一次得分(perScore)
方法:
带参数的构造方法(用于LevelUtils)
以上属性get和set方法
代码如下:
public class Level {
//等级号
private int levelNo;
//每个等级的字符串长度
private int strLength;
//每个等级输入字符串的次数
private int inputTimes;
//每个等级的限制时间
private int perTimeLimit;
//当前等级答对一次得分
private int perScore;
//带参数的构造方法
public Level(int levelNo, int strLength, int inputTimes, int perTimeLimit, int perScore) {
this.levelNo = levelNo;
this.strLength = strLength;
this.inputTimes = inputTimes;
this.perTimeLimit = perTimeLimit;
this.perScore = perScore;
}
//game属性的get和set方法
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public int getStrLength() {
return strLength;
}
public void setStrLength(int strLength) {
this.strLength = strLength;
}
public int getInputTimes() {
return inputTimes;
}
public void setInputTimes(int inputTimes) {
this.inputTimes = inputTimes;
}
public int getPerTimeLimit() {
return perTimeLimit;
}
public void setPerTimeLimit(int perTimeLimit) {
this.perTimeLimit = perTimeLimit;
}
public int getPerScore() {
return perScore;
}
public void setPerScore(int perScore) {
this.perScore = perScore;
}
}
levelutils类
主要功能是存放,不同等级的等级号、该等级字符串的长度、该等级回答题的次数、该等级的限制时间、答对一次所获取的分数。
代码如下:
public class LevelUtils {
//设置等级列表
public static final Level[] levels={
//从左到右的参数,依次是等级号、该等级字符串的长度、该等级回答题的次数、该等级的限制时间、答对一次所获取的分数
new Level(1,3,6,40,2),
new Level(2,4,6,35,3),
new Level(3,5,7,30,4),
new Level(4,6,7,25,5),
new Level(5,7,8,25,6),
new Level(6,8,8,20,7)
};
}