【Java】QuickHit游戏

分享第六条励志语句

选择了安逸舒适,就不必羡慕别人的精彩;选择了惊涛骇浪,就无须向往岁月静好。不同的选择给予你不同的生活路径。没有孰对孰错,只要认定你内心真正想要的,并为之持续努力,每个人都会是自己的人生赢家!!!


目录

分享第六条励志语句

选择了安逸舒适,就不必羡慕别人的精彩;选择了惊涛骇浪,就无须向往岁月静好。不同的选择给予你不同的生活路径。没有孰对孰错,只要认定你内心真正想要的,并为之持续努力,每个人都会是自己的人生赢家!!!

一:项目需求

二: 项目环境准备

三:案例覆盖的技能点

  四:   需要用到的类

 第一步:发现类。

第二步:发现类的属性。

第三步:发现类的方法

 第四步:优化设计

五:主要功能分析

        (1)游戏输出字符串:

    六: 界面分析

    1、 游戏输出字符串

    2、 确认输出的字符并输出结果

    3、 玩家玩游戏

    4、 初始化各个级别的具体参数

代 码 展 示

1、先编写级别类Level:

 2、编写级别参数类LevelParam:

3、创建Play玩家类:

4、创建游戏类Game:

5、定义测试类:


一:项目需求


    (1)QuickHit游戏考验学员键盘输入内容的速度和准确性。
    (2)根据输入速率和正确性将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高。
    (3)如果玩家在规定的时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见,规定用户只要输入错误一次,则游戏结束)
    (4)玩家最高级别为6级,初始级别一律为一级。

二: 项目环境准备


    完成“QuickHit”,对于开发环境的要求如下:
    (1)开发工具:MyEclipse 10
    (2)JDK1.7

三:案例覆盖的技能点


    (1)面向对象程序设计的思想
    (2)使用类图理解类的关系
    (3)类的封装
    (4)构造方法的使用
    (5)this和static关键字的使用


  四:   需要用到的类


        本案例功能简单,代码量较少,采用面向过程的思想可能更容易实现,
        此处的关键是锻炼大家面向对象的设计能力,分析各段功能代码放到什么位置更合理一些,为大型项目的设计打好基础。
        面向对象设计的过程就是抽象的过程,通过在需求中找出名次的方式确定类和属性,通过找出动词的方式确定方法;
        然后对找到的词语进行筛选,剔除无关、不重要的词语;最后对词语之间的关系进行梳理,从而确定类、属性、属性值和方法。
        
        需求中和业务相关的名词主要是游戏、输入速率、玩家、级别、一次显示的字符数、正确输入一次的得分、规定时间、规定次数、超时、玩家的积分和玩家用时等。
        动词主要是输出、输入、确认和显示。
        


        第一步:发现类。


            玩游戏肯定离不开玩家与游戏,可以首先抽象出玩家、游戏两个类。一次显示的字符数、正确输入一次的得分、规定时间和规定次数都与玩家当前的级别有关。
            可以再抽象出一个级别类。而积分和用时可以考虑设置为玩家属性,在此忽略。
            
            经过分析,我们暂时从需求中抽象出如下类:
                游戏(Game)
                玩家(Plyer)
                级别(Level)

第二步:发现类的属性。


            进过分析,玩家的属性有当前级别、玩家的积分和玩家用时等,而玩家用时其实是当前时间与开始时间只差;
            级别的属性有级别号、一次显示的字符数、正确输入一次的得分、规定的时间个规定次数。
            
            进行整理并命名,得到如下结果。
                玩家(Plyer)类的属性:
                        玩家当前级别号(levelNo)
                        玩家当前级别积分(currScore)
                        当前级别开始时间(startTime)
                        当前级别已用时间(elapsedTime)
                级别(Level)类的属性:
                        各级别编号(levelNo)
                        各级别一次输出字符串的长度(strLength)
                        各级别输出字符串的次数(strTime)
                        各级别闯关的时间限制(timeLimit)
                        各级别正确输入一次的得分(perScore)

