小游戏面向对象
一,问题分析
计算机输出字符串,玩家根据计算输出的内容重复输入,如果输入正确,进入一下关的练习
该过程记录玩家的积分,定义游戏的关卡,定义游戏的规则
1.1定义游戏的规则
游戏的关卡 1关
每关字符串的长度 如果是2个长度
每关字符串出现的次数 5次 ab cd ef de er
每关时间限制 20s时间
每输入正确一次的积分 10个积分 玩5次,如果我通关 可以获取 50个积分
抽象关卡的类Level
属性:第几关,字符串长度,次数,时间限制(s),积分
属性:levelNo,strLength,strTimes,timeLimit,score,
1.2游戏数据的初始化
规定游戏到底有多少关 加入我有6关,使用对象数组存储每一个关卡数据
Level[] levels = new Levles[]{
new Levle(levelNo,strLength,strTimes,timeLimit,score)
....
}
关卡数据的具体化
第1关:new Levle(1,1,7,15,1)
第2关:new Levle(2,2,6,14,3)
第3关:new Levle(3,3,5,13,5)
第4关:new Levle(4,4,4,12,7)
第5关:new Levle(5,5,2,10,9)
1.3游戏玩家的定义类 player
属性:级别,积分, 开始游戏,(通关数),剩余时间
玩家的级别是1级 》》 通关第一关》 游戏玩家的级别自然升入第二级
1.4游戏类 Game
属性 Player player
方法:/**
* @param 字符的长度
* @return 自动随机产生的字符串
*/
public String AutomaticProducecString(int strLength)
方法: /**功能:字符串的匹配
*
* @param in 目标字符串
* @param out 玩家输入的字符串
*/
public void match(String in,String out)
打印结果(计算输出字符,玩家输入字符)
如果(计算输出字符=玩家输入字符)
计算时间是否超时((获取系统时间 - 玩家的开始时间) > 关卡的限定时间) 超时退出程序
计算剩余时间 关卡的限定时间 - (获取系统时间 - 玩家的开始时间)
计算积分 玩家的积分 + 当前关卡定义的积分
打印结果
否则
给出提示信息
退出程序
/**
* 游戏的玩法
*
*/
public void play()
循环所有的关卡
级别 = 1
积分 = 0
开始游戏 = 获取系统时间
循环每一关的次数数据 (第一次循环,获取第一关卡的数据)
计算输出字符 Game.输出字符()
玩家输入字符
计算匹配字符 Game.打印结果(计算输出字符,玩家输入字符)
循环结束后判断是否已经通关
玩家的级别是否是最一关,玩家的积分= 游戏定义的该关卡玩的次数*每次获取的积分
1.5测试类TestGame4
/**
* 测试打印出所有关卡的数据
*/
public void printAllLevelData()
/**
* 测试自动产生的随机字符串
*/
public void testAutomaticProducecString()
/**
* 测试玩法
*/
public void testPlay()
二,代码结构
2.1关卡Level类:
主要用于存储关卡的基本数据
主要成员有:
//第几关
private int levelNum;
//字符的长度
private int strLength;
//玩几次
private int gameNum;
//当前关卡的时间限制
private int timeLimit;
//当前关卡当前等级的积分
private int score;
2.2关卡集合LevelData类
关卡数初始化对象,用于存储每一关卡的信息
主要成员有:
static Level levels[]=null;
2.3玩家Player类
用于存储每个玩家的信息
主要成员有:
//级别
private int level;
//积分
private int score;
//开始游戏时间(秒)
private long startTime;
//剩余时间
private int leftTime;
2.4玩家Player类
游戏处理对象,用于游戏玩法过程的处理
主要成员有:
//游戏玩家
private Player player;
2.5测试TestGame4类
用于代码功能的调试
主要成员有:
无
三,完整源代码
Level类的代码
package com.kp;
/**@author Fiee
@version 创建时间:2019年6月25日 下午2:22:08
*/
public class Level {
/**
* 关卡对象
*/
//第几关
private int levelNum;
//字符的长度
private int strLength;
//玩几次
private int gameNum;
//当前关卡的时间限制
private int timeLimit;
//当前关卡当前等级的积分
private int score;
public int getLevelNum() {
return levelNum;
}
public void setLevelNum(int levelNum) {
this.levelNum = levelNum;
}
public int getStrLength() {
return strLength;
}
public void setStrLength(int strLength) {
this.strLength = strLength;
}
public int getGameNum() {
return gameNum;
}
public void setGameNum(int gameNum) {
this.gameNum = gameNum;
}
public int getTimeLimit() {
return timeLimit;
}
public void setTimeLimit(int timeLimit) {
this.timeLimit = timeLimit;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public Level(int levelNum, int strLength, int gameNum, int timeLimit, int score) {
super();
this.levelNum = levelNum;
this.strLength = strLength;
this.gameNum = gameNum;
this.timeLimit = timeLimit;
this.score = score;
}
public Level() {
super();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[ 当前的关卡是:"+this.levelNum+"当前的字符长度是:"+this.strLength
+"当前玩的次数是:"+this.gameNum+"当前关卡的时间限制是:"+this.timeLimit
+"当前的关卡的每次积分获得是:"+this.score+"]";
}
}
LevelData类的代码
package com.kp;
/**@author Fiee
@version 创建时间:2019年6月25日 下午2:40:30
*/
public class LevelData {
/**
* 关卡数初始化对象,用于存储每一关卡的信息
*/
static Level levels[]=null;
static {
levels=new Level[]{
//属性:第几关,字符串长度,次数,时间限制(s),积分
new Level(1,1,7,30,1),
new Level(2,2,6,26,3),
new Level(3,3,5,24,5),
new Level(4,4,4,22,7),
new Level(5,5,2,20,9)
};
}
}
Player类的代码
package com.kp;
/**@author Fiee
@version 创建时间:2019年6月25日 下午2:33:42
*/
public class Player {
/**
* 玩家对象
*/
//级别
private int level;
//积分
private int score;
//开始游戏时间(秒)
private long startTime;
//剩余时间
private int leftTime;
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public int getLeftTime() {
return leftTime;
}
public void setLeftTime(int leftTime) {
this.leftTime = leftTime;
}
public Player(int level, int score, int startTime, int leftTime) {
super();
this.level = level;
this.score = score;
this.startTime = startTime;
this.leftTime = leftTime;
}
public Player() {
super();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "["+"当前玩家等级:"+this.leftTime+"当前玩家积分:"+this.score
+"当前玩家游戏的开始时间是:"+this.startTime+"当前玩家剩余的时间是:"+this.leftTime+"]";
}
}
GameL类的代码
package com.kp;
import java.util.Random;
import java.util.Scanner;
/**@author Fiee
@version 创建时间:2019年6月25日 下午2:53:01
*/
public class Game {
/**
* 游戏处理对象,用于游戏玩法过程的处理
*/
//游戏玩家
private Player player;
public Player getPlayer() {
return player;
}
public void setPlayer(Player player) {
this.player = player;
}
public Game(Player player) {
super();
this.player = player;
}
public Game() {
super();
}
/**
* @param 字符的长度
* @return 自动随机产生的字符串
*/
public String AutomaticProducecString(int strLength)
{
StringBuffer str=new StringBuffer();
//随机数的候选字符串
String select="abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ0"
+ "123456789!@#$%^&*()-=+";
Random random=new Random();
for (int i = 0; i < strLength; i++) {
int index=random.nextInt(select.length());
str.append(select.substring(index, index+1));
}
return str.toString();
}
/**功能:字符串的匹配
*
* @param in 目标字符串
* @param out 玩家输入的字符串
*/
public void match(String in,String out)
{
//匹配随机生成的字符数传是否和玩家输入的一致
if (in.equals(out)) {
//计算是否超时
long currentTime=System.currentTimeMillis()/1000;//系统当前的时间
long startTime=player.getStartTime();//玩家开始玩的时间
//当前关卡限定的时间
int limitTime=LevelData.levels[player.getLevel()-1].getTimeLimit();
//计算时间是否超时((获取系统时间 - 玩家的开始时间) > 关卡的限定时间)
if ((currentTime-startTime)>limitTime) {
System.out.println("关卡:"+player.getLevel()+" 未在限定时间"+limitTime+"秒内完成,游戏超时!");
System.exit(0);
}
else
{
//计算玩家剩余时间
player.setLeftTime((int)((limitTime-(currentTime-startTime))));
//计算玩家当前关卡的积分
//当前关卡限定的积分
int score=LevelData.levels[player.getLevel()-1].getScore();
player.setScore(player.getScore()+score);
System.out.println("等级:"+player.getLevel()+" 积分:"+player.getScore()+" 剩余时间:"+player.getLeftTime());
}
}
else
{
System.out.println("目标字符项:"+in+" 与玩家输入项:"+out+"匹配失败,退出游戏!");
System.out.println("玩家最终情况是:等级 "+player.getLevel()+" 积分 "+player.getScore());
System.exit(0);
}
}
/**
* 游戏的玩法
*
*/
public void play()
{
//玩的关卡数
for (int i = 0; i < LevelData.levels.length; i++) {
//每一关玩的次数
/**
* 每通一小关,等级加1,积分清零,积分只会记录下当前关数的积分,不会记录总的累积的分数
*/
player.setLevel(i+1);
player.setScore(0);
player.setStartTime(System.currentTimeMillis()/1000);
for (int j = 0; j < LevelData.levels[i].getGameNum(); j++) {
//每次闯关的过程
String in=AutomaticProducecString(LevelData.levels[i].getStrLength());
System.out.println("目标字符项是:"+in);
//System.out.print("请输入匹配的目标字符项:");
//Scanner read=new Scanner(System.in);
//String out=read.next();
System.out.println("请输入匹配的目标字符项:"+in);
match(in, in);
}
}
/**
* 循环完后判断通关情况
*/
//最后一关的关卡
Level lastlevel = LevelData.levels[LevelData.levels.length-1];
if (player.getScore()==lastlevel.getScore()*lastlevel.getGameNum()) {
System.out.println("恭喜你,成功通关!");
}
}
}
TestGame4的代码
package com.kp;
/**@author Fiee
@version 创建时间:2019年6月25日 下午2:47:26
*/
public class TestGame4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TestGame4 t=new TestGame4();
//t.printAllLevelData();
//t.testAutomaticProducecString();
t.testPlay();
}
/**
* 测试打印出所有关卡的数据
*/
public void printAllLevelData()
{
Level[] levels = LevelData.levels;
for (int i = 0; i < levels.length; i++) {
System.out.println(levels[i].toString());
}
}
/**
* 测试自动产生的随机字符串
*/
public void testAutomaticProducecString()
{
Game game=new Game();
String randomData=game.AutomaticProducecString(3);
System.out.println("随机数是:"+randomData);
}
/**
* 测试玩法
*/
public void testPlay()
{
Player player=new Player();
Game game=new Game(player);
game.play();
}
}
四,运行结果
结果一
目标字符项是:G
请输入匹配的目标字符项:G
等级:1 积分:1 剩余时间:30
目标字符项是:M
请输入匹配的目标字符项:M
等级:1 积分:2 剩余时间:30
目标字符项是:n
请输入匹配的目标字符项:n
等级:1 积分:3 剩余时间:30
目标字符项是:@
请输入匹配的目标字符项:@
等级:1 积分:4 剩余时间:30
目标字符项是:h
请输入匹配的目标字符项:h
等级:1 积分:5 剩余时间:30
目标字符项是:N
请输入匹配的目标字符项:N
等级:1 积分:6 剩余时间:30
目标字符项是:y
请输入匹配的目标字符项:y
等级:1 积分:7 剩余时间:30
目标字符项是:rw
请输入匹配的目标字符项:rw
等级:2 积分:3 剩余时间:26
目标字符项是:M3
请输入匹配的目标字符项:M3
等级:2 积分:6 剩余时间:26
目标字符项是:3=
请输入匹配的目标字符项:3=
等级:2 积分:9 剩余时间:26
目标字符项是:%Y
请输入匹配的目标字符项:%Y
等级:2 积分:12 剩余时间:26
目标字符项是:w5
请输入匹配的目标字符项:w5
等级:2 积分:15 剩余时间:26
目标字符项是:aR
请输入匹配的目标字符项:aR
等级:2 积分:18 剩余时间:26
目标字符项是:C+Y
请输入匹配的目标字符项:C+Y
等级:3 积分:5 剩余时间:24
目标字符项是:G41
请输入匹配的目标字符项:G41
等级:3 积分:10 剩余时间:24
目标字符项是:$jy
请输入匹配的目标字符项:$jy
等级:3 积分:15 剩余时间:24
目标字符项是:R+z
请输入匹配的目标字符项:R+z
等级:3 积分:20 剩余时间:24
目标字符项是:!o&
请输入匹配的目标字符项:!o&
等级:3 积分:25 剩余时间:24
目标字符项是:i$8^
请输入匹配的目标字符项:i$8^
等级:4 积分:7 剩余时间:22
目标字符项是:N2bp
请输入匹配的目标字符项:N2bp
等级:4 积分:14 剩余时间:22
目标字符项是:qfJf
请输入匹配的目标字符项:qfJf
等级:4 积分:21 剩余时间:22
目标字符项是:-iX3
请输入匹配的目标字符项:-iX3
等级:4 积分:28 剩余时间:22
目标字符项是:piHa9
请输入匹配的目标字符项:piHa9
等级:5 积分:9 剩余时间:20
目标字符项是:vyztJ
请输入匹配的目标字符项:vyztJ
等级:5 积分:18 剩余时间:20
恭喜你,成功通关!
结果二
目标字符项是:y
请输入匹配的目标字符项:y
等级:1 积分:1 剩余时间:22
目标字符项是:Z
请输入匹配的目标字符项:Z
等级:1 积分:2 剩余时间:19
目标字符项是:7
请输入匹配的目标字符项:7
等级:1 积分:3 剩余时间:17
目标字符项是:d
请输入匹配的目标字符项:d
等级:1 积分:4 剩余时间:13
目标字符项是:O
请输入匹配的目标字符项:O
等级:1 积分:5 剩余时间:9
目标字符项是:)
请输入匹配的目标字符项:dd
目标字符项:) 与玩家输入项:dd匹配失败,退出游戏!
玩家最终情况是:等级 1 积分 5