项目需求:游戏等级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. CSS3学习(CSS3过渡、CSS3动画)

    CSS3过渡:transition属性--专门应对颜色.长度.宽度.位置等变化的过渡 通过CSS3,我们可以在不使用Flash和JavaScript的情况下,为当前某元素从某样式改变为某样式的时候添加 ...

  2. PBAP 1.0协议翻译(Part1)

    添加vCard3.0 Spec的链接- http://tools.ietf.org/html/rfc2425- http://tools.ietf.org/html/rfc2426 寻找最新的Spec ...

  3. HBase HDFS目录树

    一.0.94-cdh4.2.1版本系统级别的一级目录如下,用户自定义的均在这个/hbase 下的一级子目录下/hbase/-ROOT-/hbase/.META./hbase/.archive/hbas ...

  4. nodejs爬虫

    前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGL ...

  5. struts ActionContext ThreadLocal

    public class ActionContext implements Serializable The ActionContext is the context in which an Acti ...

  6. Qt 动画快速入门(一)

    Qt-4.6动画Animation快速入门三字决 Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序.不必像以前的版本一样,所有的控件都枯燥的呆在伟 ...

  7. Linq&Lumbda

    var y = from model in list.Where(s=>s.product==product||product=="")                    ...

  8. Maven实战(三)Eclipse构建Maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  9. JQuery 可见性过滤选择器

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. C++经典编程题#1:含k个3的数

    总时间限制:  1000ms 内存限制:  65536kB 描述 输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除, ...