第三步:发现类的方法


            经过分析,游戏类的主要方法有3个:输出字符串、确认玩家输入是否正确和输出相应结果信息。
            其中,第2个方法很简单,可以和第3个方法合并。
            而玩家的方法只有一个,即玩游戏(根据游戏的输出类输入相同字符串)。
            级别类主要存放信息,没有具体操作。
            
            进行整理并命名,得到如下结果。


                玩家类的方法:
                        玩游戏play()。
                游戏类的方法:
                        String printStr(),输出字符串,返回字符串用于和玩家的输入进行比较;
                        void printResult(String out,String in),比较游戏输出out和玩家输入in,根据比较结果输出相应信息。


            第四步:优化设计


            在游戏类的printResult(String out,String in)方法中,输出相应结果时肯定会涉及玩家类的信息,如当前级别编号、当前级别积分、当前级别已用时间等,
            可以通过把Player对象作为游戏类的属性,轻松解决该问题。
            
            级别类不包含各个级别的具体参数信息,可以增加LevelParam类,在该类中创建一个长度为6的Level数组,存放各个级别的具体参数信息,
            并使用public final static修饰该数组,可以直接通过类名来访问,却无法修改其值。

五:主要功能分析


        (1)游戏输出字符串:


                主要步骤是生成长度固定当内容随机的字符串,同时向控制台输出生成的字符串并返回此字符串(必须返回,用于和玩家输入比较)。


        (2)确认输入并输出结果:


                根据玩家输入是否正确输出不同结果。当输入正确并且未超时,要输出玩家的当前级别、当前积分和已用时间。
                如何计算玩家的当前级别、当前积分和已用时间是关键。


        (3)玩家玩游戏:


                游戏的6个级别可以通过循环实现,而每个级别中的多次字符串输出通过内部子循环实现,该控制功能放在Player类的play()方法中。
                每次玩家晋级后积分清零、计时清零。


    六: 界面分析


        如果玩家输入正确且未超时,则输出玩家输入的正确信息(包括级别、积分和用时),并输出玩家当前积分、当前级别和已用时间。
        如果玩家输入正确但超时,则输出玩家超时信息,并退出系统。
        
        如果玩家输入错误,则输出“输入错误,退出!”的错误信息,并退出系统。    
10.5 项目实现思路
    QuickHit项目的执行步骤描述如下。
        (1)游戏根据玩家的级别在控制台输出指定数量的字符。
        (2)玩家根据控制台的输出来输入相同字符,按Enter键确认。
        (3)游戏确认玩家输入是否正确。
        (4)如果输入错误,则输出玩家输入错误提示信息,游戏非正常结束。
        (5)如果输入正确但超时,则输出玩家速度太慢提示信息,游戏非正常结束。
        (6)如果输入正确且没有超时,则输出玩家的积分、级别和用时信息。然后重复以上步骤,继续输出、输入和确认。
        (7)玩家在规定时间内连续正确输入规定次数后,将显示玩家升级提示,游戏将重新计时计分,将一次输出更多字符。6级玩家闯关成功,输出恭喜信息,游戏正常结束。


    1、 游戏输出字符串


        实现步骤可以设计为以下几步。
        (1)生成字符串。
        (2)输出字符串。
        (3)返回字符串(必须返回,用于玩家和输入进行比较)。
        这其中的关键是第一步的实现,字符串的长度是多少?如何生成长度固定当内容随机的字符串?


    2、 确认输出的字符并输出结果


        实现步骤可以设计为以下几步。
        (1)确认玩家的输入是否正确。
        (2)如果输入不正确,则直接输出错误信息并退出程序。
        (3)如果输入正确,则会有以下两种情况。
            1)如果超时,则直接输出玩家超时信息并退出程序。
            2)如果没有超时,则执行以下操作。
                a)计算玩家当前积分。
                b)计算玩家已用时间。
                c)输出玩家当前级别、当前积分和已用时间。
                d)判断用户是否已经闯过最后一关并处理。


    3、 玩家玩游戏


        实现步骤可以设计为以下几步。
        (1)创建Game对象并传入player属性。
        (2)外层循环(循环次数是6,每循环一次,玩家提升一级)。
            1)晋级。
            2)积分清零,计时清零。
            3)内层循环(循环次数是该级别的strTime,每循环一次完成一次人家交互)。
                a)游戏输出字符串。
                b)玩家输入字符串。
                c)判断玩家输入的字符并输出相应结果。


    4、 初始化各个级别的具体参数


        各个级别的具体参数信息,如各级别编号、各级别一次输出字符串的长度、各级别输出字符串的次数、各级别闯关的时间限制和各级别正确输入一次的得分,应该在游戏开始之前进行初始化。


