文章目录
任务描述
需求概述
-
根据输入速率和正确率将玩家分为不同级别
-
级别越高,一次显示的字符数越多,玩家正确输入- -次 的得分也越高
-
规定时间内完成规定次数的输入,正确率达到规定要求, 则升级
玩家最高级别为6级、初始级别一-律为1级 -
用户错误输入- -次,游戏结束
发现类的属性
- 玩家类 (Player)的属性
● 玩家当前级别号(levelNo)
● 玩家当前级别积分(currScore)
● 当前级别开始时间(startTime)
● 当前级别已用时间(elapsedTime) - 游戏类(Game)
- 级别类(Level)的属性
● 各级别号(levelNo)
● 各级别一次输出字符串的长度(strLength)
● 各级别输出字符串的次数(strTimes)
● 各级别闯关的时间限制(timeLimit)
● 各级别正确输入一次的得分(perScore)
发现类的方法
- 玩家类(Player) 的方法
■ 玩游戏play() - 游戏类(Game)的方法
■ String printStr()
输出字符串,返回字符串用于和玩家输入比较
■void printResult(String out,String in)
比较游戏输出out和玩家输入in,根据比较结果输出相应信息
优化设计
- 修改游戏类(Game),,添加属性
玩家: Player - 添加类:L evelParam
public final static Level level[6]
主要功能分析
-
游戏输出字符串
■生成字符串、输出字符串、返回字符串
■生成长度固定但内容随机的字符串 -
确认输入并输出结果
■输入
正确、未超时
■输出
当前级别、当前积分、已用时间
■计算玩家的当前级别、当前积分和已用时间 -
玩游戏
■6个级 别循环实现
■每次晋级后积分清零、计时清零
界面交互设计
玩家输入正确与输入超时界面
玩家输入错误界面
技术分析
- 技术实现中需要考虑的问题
需要哪些类,每个类有哪些职责
采用哪些技术
命名规范
需求说明
用例01:在控制台输出随机字符串
思路分析
- 生成字符串
- 输出字符串
- 返回字符串
难点提示
- Game类中的player属性, 代表玩家,查询player的级别号, 根据级别号到L evelParam类中获取该级别的字符串长度
- 字符串长度固定可以通过for循环来实现,而随机内容可以通 过获取随机数,而不同随机数对应不同字符来实现
参考代码
Random random = new Random();
//通过循环生成要输出的字符串
for (inti= 0;i< strLength; i++) {
int rand = random.nextlnt(strLength);//产生随机数
//根据随机数拼接字符串
switch (rand) {
case 0:
buffer.append(">");
break;
case 1:
buffer.append("<");
break;..}}
用例02:确认用户输入并输出结果
思路分析
- 确认玩家输入是否正确
- 如果输入不正确,则直接输出错误信息并退出程序
- 如果输入正确
●如果超时,则直接输出错误信息并退出程序.
●如果没有超时
计算玩家当前积分
计算玩家已用时间
输出玩家当前级别、当前积分、已用时间 - 判断用户是否已经闯过最后一关并处理
参考代码
用例03:玩家玩游戏
思路分析
- 创建Game对象并传入player属性
- 外层循环 (循环次数是6,每循环-次玩家级别升级)
■晋级
■积分清零、计时清零
■内层循环(环次数是该级别的strTime,每循环-次完成一次人机交互)
●游戏输出字符串
●玩家输入字符串
●游戏判断玩家输入并输出相应结果
用例04:初始化各个级别具体参数
需求说明
- 游戏开始之前初始化各个级别的具体参数信息
如各级别号
各级别一次输出字符串的长度
各级别输出字符串的次数
各级别闯关的时间限制
各级别正确输入一次的得分
难点提示
使用static修饰属性和代码块
- static属性
属于这个类所有
通过“对象名.static属性名”、“类名.static属性名”访问 - static方法
通过“类名.static方法名”和“对象名.static方法名”访问 - static代码块
主要作用是实现static属性的初始化
当类被载入的时候执行它,且只被执行一次
参考代码:
//此项目会涉及到6个级别(每个级别是一个对象),所以先创建一个长度为6,类型为Level的数组,这个数组可以声明为静态常量值
public final static Level levels[] = new Level[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,18,8);
levels[4] = new Level(5,6,6,15,10);
levels[5] = new Level(6,7,5,12,15);
}
技能总结
- 面向对象设计的思想
- 使用类图理解类的关系
- 类的封装
- 构造方法的使用
- this、static关键字的使用
编写思路
先编写级别类Level
(1)定义属性:
private int levelNo; // 级别号
private int strLength; // 各级别一次输出字符串的长度
private int strTimes; // 各级别输出字符串的次数
private int timeLimit; // 各级别闯关的时间限制
private int perScore; // 各级别成功输入一次字符串后增加的分值
(2)添加包含所有参数的有参构造方法(无参构造方法后面不需要使用,可以不添加)
(3)针对封装好的属性,添加getXxx()方法,不需要添加setXxx()方法(针对级别的属性是系统规定好的,不需要用户设置)
编写级别参数类LevelParam
(1)此项目会涉及到6个级别(每个级别是一个对象),所以先创建一个长度为6,类型为Level的数组,这个数组可以声明为静态常量值
(2)使用有参构造方法创建6个Level类对象,并将这6个对象存储到第一步创建的数组中,可以将这个操作生命在静态代码块中
创建Play玩家类
- 定义属性
private int levelNo; // 级别号
private int curScore; // 当前积分
private long startTime = 0; // 各级别开始时间
private int elapsedTime; // 各级别已用时间
- 添加无参构造方法、有参构造方法、getXxx()/setXxx()方法
- 定义玩家玩游戏的方法play()
功能:用户由默认0级升级到1级,开始玩游戏(调用Game类里的printStr()方法和printResult())
创建游戏类Game
- 定义属性
private Player player;// 玩家
- 添加无参构造方法、有参构造方法
- 定义方法printStr()
功能:根据用户级别输出指定长度的字符串(字符串的内容是随机产生的) - 定义方法printResult()
功能:判断用户输入的字符串与系统随机产生的字符串内容是否相同
1)如果用户输入的字符串与系统产生的字符串相同:
–》用户输入字符串的时间>对应级别需要的时间:超时,退出游戏系统
–》用户输入字符串的时间<对应级别需要的时间:
计算用户完游戏的时间
用户玩游戏积累的积分
输出当前用户所处的级别,玩游戏时间、积累的积分
计算该游戏最后一个级别的总分并判断用户是否到达第六级别以及积累的积分是否等于最高级别的积分,如果满足,输出闯关成功
2)如果用户输入的字符串与系统产生的字符串相同:
直接退出游戏系统
定义测试类
在main()方法中创建Play类对象,调用play()方法,开始游戏
债见
System.out.println(“明天见!这个项目的代码后期我可能会发出来,如果没发,请私聊我。”)