1.游戏的要求:
根据输出的随机字符,输入对应的字符进行判断.正确进入下一关,级别、字符数量,积分随之升高,错误则直接结束.注:每升一级,时间归零重新开始计时,且运用面向对象思想。
2.实现思路:
第一步:创建 游戏类(a),各级别的公共类(b),各级别的数据常量类(c),玩游戏类(d),最终测试类(e)。
第二步:在b类中声明私有变量:级别号、字符串长度、字符串次数、闯关时间限制、输入正确的的积分.完成后对其进行构造及get(获取)和set(设置)。
第三步:在c类中声明一个存储常量且长度为6的数组(因为共有6级)。创建好后用静态修饰符向数组中添加数据(该数组为b类的对象数组实例化)。
第四步:在d类中声明私有变量:当前级别号、当前级别积分、开始时间、已用时间。声明好后对其进行构造及get(获取)和set(设置).最后创建玩游戏的方法。
第五步:在a类中声明私有的类型是d类的变量F,并构造。
编写逻辑,大致分为三步:
1.通过构造方法将d类传进a类的变量F。
2.输出字符串。获取级别号、把a类和d类的级别统一。生成随机字符输出并返回
3.输入字符比较并判断。双层判断,第一层判断输入是否正确:不正确游戏结束,正确进入第二 层、第二层判断输入时间是否超时:超时游戏结束,没超时就计算总积分和所用时间然后返回 级别、所用时间、总积分.
第六步:在e类中创建d类对象实例并调用。
3.效果展示:
1.Game游戏类
2.Level级别类
3.LevelParam级别常量数据类
4.Player玩游戏类
5.Test测试类
6.最终运行效果
4.代码:
1.Game
package com.ytzl.Quick;
import java.util.Random;
public class Game {
private Player player;
/**
* 通过构造方法,传入玩家信息
* @param player
*
* */
public Game(Player player) {
this.player = player;
}
/**
* 输出字符串
* @return 字符串用于和玩家输入比较
* */
public String printStr(){
//从创建好的player对象中获取级别号
//因为我们需要将Game中和player中的两个方法对应的级别统一
int strLength = LevelParam.levels[player.getLevelNo()-1].getStrLength();
//随机
Random random = new Random();
//操作字符串
StringBuffer buffer = new StringBuffer();
// buffer.append()字符串的连接
for (int i = 0; i < strLength; i++) {
//生成随机数
int rand = random.nextInt(3);
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;
default:
buffer.append("?");
break;
}
}
System.out.println(buffer.toString());
return buffer.toString();
}
/**
* 根据比较结果输出相应信息
* @param out 游戏输出字符
* @param in 玩家输入字符
* */
public void printResult(String out,String in){
boolean flag;
if (out.equals(in)){
flag = true;
}else {
flag = false;
}
//第一层:是否输入正确
if (flag){
//第二层:是否超时
//currentTime :输入正确之后拿到的时间
long currentTime = System.currentTimeMillis();
if ((currentTime-player.getStartTime())/1000>LevelParam.levels[player.getLevelNo()-1].getTimeLimit()){
System.out.println("已超时!游戏结束!");
System.exit(1);
}else {
//没有超时
//计算当前积分
//当前积分+各级别给的积分
player.setCurrScore(player.getCurrScore()+LevelParam.levels[player.getLevelNo()-1].getPetScore());
//当前所用时间 用每一次输入正确之后的时间减去初始进入游戏的时间
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].getStrTimes() *
LevelParam.levels[player.getLevelNo()-1].getPetScore();
System.out.println("闯关成功!");
System.out.println("总积分为:"+score);
System.exit(1);
}
}
}else {
System.out.println("输入错误!退出");
System.exit(1);
}
}
}
2.Level
package com.ytzl.Quick;
public class Level {
private int levelNo;//各级别号
private int strLength;//各级别输入字符串的长度
private int strTimes;//各级输出字符串的次数
private int timeLimit;//各级闯关时间限制
private int petScore;//各级输入正确得分
public Level() {
}
public Level(int levelNo, int strLength, int strTimes, int timeLimit, int petScore) {
this.levelNo = levelNo;
this.strLength = strLength;
this.strTimes = strTimes;
this.timeLimit = timeLimit;
this.petScore = petScore;
}
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public int getStrLength() {
return strLength;
}
public void setStrLength(int strLength) {
this.strLength = strLength;
}
public int getStrTimes() {
return strTimes;
}
public void setStrTimes(int strTimes) {
this.strTimes = strTimes;
}
public int getTimeLimit() {
return timeLimit;
}
public void setTimeLimit(int timeLimit) {
this.timeLimit = timeLimit;
}
public int getPetScore() {
return petScore;
}
public void setPetScore(int petScore) {
this.petScore = petScore;
}
}
3.LevelParam
package com.ytzl.Quick;
public class LevelParam {
//final : 最终的 无法再改变 可以修饰非抽象类
//用final修饰的变量 我们叫做常量 表示:值一旦给定就无法改变
//static: 静态变量
//直接可以通过 类名.静态方法 类名.静态变量
//所以用final和static 一起修饰的变量就是全局变量
//表示:值一旦给定就无法改变 并且可以通过类名调用
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,35,2);
levels[2] = new Level(3,4,8,40,4);
levels[3] = new Level(4,5,7,45,6);
levels[4] = new Level(5,6,6,50,8);
levels[5] = new Level(6,7,5,55,10);
}
}
4.Player
package com.ytzl.Quick;
import java.util.Scanner;
public class Player {
private int levelNo;//当前级别号
private int currScore;//当前级别积分
private Long startTime;//开始时间
private int elapsedTime;//已用时间
public Player() {
}
public Player(int levelNo, int currScore, Long startTime, int elapsedTime) {
this.levelNo = levelNo;
this.currScore = currScore;
this.startTime = startTime;
this.elapsedTime = elapsedTime;
}
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public int getCurrScore() {
return currScore;
}
public void setCurrScore(int currScore) {
this.currScore = currScore;
}
public Long getStartTime() {
return startTime;
}
public void setStartTime(Long startTime) {
this.startTime = startTime;
}
public int getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(int elapsedTime) {
this.elapsedTime = elapsedTime;
}
//玩游戏
public void play(){
Game game = new Game(this);
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < LevelParam.levels.length; i++) {
//晋级
this.levelNo += 1;
//2.时间开始计时
this.startTime = System.currentTimeMillis();
//3.积分清零
this.currScore = 0;
//4.内层循环 循环的是电脑输出,玩家输入,比较
for (int j = 0; j < LevelParam.levels[levelNo - 1].getStrTimes(); j++) {
//4.1电脑输出字符串
String out = game.printStr();
//4.2接收用户输入
String in = scanner.next();
//4.3比较,并判断结果
game.printResult(out,in);
}
}
}
}
5.Test
package com.ytzl.Quick;
public class Test {
public static void main(String[] args) {
Player player = new Player();
player.play();
}
}