Java案例——控制台实现QuickHit小游戏

一、需求概述

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

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

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

4.玩家最高级别为6级、初始级别一律为1级

5.用户错误输入一次,游戏结束

二、发现类

1.玩家(Player)类

属性:

(1)玩家当前级别号(levelNo

(2)玩家当前级别积分(currScore

(3)当前级别开始时间(startTime

(4)当前级别已用时间(elapsedTime

方法:

玩游戏play()

2.游戏(Game)类

方法:

(1)String printStr() :输出字符串,返回字符串用于和玩家输入比较

(2)void printResult(String out,String in) :比较游戏输出out和玩家输入in,根据比较结果输出相应信息

3.级别(Level)类

属性:

(1)各级别号(levelNo

(2)各级别一次输出字符串的长度(strLength

(3)各级别输出字符串的次数(strTimes

(4)各级别闯关的时间限制(timeLimit

(5)各级别正确输入一次的得分(perScore

三、优化设计

1.修改游戏类(Game),添加属性

玩家: Player

2.添加类: LevelParam

public final static Level level[6]

四、主要功能分析

1.游戏输出字符串

(1)生成字符串、输出字符串、返回字符串

(2)生成长度固定但内容随机的字符串

2.确认输入并输出结果

(1)输入 :正确、未超时 ;输出: 当前级别、当前积分、已用时间

(3)计算玩家的当前级别、当前积分和已用时间

3.玩游戏

(1)6个级别循环实现

(2)每次晋级后积分清零、计时清零

玩家类:Player类

import java.util.Scanner;


public class Player {

	private int levelNo; // 级别号
	private int curScore; // 当前积分
	private long startTime = 0; // 各级别开始时间
	private int elapsedTime; // 各级别已用时间

	//Getters/Setters方法
	public int getLevelNo() {
		return levelNo;
	}

	public void setLevelNo(int levelNo) {
		this.levelNo = levelNo;
	}

	public int getCurScore() {
		return curScore;
	}

	public void setCurScore(int curScore) {
		this.curScore = curScore;
	}

	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 sc = new Scanner(System.in);
		// 外层循环,循环一次级别晋一级
		for (int i = 0; i < LevelParam.levels.length; i++) {
			// 1、 晋级
			this.levelNo += 1;
			// 2、 晋级后计时清零,积分清零
			this.startTime = System.currentTimeMillis();
			this.curScore = 0;
			// 3、 内层循环,循环一次完成一次字符串的输出、输入、比较
			for (int j = 0; j < LevelParam.levels[levelNo - 1].getstrTimes(); j++) {
				// 3.1、游戏输出字符串
				String outStr = game.printStr();
				// 3.2、接收用户输入
				String inStr = sc.next();
				// 3.3、游戏判断玩家输入是否正确,并输出相应结果信息
				game.printResult(outStr, inStr);
			}
		}

		sc.close();
	}
}

游戏类:Game类

import java.util.Random;


public class Game {
	private Player player;// 玩家

	/**
	 * 无参构造方法
	 */
	public Game() {
		super();
	}

	/**
	 * 有参构造方法,传入玩家信息。
	 * 
	 * @param player
	 *            玩家
	 */
	public Game(Player player) {
		this.player = player;
	}

	/**
	 * 输出指定级别规定长度的字符串。
	 * 
	 * @return 输出的字符串,用于和用户输入比较
	 */
	public String printStr() {
		int strLength = LevelParam.levels[player.getLevelNo() - 1].getStrLength();
		StringBuffer buffer = new StringBuffer();
		Random random = new Random();
		// 1、通过循环生成要输出的字符串
		for (int i = 0; i < strLength; i++) {
			// 1.1、产生随机数
			int rand = random.nextInt(strLength);
			// 1.2、根据随机数拼接字符串
			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;
			}
		}
		// 2、输出字符串
		System.out.println(buffer);
		// 3、返回字符串用于和玩家输入相比较
		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;
		}
		// 1、 如果输入正确
		if (flag) {
			long currentTime = System.currentTimeMillis();
			// 1.1、 如果超时
			if ((currentTime - player.getStartTime()) / 1000 > LevelParam.levels[player.getLevelNo() - 1]
					.getTimeLimit()) {
				System.out.println("你输入太慢了,已经超时,退出!");
				System.exit(1);
				// 1.2、 如果没有超时
			} else {
				// 1.2.1、 计算当前积分
				player.setCurScore(player.getCurScore() + LevelParam.levels[player.getLevelNo() - 1].getPerScore());
				// 1.2.2、 计算已用时间
				player.setElapsedTime((int) ((currentTime - player.getStartTime()) / 1000));
				// 1.2.3、输出当前积分、当前级别、已用时间
				System.out.println("输入正确,您的级别" + player.getLevelNo() + " ,您的积分" + player.getCurScore() + ",已用时间"
						+ player.getElapsedTime() + "秒。");
				// 1.2.4、判断用户是否已经闯过最后一关
				if (player.getLevelNo() == 6) {
					int score = LevelParam.levels[player.getLevelNo() - 1].getPerScore()
							* LevelParam.levels[player.getLevelNo() - 1].getstrTimes();// 计算闯关分数
					if (player.getCurScore() == score) {
						System.out.println("你已闯关成功,成为绝世高手,恭喜你!!!");
						System.exit(0);
					}
				}
			}
			// 2、如果输入错误
		} else {
			System.out.println("输入错误,退出!");
			System.exit(1);
		}
	}
}

级别类:Level类

public class Level {
	private int levelNo; // 级别号
	private int strLength; // 各级别一次输出字符串的长度
	private int strTimes; // 各级别输出字符串的次数
	private int timeLimit; // 各级别闯关的时间限制
	private int perScore; // 各级别成功输入一次字符串后增加的分值

	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 int getLevelNo() {
		return levelNo;
	}

	public int getStrLength() {
		return strLength;
	}

	public int getstrTimes() {
		return strTimes;
	}

	public int getTimeLimit() {
		return timeLimit;
	}

	public int getPerScore() {
		return perScore;
	}
}

LevelParam类:级别参数类,配置各个级别参数。

public class LevelParam {
	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);
	}
}

测试类:

public class Test {

	public static void main(String[] args) {

		Player player = new Player();
		player.play();
	}
}

结果:

 

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

豪仔思密达

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

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

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

打赏作者

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

抵扣说明:

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

余额充值