代 码 展 示

1、先编写级别类Level:


    (1)定义属性:
        private int levelNo; // 级别号
        private int strLength; // 各级别一次输出字符串的长度
        private int strTimes; // 各级别输出字符串的次数
        private int timeLimit; // 各级别闯关的时间限制
        private int perScore; // 各级别成功输入一次字符串后增加的分值
    (2)添加包含所有参数的有参构造方法(无参构造方法后面不需要使用,可以不添加)
    
    (3)针对封装好的属性,添加getXxx()方法,不需要添加setXxx()方法(针对级别的属性是系统规定好的,不需要用户设置)


 

package cn.sun.xianmu;

public class Level {
//	1.级别类,定义属性
	private int levelNo;
//	级别号
	private int strLength;
//	各级别一次输出字符串的长度
	private int strTime;
//	各级别输出字符串的次数
	private int timeLimit;
//	各级别闯关时间限制
	private int perScore;
//各级别成功输入一次字符串后增加的分值
	
//	(2)添加包含所有参数的有参构造方法(无参构造方法后面不需要使用,可以不添加)	
	
public Level(int levelNo, int strLength, int strTime, int timeLimit,
		int perScore) {
	super();
	this.levelNo = levelNo;
	this.strLength = strLength;
	this.strTime = strTime;
	this.timeLimit = timeLimit;
	this.perScore = perScore;
}

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 getStrTime() {
	return strTime;
}

public void setStrTime(int strTime) {
	this.strTime = strTime;
}

public int getTimeLimit() {
	return timeLimit;
}

public void setTimeLimit(int timeLimit) {
	this.timeLimit = timeLimit;
}

public int getPerScore() {
	return perScore;
}

public void setPerScore(int perScore) {
	this.perScore = perScore;
}
	
//(3)针对封装好的属性,添加getXxx()方法,不需要添加setXxx()方法(针对级别的属性是系统规定好的,不需要用户设置)	

	
}

 2、编写级别参数类LevelParam:


    (1)此项目会涉及到6个级别(每个级别是一个对象),所以先创建一个长度为6,类型为Level的数组,这个数组可以声明为静态常量值。
    (2)使用有参构造方法创建6个Level类对象,并将这6个对象存储到第一步创建的数组中,可以将这个操作生命在静态代码块中。

package cn.sun.xianmu;

public class LevelParam {
//	(1)此项目会涉及到6个级别(每个级别是一个对象),所以先创建一个长度为6,类型为Level的数组,这个数组可以声明为静态常量值
//	(2)使用有参构造方法创建6个Level类对象,并将这6个对象存储到第一步创建的数组中,可以将这个操作生命在静态代码块中
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);
}

	

}

3、创建Play玩家类:


    (1)定义属性:    
        private int levelNo; // 级别号
        private int curScore; // 当前积分
        private long startTime = 0; // 各级别开始时间
        private int elapsedTime; // 各级别已用时间
    (2)添加无参构造方法、有参构造方法、getXxx()/setXxx()方法
    
    (3)定义玩家玩游戏的方法play():
        功能:用户由默认0级升级到1级,开始玩游戏(调用Game类里的printStr()方法和printResult()):

