在此之前已经学过了面向对象的三大特性,即封装,继承,多态,学习了接口的应用,下面是完成的一个游戏项目,这个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() } }