项目需求:游戏等级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项目分析的更多相关文章

  1. 【QuickHit项目实例】

    关于java面向对象QuickHit项目实例 Game类:用来得到随机出现的字符串(随机打印的字符串,然后玩家进行输入字符串) public class Game { private String s ...

  2. iOS项目分析及优化

    iOS项目分析及优化  来源:吴白的简书   从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...

  3. QuickHit游戏

    一 项目需求 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见 ...

  4. 项目分析_xxoo-master

    项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化 项目分析:主要分为是三个部分 1.容器类:AbstractContainer         存储x ...

  5. 第五章项目:QuickHit

    需求概述: 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见, ...

  6. 05章项目: QuickHit快速击键

    一.项目分析 根据输入速率和正确率将玩家分为不同等级,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级.玩家最高级别 ...

  7. JavaOOP 试题

    1) 以下属于OOP的特征有().   a)继承   b)封装   c)多态   d)隐藏   2) JavaOOP中的多态包括()   a) 方法重写 b) 方法重载   c) 方法隐藏 d) 以上 ...

  8. Quickhit快速击键

    一.项目分析 根据输入速率和正确率将玩家分为不同等级,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级.玩家最高级别 ...

  9. 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码

    原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程 ...

随机推荐

  1. QOS

    QoS控制原理 · 基于设备的QoS保障技术——CAC· 基于优先级设置的QoS保障技术· 基于减小抖动的QoS保障-Jitter BufferIP传输在时延.抖动.丢包率方面的性能不及TDM传输,而 ...

  2. 转 创建 JavaScript XML 文档注释

    http://www.cnblogs.com/chenxizhang/archive/2009/07/12/1522058.html 如何:创建 JavaScript XML 文档注释 Visual ...

  3. 【Android测试】【第三节】ADB——源码浅谈

    ◆版权声明:本文出自carter_dream的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4651724.html 前言 由于本人精力 ...

  4. 用户控件UserControl图片资源定位(一)---Xaml引用图片

    MEF编程实现巧妙灵活松耦合组件化编程,一些细节需要花费不小心思去处理: 其中组件中若包含用户控件,且需要访问图片资源,那么Xaml引用资源需要做以下设置 1. 用户控件(usercontrol)所在 ...

  5. Tinyxml的简单应用

    参考文章: 1-> http://www.cnblogs.com/phinecos/archive/2008/03/11/1100912.html 2-> http://blog.csdn ...

  6. 史上最用心的iOS App上架流程【转】

    转:http://www.jianshu.com/p/16fa56eacb5e 题记 麻痹起来嗨!看网上那么多的教程,依然在我心爱的爱屁屁在上架的时候遇到各种 J8 问题,最大的问题就是:Xcode ...

  7. TortoiseGit 的使用

    日常用法 (1) 创建新库 在文件夹中按右键, 选择Git Create repository here 就可以创建库了. 在出现的窗口中, 不勾选选项, 直接按OK 在目录中就会出现一个名为.git ...

  8. iOS腾讯百度面试题

  9. Xcode编译WebApps找不到js的错误解决办法<转>

    使用Xcode做WebApps时,使用UIWebview来调用一个页面,有时会遇到问题,其一就是编译的时候出现黄色感叹号的Warning,js文件都报错:warning: no rule to pro ...

  10. PLSQL 的简单命令之四

    -- 子查询 -- in 等于表中的任意一个 select * from Stu where id in (select id from scores) -- 和子查询返回结果中的某一个值比较成立即可 ...