JavaOOP QuickHit项目分析
项目需求:游戏等级6级,随机字符串每级长度不同。每升一级减少比较次数,但是字符串长度相应增加!每级总分数不同,如果游戏中途输入错误则游戏退出!玩家每次在规定时间内输入字符串的同时,打印出游戏难度等级、当年难度下的游戏积分、输出用时。
根据需求抽象出三个类:Game、Player、Level.
Level类:
public class Level {
private int levelNo;// 各级别编号 private int strLength;// 各级别一次输出字符串的长度
private int strTimes;// 各级别输出字符串的次数 private int timeLimit;// 各级别闯关的时间限制
private int perScore;// 各级别正确输入一次的得分
//此处省略封装字段的Setter和Getter访问器
//Level的带参构造函数
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;
}
}
定义一个辅助类里面放一个静态数组程序编译时自动在内存级别赋值
public class LevelParam {
public final static Level[] levels=new Level[6];//对应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,17,8);
levels[4]=new Level(5,6,6,15,10);
levels[5]=new Level(6,7,5,12,15);
}
}
Game类:
private Player player; // 玩家省略Setter、Getter
定义一个方法用来:输出指定级别规定长度的字符串。
public String printStr() {
int strLength = LevelParam.levels[player.getLevelNo() - 1].getStrLength(); //游戏等级编号-1=此等级在数组里的下标(也就定位到此等级本身了)
StringBuffer buffer=new StringBuffer(); //StringBuffer每次修改字符串本身,效率比String要高。
Random ran=new Random();
for (int i = 0; i < strLength; i++) { //按照指定级别的规定字符串长度本身循环
int rand=ran.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;
default:
break;
}
}
//输出字符串
System.out.println(buffer);
//返回字符串用于和玩家输入相比较
return buffer.toString();
}
定义一个比较字符串输出结果的方法:
public void printResult(String out, String in) { //out为输出字符串、int为用户输入字符串
boolean flag;
if(out.equals(in)){
flag=true;
}else{
flag=false;
}
//1.如果输入正确
if(flag){
long currentTime=System.currentTimeMillis(); //System.currentTimeMillis()获得自1970-01-01 00:00:00.000到当前系统时刻的时间距离,以毫秒为单位
//如果超时
if((currentTime-player.getStartTime())/1000>LevelParam.levels[player.getLevelNo()-1].getTimeLimit()){//输入时间/1000为妙,大于规定时间
System.out.println("你输入太慢了,已经超时,退出!");
System.exit(1);
/**
* 这个方法是用来结束当前正在运行总的java虚拟机
* 如果status是非零参数,那么表示是非正常退出。
* System.exit(0)是将你的整个虚拟机里德内容都停掉了,而
* dispose()只是关闭这个窗口,但是并没有停止整个application
* exit().无论如何,内容都释放了!也就是说连JVM都关闭了,
* 内存里根本不可能还有东西!System.exit(status)不管status为何值
* 都会退出程序。和return相比有以下不同点:return是回到上一层,
* 而System.exit(status)是回到最上层
* System.exit(1)一般放在case块中,表示这个程序是非正常退出
*/
}else{
//计算当前积分
player.setCurrScore(player.getCurrScore()+LevelParam.levels[player.getLevelNo()-1].getPerScore());
//计算已用时间
player.setElapsedTime((int)((currentTime-player.getStartTime())/1000));
//输出当前积分、当前级别、已用时间
System.out.println("输入正确,您的级别"+player.getLevelNo()+",您的积分"+player.getCurrScore()+",已用时间"+player.getElapsedTime()+"秒。");
//判断用户是否已经闯过最后一关
if(player.getLevelNo()==6){
//计算闯关分数
int score=LevelParam.levels[player.getLevelNo()-1].getPerScore()*LevelParam.levels[player.getLevelNo()-1].getStrTimes();
if(player.getCurrScore()==score){
System.out.println("你已闯关成功,成为绝世高手,恭喜你!!!");
System.exit(0);
}
}
}
}else{//如果输入错误
System.out.println("输入错误,退出!");
System.exit(1);
}
}
Player类:
private int levelNo;// 当前级别号
private int currScore;// 当前级别积分
private long startTime=0;// 当前级别开始时间
private int elapsedTime;// 当前级别已用时间
//省略封装字段
定义一个玩游戏的方法
public void play(){
Game game=new Game(this); //直接把当前player类当参数传进游戏的构造函数里
Scanner input=new Scanner(System.in);
//外层循环,循环一次,级别升一级
for (int i= 0; i < LevelParam.levels.length; i++) {
//升级
this.levelNo+=1;
//升级后计时清零,积分清零
this.startTime=System.currentTimeMillis();
this.currScore=0;
//内层循环,循环一次完成一次字符串的输出、输入、比较
for (int j = 0; j < LevelParam.levels[levelNo-1].getStrTimes(); j++) {
//游戏输出字符串
String out=game.printStr();
//接收用户输入
String in=input.next();
//游戏判断玩家输入是否正确,并输出相应结果信息
game.printResult(out, in);
}
}
}
测试类New 出一个玩家.Player就OK了,整个项目完成!
JavaOOP QuickHit项目分析的更多相关文章
- 【QuickHit项目实例】
关于java面向对象QuickHit项目实例 Game类:用来得到随机出现的字符串(随机打印的字符串,然后玩家进行输入字符串) public class Game { private String s ...
- iOS项目分析及优化
iOS项目分析及优化 来源:吴白的简书 从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...
- QuickHit游戏
一 项目需求 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见 ...
- 项目分析_xxoo-master
项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化 项目分析:主要分为是三个部分 1.容器类:AbstractContainer 存储x ...
- 第五章项目:QuickHit
需求概述: 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见, ...
- 05章项目: QuickHit快速击键
一.项目分析 根据输入速率和正确率将玩家分为不同等级,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级.玩家最高级别 ...
- JavaOOP 试题
1) 以下属于OOP的特征有(). a)继承 b)封装 c)多态 d)隐藏 2) JavaOOP中的多态包括() a) 方法重写 b) 方法重载 c) 方法隐藏 d) 以上 ...
- Quickhit快速击键
一.项目分析 根据输入速率和正确率将玩家分为不同等级,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级.玩家最高级别 ...
- 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程 ...
随机推荐
- [Virtualization][SDN] 讲的很好的SDN软件定义网络视频课程
51CTO的免费课程,开始以为是扯蛋的,后来看了一下,讲的很好.注册一下,免费的. 只看了导论,挺好的. http://edu.51cto.com/course/course_id-4466.html
- 解决微软的两个恶心问题(VS2008死机、Win2008 WAS无法启动)
1.Visual Studio 2008,在切换到Web设计界面或Html Markup界面时,过一段时间就出现假死,点击任何地方没反应,也关闭不了,只能用任务管理器结束任务. 上网查了下,应该是先装 ...
- 【C51】单片机独立按键与矩阵按键
独立按键 首先既然是检测输入,对于当然要用到拉电阻,来检测引脚电平变化变化.51单片机中,除了P0口外,P2,P3,P4都是内置上拉电阻的准双向IO口,一般 的 51 P0引脚都外接了上拉电阻,当然也 ...
- 详解 Qt 线程间共享数据(用信号槽方式)
使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...
- 利用 libiconv 实现汉字编码 utf-8 格式 和 gbk格式的相互转换
参考文章:http://jimmee.iteye.com/blog/2174693 关于windows上编译libiconv的库,请参见:http://www.cnblogs.com/tangxin- ...
- oracle常用的SQL语句
一些常用的SQL语句: --建表 create table adolph (id number(10,0), name varchar2(20), ...
- Wordpress引入多说插件
多说为Wordpress制作了插件,按照以下步骤,快速让你的网站迅速使用多说! 1.下载插件:https://wordpress.org/plugins/duoshuo/ 或在WordPress后台“ ...
- TestNG学习-001-基础理论知识
此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...
- Oracle一个实例配置多个监听
要想给一个Oracle实例配置多个监听,首先要定义多个监听器,因为是多个监听,势必会有一些监听端口不是1521. 现在服务端的listener.ora文件中定义如下监听器: LISTENER = (D ...
- Change Tracking of SQLServer
1.Enable the change tracking at the database level. ALTER DATABASE AdventureWorks2008 SET CHANGE_TRA ...