一 、项目需求 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定
一 、项目需求
根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见,规定用户只要错误输出一次,则游戏结束).玩家最高级别为6级,初始级别一律为一级.
二、项目所覆盖的知识点:
①面向对象设计的思想.
②使用类图理解类的关系
③类的封装
④构造方法的使用
⑤this和static关键字的使用
运行效果图:
<<<<
输入正确,您的级别:1您的积分:1已用时间:2秒
<>
<>
输入正确,您的级别:1您的积分:2已用时间:5秒
<>
<>
输入正确,您的级别:1您的积分:3已用时间:6秒
><
><
输入正确,您的级别:1您的积分:4已用时间:8秒
<>
<>
输入正确,您的级别:1您的积分:5已用时间:10秒
<<
<<
输入正确,您的级别:1您的积分:6已用时间:11秒
>*>
>*>
输入正确,您的级别:2您的积分:2已用时间:5秒
*<<
*<<
输入正确,您的级别:2您的积分:4已用时间:8秒
***
***
输入正确,您的级别:2您的积分:6已用时间:10秒
>*>
>*>
输入正确,您的级别:2您的积分:8已用时间:17秒
<>>
<>>
输入正确,您的级别:2您的积分:10已用时间:19秒
><>
><>
输入正确,您的级别:2您的积分:12已用时间:23秒
>#>*
>#>*
输入正确,您的级别:3您的积分:5已用时间:5秒
<<>>
<<>>
输入正确,您的级别:3您的积分:10已用时间:10秒
>*><
>*><
输入正确,您的级别:3您的积分:15已用时间:16秒
<*#*
<*#*
输入正确,您的级别:3您的积分:20已用时间:21秒
<<<#
<<<#
你输入太慢了,已经超时,退出。
玩家类
在玩家类中要用到currentTimeMillis()方法
public static long currentTimeMillis()
* 返回以毫秒为单位的当前时间。
* 注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。
* 例如,许多操作系统以几十毫秒为单位测量时间。
返回值:
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
import java.util.Scanner;
public class Player {
public int levelNo; // 级别号
public int currScore; // 当前积分
public long startTime; // 各级别开始时间
public int elapsedTime; // 各级别已用时间
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;
}
// 玩家玩游戏的方法
public void play() {
// 调用游戏类带参数的构造传入玩家对象
Game game = new Game(this);
Scanner input = new Scanner(System.in);
// 外层循环,循环一次级别晋级
for (int i = 0; i < LevelParam.levels.length; i++) {
// 晋级
this.levelNo += 1;
// 晋级后计时清零
//currentTimeMillis
this.startTime = System.currentTimeMillis();
this.currScore = 0;
if (this.levelNo == 6) {
System.out.println("恭喜过关!");
break;
}
// 内层循环,循环一次完成一次字符串的输入输出比较
for (int j = 0; j < LevelParam.levels.length; j++) {
// 输出游戏字符串
String outstr = game.printStr();
// 接受玩家输入
String instr = input.next();
// 游戏判断玩家输入是否正确
game.printResult(outstr, instr);
}
}
}
游戏类
import java.util.Random;public class Game {
public Player player;
public Game(Player player2) {
// TODO Auto-generated constructor stub
this.player = player2;
}
public String printStr() {
int strLength = LevelParam.levels[player.getLevelNo() - 1]
.getStrLength();
StringBuffer buffer = new StringBuffer();
Random random = new Random();
// 通过循环生成要输出的字符串
for (int i = 0; i < strLength; i++) {
// 产生随机数
int rand = random.nextInt(strLength);
// 根据随机数拼接字符串
switch (rand) {
case 0:
buffer.append(">");
break;
case 1:
buffer.append("<");
break;
case 2:
buffer.append("*");
break;
case 3:
buffer.append("#");
break;
case 4:
buffer.append("&");
break;
case 5:
buffer.append("%");
break;
}
}
// 输出字符串
System.out.println(buffer);
// 返回该字符串的值,用于比较
return buffer.toString();
}
// 系统给的字符串与玩家输入的字符串进行对比
// out 系统输出的字符串
// in 玩家输入的字符串
public void printResult(String out, String in) {
boolean flag = false;
if (out.equals(in)) {
// 系统输出与玩家输入一致
flag = true;
} else {
System.out.println("输入错误,退出。");
System.exit(0);
}
/**
* 如果输入正确: 1.若超时,退出 2.若不超时,计算玩家时间、积分,输出玩家当前级别、积分、已用时间 并判断是否闯关成功
*/
if (flag) {
long currentTime = System.currentTimeMillis();
// 如果超时
if ((currentTime - player.getStartTime()) / 1000 > LevelParam.levels[player
.getLevelNo() - 1].getTimeLimit()) {
System.out.println("你输入太慢了,已经超时,退出。");
System.exit(1);
}else{
//计算玩家已用时间
player.setElapsedTime((int)(currentTime-player.getStartTime()) / 1000);
// 计算玩家当前积分
player.setCurrScore(player.getCurrScore()
+ LevelParam.levels[player.getLevelNo() - 1]
.getPerScore());
//输出玩家当前级别,当前积分和已用时间
System.out.println("输入正确,您的级别:"+player.levelNo+"您的积分:"+player.currScore+"已用时间:"+player.elapsedTime+"秒");
}
}
}
}
等级类
public class Level {// 各级别号
private int levelno;
// 各级别一次输出字符串的长度
private int strLength;
// 各级别输出字符串的次数
private int strTimes;
// 各级别闯关时间的限制
private int timeLimit;
// 各级别一次输入正确的得分
private int perScore;
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 getStrTimes() {
return strTimes;
}
public void setStrTimes(int strTimes) {
this.strTimes = strTimes;
}
public int getTimeLimit() {
return timeLimit;
}
public void setTimeLimit(int timeLimit) {
this.timeLimit = timeLimit;
}
public int getPerScore() {
return perScore;
}
public void setPerScore(int perScore) {
this.perScore = perScore;
}
public Level() {
super();
// TODO Auto-generated constructor stub
}
public Level(int levelno, int strLength, int strTimes, int timeLimit,) {
super();
this.levelno = levelno;
this.strLength = strLength;
this.strTimes = strTimes;
this.timeLimit = timeLimit;
this.perScore = perScore;
}
}
级别
//代码块
}
见 java.面向对象.static关键字
public class LevelParam {//创建数组对应六个级别
public final static Level levels[] = new Level[6];
static{
levels[0] = new Level(1,2,10,30,1);
levels[1] = new Level(2,3,9,26,2);
levels[2] = new Level(3,4,8,22,5);
levels[3] = new Level(4,5,7,18,8);
levels[4] = new Level(5,6,6,15,10);
levels[5] = new Level(6,7,5,12,15);
}
}
测试类
public class Test {public static void main(String[]) {
//实例化玩家对象
Player player=new Player();
//调用玩家玩游戏的方法
player.play();
}
}