项目二:实现简单的金山打字通

该博客介绍了一个基于Java实现的游戏程序,玩家通过输入速度和正确率被分配到不同级别。游戏包含玩家类、游戏类和级别类,每个类都有相应的属性。玩家在限定时间内完成指定次数的输入并达到正确率要求即可升级。游戏还包含一个打印接口和异常处理类,确保程序的正常运行。最后,提供了一个测试类用于验证游戏流程。
摘要由CSDN通过智能技术生成

1、需求概述

根据输入速率和正确率将玩家分为不同级别

级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高

规定时间内完成规定次数的输入,正确率达到规定要求,则升级

l玩家最高级别为6级、初始级别一律为1级用户错误输入一次,游戏结束

2根据需求,可以分为玩家(Player)类,游戏类(Game);级别(Level)类

3类的属性

玩家类(Player)的属性                 

玩家当前的级别号(levelNo)

玩家当前级别的分数(Score)

玩家级别开始时间(startTime)

玩家已使用时间(usedTime)

玩家总用时常(totalTime)

级别类(Level)的属性

级别号(levelNo)

每次输入字符串的长度(strLength)

输入字符串的次数(typeCnt)

闯关的时间限制 (lvlTime)

每次打字的积分(perScore)

4、实现程序的运行

玩家类(Player)

public class Player{
      String name;
      int lvlNo=1;
      long startTime=System.currentTimeMillis();
      long usedTime;
      long totalUsedTime;
      int scores=0;
       public void play(){
       Game g=new Game();
       g.run(p.this);
}
}

级别类(Level)

public class Level{
    int lvlNo;
    int typeCnt;
    int strLength;
    int lvlTime;
    int perScore;
     public Level(int lvlNo,int typeCnt,int strLength,int lvlTime,int perScore){
         this.lvlNo=lvlNo;
         this.typeCnt=typeCnt;
         this.strLength=strLength;
         this.lvlTime=lvlTime;
         this.perScore=perScore;
}
}

游戏类(Games)

public class Game implements Printer {

   private Scanner input = new Scanner(System.in);
    public final Level[] LEVELS = {
            new Level(1, 1, 2, 20,1),
            new Level(2, 1, 3, 30, 2),
            new Level(3, 2, 4, 40, 3),
            new Level(4, 3, 5, 50, 4),
            new Level(5, 3, 5, 60, 5),
            new Level(6, 3, 6, 70, 6)

    };
   public String print(int levelNo){ //生成级别字符串
       int length =LEVELS[levelNo-1].strLength;
       String rst="";
       char[] c =new char[length];
       for(int i=0;i<c.length;i++)
        //每次都是全小写字母(97-122)和全大写字母(65-90)
            int chose = (int) (Math.random() * 2);
            c[i]=(char)(Math.random()*26+(chose==0?65:97));
   }
        rst = new String(c);
        return rst;
    }
 //每一轮的比较方法
    public void round(Player p) {
        Level level = LEVELS[p.lvlNo - 1];
        System.out.println(p.name + ",当前级别:" + level.lvlNo + ",要输入" + level.typeCnt
                + "次,每次长度时:" + level.strLength + ",时常限时" + level.lvlTime
                + "秒,当前积分为:" + p.scores);
        for (int i = 0; i < level.typeCnt; i++) {
            String s=print(p.lvlNo);
            System.out.println("请输入:" + s);
            String in = input.next();
            long now = System.currentTimeMillis();
            if (!s.equals(in)) {
                throw new GameErrException("输入错误,退出游戏");
            }
            long used = (now - p.startTime) / 1000;
            p.usedTime = used;
            if (used > level.lvlTime) {
                throw new GameErrException("输入超时,退出游戏!");
            }
            p.scores += level.perScore;
        }
        long left = level.lvlTime - p.usedTime;
        p.scores += left * level.perScore;
        p.totalUsedTime+=p.usedTime;
        System.out.println("恭喜升级,当前等级已用时常"+p.usedTime);
        System.out.println("获得额外的附加分:"+left*level.perScore);
}
    //    public static void main(String[] args) {
//        Player p=new Player();
//        p.name="";
//        Game g=new Game();
//        g.round(p);
//    }
  public void run(Player p) {
        if (p == null) {
            p = new Player();
            System.out.print("欢迎新用户");

        }
        if (p.name == null) {
            p = new Player();
            System.out.print("请输入您的姓名:");
            p.name = input.next();
        }
        System.out.println("尊敬的"+p.name+"游戏已经开始了,请准备!");
        do {//控制升级过程
            round(p);
            p.lvlNo++;
        }while (p.lvlNo<=LEVELS.length);// lvlNo<=6
        System.out.println("恭喜"+p.name+"选手通关!您的总积分为:"+p.scores+",总时常"+
                p.totalUsedTime);
    }

//    public static void main(String[] args) {
//        Game g=new Game();
//        Player p=null;
//        g.run(p);
//    }


}

5、游戏类应用一个打印方法,可以用接口来实现

public interface Printer {
    String print(int a);
}

6、测试类遇到问题需要抛出,所有建一个抛出异常类

public class GameErrException extends RuntimeException {
    public GameErrException(String message) {
        super(message);
    }
}

7、测试类

public class GameZone {
    public static void main(String[] args) {
        Player p=new Player();
        p.name="大力水手";
        try {
            Game g = new Game();
            p.play();
        }catch (GameErrException e){
            System.out.println(e.getMessage());

        }finally {
            System.out.println(p.name+"您最终的积分为:"+p.scores);
        }
    }
}

8、运行结果

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yy64ll826

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值