在此之前已经学过了面向对象的三大特性,即封装,继承,多态,学习了接口的应用,下面是完成的一个游戏项目,这个QuickHit游戏考验的是你的键盘输入速度和准确性,根据输入速度和正确率将玩家分为不同的等级,级别越高一次显示的字符串就越多,玩家正确输入一次的得分也就越高,如果玩家在规定的时间内完成规定的次数,正确率达到规定的要求,那么玩家升级,玩家级别最高为六级,初始级别为一级。
根据要求我们可以分析出这个项目所需要的类,玩游戏就一定要有玩家和游戏这两个类,那么我们可以先抽象出这两个类,同时一次显示的字符数,正确输入的得分,规定的时间,次数,都是与玩家的等级有关,那么我们就可以再抽象出一个级别类,
我们分析得出结论,玩家的属性有当前的级别,级别号,级别积分,开始的时间,已用的时间,
级别类的属性有各个级别的级别号,各级别一次输入字符串的长度,各级别输入的次数,闯关的时间,得分
游戏类的方法主要有:输出字符串,确认玩家输入是否正确,和输出的相应信息。
玩家类的方法只有一个,那就是玩游戏
级别类主要是存放信息,没有具体的操作
QuickHit 项目的执行步骤描述如下:
(1) 游戏根据玩家的级别在控制台输出指定数量字符。
(2) 玩家根据控制台输出输入相同字符,按 Enter 键确认。
(3) 游戏确认玩家输入是否正确。
(4) 如果输入错误,输出玩家输入错误提示,游戏非正常结束。
(5) 如果输入正确但超时,输出玩家速度太慢提示,游戏非正常结束。
(6) 如果输入正确且没有超时,输出玩家的积分、级别和用时信息。然后重复以上步骤,
继续输出、输入和确认。
(7) 玩家在规定时间内连续正确输入规定次数后,将显示玩家升级提示,游戏将重新计
时计分,将以此输出更多字符。六级玩家闯关成功,输出恭喜信息。游戏正常结束。
class Player{
{//玩家类
private int levelNo;
//级别号
private long startTime;
//游戏开始的时间
private int score;
//积分
private long elapseTime;
//每级别游戏持续的时间
public void setLevelNo(int levelNo){
//设置器
this.levelNo = levelNo;
}
public void setScore(int score){
this.score = score;
}
public void setStartTime(long time){
this.startTime = time;
}
public void setElapseTime(long elapse){
this.elapseTime = elapse;
}
public int getLevelNo(){
//访问器
return this.levelNo;
}
public int getScore(){
return this.score;
}
public long getStartTime(){
return this.startTime;
}
public long getElapseTime(){
return this.elapse;
}
//玩家的方法
public void play(){
Game game = new Game(this);
Scanner input = new Scanner(System.in);
//创建对象
//这里注意的是开始游戏需要循环。而外层循环是所有的游戏级别,内循环是每个级别对应的次数
for (int i = 0; i < LevelInitial.levelsArr.length; i++){
levelNo +=1;
//每执行一次外层循环,代表玩家通过了一个级别,级别就要+1.晋级
startTime = System.currentTimeMillis();
//获取新的开始时间,每个级别单独记分数,
for (int j = 0; j <LevelInitial.levelsArr[levelNo -1].getStrTime(); j++){
String out = game.printStr();
//这里生成字符串
String in = input.next();
//玩家输入的字符串
game.result(out,in);
}
}
class Game
{
//游戏类
private Player player;
//这里需要一个玩家
public Game(Play player){
//提供一个玩家作为 参数的构造方法
this.player = player;
//要玩游戏。首先要给游戏一个玩家对象,才能创建这个游戏对象
}
public String printStr(){
int levelNo = player.getLevelNo() -1;
//获取玩家等级
int strlen = LevelInitial.levelsArr[levelNo].getStrlength();
//获取到当前的玩家等级下对应的字符串长度
Random random = new Random();
//创建一个随机数的对象
StringBuffer buffer = new StringBuffer();
//创建一个StringBuffer对象,用来不断地存储和改变字符串的内容
for (int i = 0; i < strlen; i++){
//用循环加上判断的方式,生成对应的长度的字符串
int rand = random.nextInt(strlen);
//每循环一次就产生一个随机数
swich(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;
case 6:
buffer.append("@");
break;
}
}
System.out.println("buffer");
//给用户已经生成好的字符串
return buffer.toString();
//返回这个已经做好的字符串
}
public void result(String out, String in){
if (out.equals(in)){
long currentTime = System.currentTimeMillis();
if ((currentTime - play.getStartTime())/ 1000 <= LevelInitial.levelsArr[player.getLevelNo() -1].getTimeLimit()){
//获取到开始游戏的时间戳
int newScore = player.getScore()+ LevelInitial.levelsArr[player.getLevelNo() -1].getPerScore();
//计算分数
player.setScore(newScore);
//设置给玩家
long time = (currentTime - player.getStartTime())/ 1000;
//计算已经用的时间
player.setElapseTime(time);
System.out.println("输入正确,您的等级是: " + player.getLevelNo() + ", 您的积分是:" + player.getScore() + ", 您的用时为:" + player.getElapseTime() + "秒");
if (player.getLevelNo == 6){
int sum = 0;
for (int j = 0; j<LevelInitial.levelsArr.length; j++){
int currentScore;
}
if (player.getScore() == sum){
System.out.println("恭喜你全部通关");
System.out.println(0);
}
}
}else{
System.out.println("输入正确,但是时间超时。游戏结束,游戏推出");
System.out.println("1");
}
{
System.out.println("输入错误,游戏结束。游戏退出");
System.out.println(1);
}
class Level
{
//级别类
private int levelNo;
private int strlength;
private int timeLimit;
private int strTime;
private int perScore;
public Level(int levelNo, int strlength, int timeLimit, int strTime, int perScore){
this.levelNo = levelNo;
this.strlength = strlength;
this.timeLimit = timeLimit;
this.perScore = perScore;
this.strTime = strTime;
}
public int getLevelNum(){
//每个级别对象代表一个级别,需要获取这个值
return this.levelNo;
}
public int getTimeLimit(){
return this.timeLimit;
}
public int getStrTime(){
return this.strTime;
}
public int getStrlength(){
return this.strlength;
}
public int getPerScore(){
return this.perScore;
}
class LevelInitial {
//这个类是用来进行每个级别对象的初始化
public static Level[] levelsArr = new Level[6];
//把所有的等级放入到数组里,
//静态初始化块
static {
levelsArr[0] = new Level(1, 2, 30, 5, 1);
levelsArr[1] = new Level(2, 3, 25, 4, 2);
levelsArr[2] = new Level(3, 4, 22, 3, 5);
levelsArr[3] = new Level(4, 5, 20, 3, 8);
levelsArr[4] = new Level(5, 6, 18, 3, 10);
levelsArr[5] = new Level(6, 7, 15, 3, 15);
}
}
class Test
{
//测试类
public static void main(String[] args){
//创建玩家玩游戏
Player p = new Player();
p.play()
}
}