package cn.sun.xianmu;

import java.util.Scanner;

public class Player {
//	定义play玩家类--定义属性
	private int levelNo;
//	级别号
	private int curScore;
//	当前积分
	private long startTime;
//	各级别开始时间
	private int elapsedTime;
//	各级别已用时间
	
//	添加无参构造方法
public Player() {
	super();
}
//添加有参构造方法
public Player(int levelNo, int curScore, long starTime, int elapsedTime) {
	super();
	this.levelNo = levelNo;
	this.curScore = curScore;
	this.startTime = starTime;
	this.elapsedTime = elapsedTime;
}
//get/set方法
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 getStarTime() {
	return startTime;
}
public void setStarTime(long starTime) {
	this.startTime = starTime;
}
public int getElapsedTime() {
	return elapsedTime;
}
public void setElapsedTime(int elapsedTime) {
	this.elapsedTime = elapsedTime;
}
	
//玩家玩游戏
public void play(){
	Game game = new Game(this);
//	this表示player对象
//	创建一个game对象
	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].getStrTime();j++){
//			游戏输出字符串
			String outStr = game.printStr();
//			接收用户输入
			String inStr = sc.next();
//			游戏判断玩家输入是否正确,并输出相应结果信息
			game.printResult(outStr,inStr);
		}
		
	}
}
	



	

}

4、创建游戏类Game:


    (1)定义属性:    
        private Player player;// 玩家
    (2)添加无参构造方法、有参构造方法。
    
    (3)定义方法printStr()
            功能:根据用户级别输出指定长度的字符串(字符串的内容是随机产生的)。
    (4)定义方法printResult()
            功能:判断用户输入的字符串与系统随机产生的字符串内容是否相同:
                1)如果用户输入的字符串与系统产生的字符串相同:
                    --》用户输入字符串的时间>对应级别需要的时间:超时,退出游戏系统
                    --》用户输入字符串的时间<对应级别需要的时间:
                        计算用户完游戏的时间,
                        用户玩游戏积累的积分,
                        输出当前用户所处的级别,玩游戏时间、积累的积分,
                        计算该游戏最后一个级别的总分并判断用户是否到达第六级别以及积累的积分是否等于最高级别的积分,如果满足,输出闯关成功。
                2)如果用户输入的字符串与系统产生的字符串相同:
                    直接退出游戏系统。
                  

 

package cn.sun.xianmu;

import java.util.Random;

public class Game {
//	创建游戏类Game:
//	(1)定义属性:	
		private Player player;
		// 玩家

