需求:QuickHit游戏考验你键盘输入的速度和准确性。 根据输入速度和正确率将玩家分为不同级别,级别越高,一次显示的字符数就越多,玩家 正确输入一次的得分也越高。如果玩家在规定时间内完成规定次数的输入,正确率达到 规定要求,则玩家升级(为了简单起见,规定用户错误输入一次,游戏结束)。玩家最 高级别为六级,初始级别一律为一级。
分析:需要游戏(Game)类、玩家(Player)类、等级(Level)类、测试(Test)类
优化设计,增加一个等级数组(LevelParam)类
游戏类的属性有:玩家类型的玩家(Player player)方法有:系统生成一个String类型的字符串(printStr() String)、判断玩家输入的字符串跟系统生成的字符串是否相同(printResult() void)
玩家类的属性有:int类型的等级(int levelNo)、int类型的积分(int curScore)、
long类型的游戏开始时间(long startTime)、long类型的每个级别玩游戏的时间(long elapsedTime)方法有:玩游戏(play())
等级类的属性有:int类型的等级(int levelNo)、int类型的字符串长度(int strlength)、long类型的限制时间(long timeLimit)、int类型的玩的次数(int strTime)、int类型的所得分数(int getScore)
等级数组类的属性有:等级类型的数组(levels【6】 Level)
注意:如果刚学完面向对象的三个特性:封装、继承、多态的话,这里有两个知识点还没学到,一是时间搓System.currentTimeMillis(),这表示的是当前你的电脑上的时间到1970年1月1日0点0分的毫秒数,二是System.exit(0)这表示的是程序正常退出,如果括号中写的是一个非0数则表示程序异常退出。
代码的实现:
import java.util.*;
class Game
{
private Player player;
//创建玩家
public void setPlayer(Player player){
this.player = player;
}
//生成对应玩家等级的字符串
public String printStr(){
//创建一个StringBuffer对象,用来对字符串进行增删改查
StringBuffer buffer = new StringBuffer();
//创建随机数对象
Random random = new Random();
//循环生成对应玩家等级长度的字符串
for (int i = 0;i < LevelParam.levels[player.getLevelNo() - 1].getStrlength();i++ )
{
//每次循环就产生一个随机数
int rand = random.nextInt(5);
//拼接产生随机数所对应的字符串
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.toString());
//返回生成的字符串
return buffer.toString();
}
//对比系统生成的字符串和玩家输入的字符串是否一样
public void printResult(String out,String in){
//判断结果是否一致
if (out.equals(in))
{
long time = System.currentTimeMillis();
//结果一致再判断时间是否超时
if ((time - player.getStartTime())/1000 <= LevelParam.levels[player.getLevelNo() -1].getTimeLimit())
{
player.setCurScore(player.getCurScore() + LevelParam.levels[player.getLevelNo() -1].getGetScore());
player.setElapsedTime((time - player.getStartTime())/1000);
System.out.println("输入正确,您当前等级为:" + player.getLevelNo() + ",积分为:" + player.getCurScore() + ",用时为:" + player.getElapsedTime() + "秒。");
//判断玩家是否通关
if (player.getLevelNo() == 6 && player.getCurScore() == LevelParam.levels[player.getLevelNo()-1].getGetScore() * LevelParam.levels[player.getLevelNo()-1].getStrTime() )
{
System.out.println("恭喜您已全部通关!");
System.exit(0);
}
}else{
System.out.println("您的输入已超时,游戏结束!");
System.exit(2);
}
}else{
System.out.println("您输入有误,游戏结束!");
System.exit(2);
}
}
}
import java.util.*;
class Player
{
//等级
private int levelNo;
//每个等级玩家过关所获得的积分
private int curScore;
//游戏开始的时间
private long startTime;
//每个级别玩游戏的时间
private long elapsedTime;
void setLevelNo(int levelNo){
this.levelNo = levelNo;
}
int getLevelNo(){
return levelNo;
}
void setCurScore(int curScore){
this.curScore = curScore;
}
int getCurScore(){
return curScore;
}
void setElapsedTime(long elapsedTime){
this.elapsedTime = elapsedTime;
}
long getElapsedTime(){
return elapsedTime;
}
void setStartTime(long startTime){
this.startTime = startTime;
}
long getStartTime(){
return startTime;
}
void play(){
Game game = new Game();
game.setPlayer(this);
Scanner scanner = new Scanner(System.in);
//外层循环代表着等级
for (int i = 0;i < LevelParam.levels.length ;i++ )
{
//玩家晋级
levelNo += 1;
//获得新的游戏开始时间
startTime = System.currentTimeMillis();
//每次晋级玩家积分清零
curScore = 0;
//内层循环代表着每个级别所需要玩的次数
for (int j = 0;j < LevelParam.levels[i].getStrTime() ;j++ )
{
//系统生成的字符串
String out = game.printStr();
//玩家输入的字符串
String in = scanner.next();
//比较,产生结果
game.printResult(out,in);
}
}
}
}
class Level
{
//级别
private int levelNo;
//字符串长度
private int strlength;
//限制的时间
private long timeLimit;
//级别所要玩的次数
private int strTime;
//级别过一关所得分数
private int getScore;
//每个级别,应该是一来是就规定好这些 游戏初始的内容,所以不提供setter
public Level(int levelNo,int strlength,long timeLimit,int strTime,int getScore){
this.levelNo = levelNo;
this.strlength = strlength;
this.timeLimit = timeLimit;
this.strTime = strTime;
this.getScore = getScore;
}
public int getLevelNo(){
return levelNo;
}
public int getStrlength(){
return strlength;
}
public long getTimeLimit(){
return timeLimit;
}
public int getStrTime(){
return strTime;
}
public int getGetScore(){
return getScore;
}
}
public class LevelParam
{
//定义一个数组长度为6,类型为Level,名字为levels的数组
//把所有等级放入到数组
public static Level[] levels = new Level[6];
//静态初始化块
//在加载类的时候执行静态初始化块,并且只会被执行一次
static {
levels[0] = new Level(1,1,30,10,1);
levels[1] = new Level(2,2,28,7,2);
levels[2] = new Level(3,3,25,6,3);
levels[3] = new Level(4,4,21,4,5);
levels[4] = new Level(5,5,20,3,8);
levels[5] = new Level(6,6,15,3,10);
}
}
class Test
{
public static void main(String[] args)
{
Player player = new Player();
player.play();
}
}