QuickHit游戏
Posted 나 는 당신
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QuickHit游戏相关的知识,希望对你有一定的参考价值。
一 项目需求
根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见,规定用户只要错误输出一次,则游戏结束).玩家最高级别为6级,初始级别一律为一级.
项目所覆盖的知识点:
①面向对象设计的思想.
②使用类图理解类的关系
③类的封装
④构造方法的使用
⑤this和static关键字的使用
运行效果图:
玩家输入正确的界面
玩家输入错误的界面
玩家输入超时的界面
二 问题分析
1.需要使用到的类
游戏类(Game),玩家类(Player),和级别类(Level)
2.发现类的属性:
玩家(Player)类:玩家当前级别(levelNo),玩家当前级别积分(currScore),当前级别开始时间(StartTime),当前级别已用时间(elapsedTime)
级别(Level)类:个级别编号(levelNo),个级别一次输出字符串的长度(strLength),个级别输出字符串的次数(strTime),个级别闯关的时间限制(timeLimit)和各级别正确输入一次的得分(perScore).
Game(游戏)类:在游戏类中要添加一个玩家的属性player
3.发现类的方法:
玩家类(Player)的方法:play();
游戏类(Game)的方法:
String printStr(),输出字符串,返回字符串用于和玩家的输入进行比较。
void printResult(String out,String in)比较输出out和玩家输入in
三 项目实现功能
Player类
package cn.quickhit; 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.level.length; i++) { //晋级 this.levelNo+=1; //晋级后计时清零,积分清零 this.startTime=System.currentTimeMillis(); this.currScore=0; if(this.levelNo==6) { System.out.println("恭喜通关"); break; } //内层循环,循环一次完成一次字符串的输出,输入,比较 for (int j = 0; j < Levelparam.level[levelNo-1].getStrTimes(); j++) { //游戏输出字符串 String outstr=game.printstr(); //接受用户输入 String instr=input.next(); //游戏判断玩家输入是否正确,并输出相应结果信息 game.printResult(outstr, instr); } } } }
Game类
package cn.quickhit; import java.util.Random; /* * 游戏类 */ public class Game { public Player player;//代表玩家 public Game(Player player) { this.player = player; } /** * 生成字符串 */ public String printstr() { //获取级别对应的要输出字符串的长度 int strLength = Levelparam.level[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); } /** * 如果输入正确则会出现两种情况 01.如果超时,则直接输出错误信息并退出程序 02.如果没有超时: 计算玩家当前积分 计算玩家已用时间 * 输出玩家当前级别,当前积分和已用时间 判断用户是否已经闯过最后一关 * */ if(flag){ long currentTime=System.currentTimeMillis(); //如果超时 if((currentTime-player.getStartTime())/1000>Levelparam.level[player.getLevelNo()-1].getTimeLimit()) { System.out.println("您输入太慢了,已经超时,退出"); System.exit(1); } //如果没有超时 else{ //计算玩家当前积分 player.setCurrScore(player.getCurrScore()+Levelparam.level[player.getLevelNo()-1].getPerScore()); //计算玩家已用时间 player.setElapsedTime((int)(currentTime-player.getStartTime())/1000); //输出玩家当前级别,当前积分和已用时间 System.out.println("输入正确,您的级别:"+player.levelNo+"您的积分:"+player.currScore+"已用时间:"+player.elapsedTime+"秒"); } } } }
Level类
package cn.quickhit; /* * 级别类 */ public class Level { public int levelNo; // 级别号 public int strLength;// 各级别一次输出字符串的长度 public int strTimes;// 各级别输出字符串的次数 public int timeLimit;// 各级别闯关的时间限制 public int perScore;// 各级别成功输入一次字符串后增加的分值 public Level() { } 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(int levelNo, int strLength, int strTimes, int timeLimit, int perScore) { this.levelNo = levelNo; this.strLength = strLength; this.strTimes = strTimes; this.timeLimit = timeLimit; this.perScore = perScore; } }
LevelParam类
package cn.quickhit; /* * 级别类 */ public class Level { public int levelNo; // 级别号 public int strLength;// 各级别一次输出字符串的长度 public int strTimes;// 各级别输出字符串的次数 public int timeLimit;// 各级别闯关的时间限制 public int perScore;// 各级别成功输入一次字符串后增加的分值 public Level() { } 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(int levelNo, int strLength, int strTimes, int timeLimit, int perScore) { this.levelNo = levelNo; this.strLength = strLength; this.strTimes = strTimes; this.timeLimit = timeLimit; this.perScore = perScore; } }
Test类
package cn.quickhit; public class Test { /** * @param args * 测试类 */ public static void main(String[] args) { //实例化玩家对象 Player player=new Player(); //调用玩家玩游戏的方法 player.play(); } }
以上是关于QuickHit游戏的主要内容,如果未能解决你的问题,请参考以下文章