		public Game() {
			super();
		}
		public Game(Player player) {
			super();
			this.player = player;
		}
		public Player getPlayer() {
			return player;
		}
		public void setPlayer(Player player) {
			this.player = player;
		}
//	  输出字符串用于和用户比较
public String printStr(){
	int strLength = LevelParam.levels[player.getLevelNo()-1].getStrLength();
	StringBuffer buffer = new StringBuffer();
	Random random = new Random();
//	通过循环生成要输出的字符串
	for(int i = 0;i<strLength;i++){
//		产生随机数
		int rand = random.nextInt(strLength);
//		根据字符串拼接字符串
		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;
		}
	}
//	输出字符串
	System.out.println(buffer);
//	返回字符串用于和玩家输入相比较
	return buffer.toString();
}
//判断玩家输入是否正确,并输出相应结果信息
//out     游戏输出的字符串
//in      玩家输入的字符串
public void printResult(String out,String in){
	boolean flag;
	if(out.equals(in)){
		flag = true;
	}else{
		flag = false;
	}
//	如果输入正确
	if(flag){
		long currenTime = System.currentTimeMillis();
//		如果超时
		if((currenTime - player.getStarTime())/1000>LevelParam.levels[player.getLevelNo()-1].getTimeLimit()){
			System.out.println("你输入的太慢,已经超时,退出!");
			System.exit(1);
		}
//		如果没有超时
		else{
//			计算当前积分
			player.setCurScore(player.getCurScore()+LevelParam.levels[player.getLevelNo()-1].getPerScore());
//			计算已用时间
			player.setElapsedTime((int)((currenTime - player.getStarTime())/1000));
//			输出当前积分、当前级别、已用时间
			System.out.println("输入正确,您的级别"+player.getLevelNo() + ",您的积分"+player.getCurScore() +",已用时间"
					+player.getElapsedTime()+"秒。");
//			判断用户是否已经闯过最后一关
			if(player.getLevelNo()==6){
				int score = LevelParam.levels[player.getLevelNo()-1].getPerScore()
						*LevelParam.levels[player.getLevelNo()-1].getStrTime();//计算闯关分数
				if(player.getCurScore() == score){
					System.out.println("你已经闯关闯关,成为绝世高手,恭喜你!!!");
					System.exit(0);
				}
			}
		}
//		2.如果输入错误
		
	}else{
		System.out.println("输入错误!退出!小垃圾");
		System.exit(1);
	}
		
}








}


5、定义测试类:


    在main()方法中创建Play类对象,调用play()方法,并“开始游戏”。
    

public class Text {

    public static void main(String[] args) {
        System.out.println("开始游戏");
        Player player = new Player();
        player.play();
        

    }

}
 

 

package cn.sun.xianmu;

public class Text {

	public static void main(String[] args) {
		System.out.println("开始游戏");
		Player player = new Player();
		player.play();
		

	}

}

 今天的项目是第一次写万字博客,虽然项目很简单,但是,是我第一次非常非常认真做的一个小游戏,希望大家多多支持!!!

很多人都会问我,一个女孩子为什么要学后端,我本来大学打了很好的前端基础,已经UI,可是为什么选择了Java,其实我想说的是,无论选择什么,都只是一份未来的工作而已,每个人曾经都幻想过做黑客,世界上没有后悔药,当然,选择比前端难的后端肯定会有后悔的时候,感觉难,学不下去,学不会,可是,这个世界上没有后悔药,自己选择的这条路,怎么样都要坚持下去,学不会,就要比别人更努力,只有付出了,才会有结果,虽然我对自己未来的结果不清楚,但是,我选择了这条路又怎么能半途而废呢,就像我上面分享的励志语录:

选择了安逸舒适,就不必羡慕别人的精彩;选择了惊涛骇浪,就无须向往岁月静好。不同的选择给予你不同的生活路径。没有孰对孰错,只要认定你内心真正想要的,并为之持续努力,每个人都会是自己的人生赢家!!!

对啊!我没有选择安逸舒适,我也不想做一个让别人养着的家庭妇女,我只想靠着自己的双手去挣取自己想要的东西,每个工作,每个行业,都是辛苦的,只不过IT行业备受瞩目,毕竟相对于普通人,高薪,辛苦,神秘,等都让人家对“IT”这个行业充满好奇,而我作为我们家族唯一一个学“IT”的,不免让家人心存怀疑,所以,当我抵抗家人的质疑,就是很大的压力,可是,我的人生方向我已经决定,又有谁可以去让我放弃呢,我选择奋斗,无论过程怎么辛苦,未来怎么样,都是次要,相信自己,才是最重要的,长那么大,我貌似没有疯狂过,按部就班的学习,按部就班的考学,按部就班毕业,可是,我的人生,就应该按部就班的结婚生子吗?我为什么不去选择属于自己的道路,所以,我要为自己的未来疯狂,奋斗,所以,我们都应该为自己奋斗,加油!!!!

创作不易点赞评论互关三连

 

猜你喜欢

转载自blog.csdn.net/swy2560666141/article/details/127025843