QuickHit游戏项目总结


package hit;


import java.util.*;


public class Game {

//需要一个玩家
private Player player;

//如果你要开启一局游戏,一定要给游戏对象一个玩家对象,才能创建这个游戏对象
//提供一个带玩家作为参数的构造方法
public Game(Player player){

this.player = player;
}

//方法:
/*
* 1.生成一个对应玩家级别的字符串
* String 方法名(){

* }

* */
public String printStr(){

//生成字符串的方法内容 TODO
//1.0获取到玩家等级
int levelNo = player.getLevelNo() - 1;

//1.1 获取到当前玩家等级 下对应的字符串长度
int strlen = LevelInitial.levelsArr[levelNo].getStrlength();

//1.2 创建随机数对象
Random random = new Random();

//创建一个StringBuffer 对象,用来不断的存储和改变字符串内容
StringBuffer buffer = new StringBuffer();

//1.3 采用循环 加上判断的方式, 生成对应长度的字符串
for(int i = 0; i < strlen; i++){

//1.4 每循环一次产生一个随机数
int rand = random.nextInt(strlen);

//1.5 将这个 随机数对应的字符 拼接
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;
case 6:
buffer.append("@");
break;


}


}

//1.6 字符串已经生成好了,先给用户看
System.out.println(buffer);

//1.7 返回这个做好的字符串
return buffer.toString();
}


/*
* 2.对比 原本的结果 和 玩家输入的结果, 
* void 方法名(String 原本的字符串, String 玩家输入的字符串){

* }
* */

public void result(String out, String in){
//TODO --》 对比玩家结果和原本的结果, 判断玩家是否可以继续游戏
//1.判断结果是否一致
/*
* if(结果一样 out 跟 in一样的){

*一样的不够, 时间是否超时
*
*   if(没有超时){
*   
*      // 显示当前玩家的 积分,用时时长,当前级别
*   
*   }else{
*   
*     因为超时了,所以也是一样的 Game Over
*   
*   }
*

* }else{

*   不一样, 游戏终结,Game over
* }



* */

if(out.equals(in)){ //输入 和 输出一样的

//再来判断是否超时

// 用的时间,是比 规定的时间短
// 当前时间 -- 开始时间 的差值  去比较 对应等级所规定的时间
//1.获取到当前时间戳
/*
*是 System类中的一个静态方法
*
*返回值类型是 long, 参数类型 没有
*
*返回的值  是 当前操作系统时间与 1970年1月1日0点0分的 时间间隔,以毫秒为单位 
* */
long currentTime = System.currentTimeMillis();

//2.获取到 开始游戏时的时间戳 

if((currentTime - player.getStartTime())/ 1000 <= LevelInitial.levelsArr[player.getLevelNo() -1].getTimeLimit()){
//没有超时
//1.1 计算分数
int newScore = player.getScore()+ LevelInitial.levelsArr[player.getLevelNo() -1].getPerScore();
//设置给玩家 --》 因为玩家有了新的分数
player.setScore(newScore);

//1.2 计算已经用的时间
long time = (currentTime - player.getStartTime())/ 1000;
//设置给玩家的 用时
player.setElapseTime(time);

//1.3 输出 时间,分数,和等级
System.out.println("输入正确,您的等级是:" + player.getLevelNo() + ", 您的积分是:" + player.getScore() + ", 您的用时为:" + player.getElapseTime() + "秒");

//1.4 判断是否已经全部通关
if(player.getLevelNo() == 6){

//进来这里, 还有五次
//第6局还有5次要玩,
//计算全部游戏 通关,应该是多少分, 然后对比分数,就知道是否通关了
//int score = LevelInitial.levelsArr[6 - 1].getPerScore() * LevelInitial.levelsArr[5].getStrTime();
  
int sum = 0;

for(int j = 0; j < LevelInitial.levelsArr.length; j++ ){ //计算总分 -- 
   
    //每个级别 的总分
    int currentScore = LevelInitial.levelsArr[j].getPerScore() * LevelInitial.levelsArr[j].getStrTime();
   
    //所有级别都通关的总分
    sum += currentScore;
   
   }

if(player.getScore() == sum){//总分一致,代表通关了

System.out.println("恭喜您全部通关!!真棒!!");
System.exit(0);
}

}



}else{//代表 着 输入正确,但是 超时了,
System.out.println("输入正确,但是时间超时,游戏结束!!游戏退出!!");
System.exit(1);
}





}else{ //代表 输入不对, 直接退出程序
System.out.println("输入错误,游戏结束!!游戏退出!!");

//真的让程序退出运行
/*
* static void exit(n)
* 返回值类型为 空
* 参数类型 int n --》 状态码, 非0代表 非正常退出

* 作用:终止当前正在运行的 JVM
* */
System.exit(1);

}


}


}


package hit;


/*
 * 这个Level类的功能,是存储对应的基本的要求信息
 * 
 * 玩游戏: 1.如果你是第一级别,那么你的游戏时间会比较长,字符串比较短,每一局的分数比较低
 * 
 * 2.伴随着不一样级别的变化,你的时间是不一样的,分数不一样的,字符串长度不一样。。。
 * 
 * 因此,用级别类的对象来存储这些信息, 一个级别对象,代表一个级别
 * 
 * 如果有6个级别,就new 6个级别对象, 每个对象存储的属性值 是不一样的
 * 
 * */
public class Level {


//1.级别编号
private int levelNo;

//2.当前级别对应的 字符串长度
private int strlength;

//3.当前级别对应的输入时间限制要求
private int timeLimit;

//4.当前级别限制的 次数
private int strTime;

//5.当前级别对应的 分数
private int perScore;


/*
* 因为每个级别,应该是一来是就规定好这些 游戏初始的内容,所以不提供setter

* 一次构造之后,不允许再更改它
* */
public Level(int levelNo, int strlength, int timeLimit, int strTime, int perScore){

this.levelNo = levelNo;
this.strlength = strlength;
this.timeLimit = timeLimit;
this.perScore = perScore;
this.strTime = strTime;
}


//每个级别对象 代表一个级别, 我们需要获取到这个值,
public int getLevelNum(){

return this.levelNo;
}

    public int getTimeLimit(){

return this.timeLimit;
}
    
     public int getStrTime(){

return this.strTime;
}

     public int getStrlength(){
 
  return this.strlength;
  }
     
     public int getPerScore(){
 
  return this.perScore;
  }
}

package hit;
/*
 * 这个类 是来进行每个级别对象 的初始化
 * 
 * 因为一个级别对象,存储一个级别对应的信息
 * 例如级别对象
 * Level firstLevel = new Level(1, 2, 30, 5, 1);
 * 
 * Level secondL = new Level(2, 3, 25, 6, 2);
 * 
 * Level thirdL = new Level(3, 4, 20, 7, 5);
 * 
 * Level forthL = new Level(4, 5, 15, 8, 10);
 * 
 * 所以,当前这个 LevelInital这个类的目的,是为了初始化出 所有等级的信息
 * */
public class LevelInitial {

//把所有的等级放入到数组中
//类变量,--》属于类,在类被加载的时候,创建这个数组
public static Level[] levelsArr = new Level[6];

//静态初始化块
//在加载类的时候执行静态初始化块,并且只会被执行一次
static {

levelsArr[0] = new Level(1, 2, 30, 5, 1);
levelsArr[1] = new Level(2, 3, 25, 4, 2);
levelsArr[2] = new Level(3, 4, 22, 3, 5);
levelsArr[3] = new Level(4, 5, 20, 3, 8);
levelsArr[4] = new Level(5, 6, 18, 3, 10);
levelsArr[5] = new Level(6, 7, 15, 3, 15);
}
}


package hit;


import java.util.*;


public class Player {

//属性

//1.级别号 当前这个玩家在哪一个级别
private int levelNo;

//2.开始游戏的时间
private long startTime;

//3.积分
private int score;

//4.每级别游戏的持续时间
private long elapseTime;

/*
* setter

* */
public void setLevelNo(int levelNo){

this.levelNo = levelNo;
}

public void setScore(int score){

this.score = score;
}

    public void setStartTime(long time){

this.startTime = time;
}


    public void setElapseTime(long elapse){

   this.elapseTime = elapse;
    }
/*
* getter
* */
    public int getLevelNo(){
   
    return this.levelNo;
    }
    
    public int getScore(){
   
    return this.score;
    }
 
    public long getStartTime(){
 
      return this.startTime;
    }
 
    public long getElapseTime(){
 
      return this.elapseTime;
    }
    /*
     * 玩家的行为:  玩游戏
     * 
     * */
    
    public void play(){
    //玩游戏的逻辑在这里实现
   
   
    //1.首先需要一局游戏
    // this当前这个方法的调用者 --》 Player p
    //Game(Player player)
    Game game = new Game(this);
   
    //2.输入对象创建
    Scanner input = new Scanner(System.in);
   
    //3.开始游戏
    /*
    * 外层循环 是 总级别数,内层循环是每个级别 所对应的次数
   
    * */
    //外层循环,所有的游戏级别
    //每一次执行一次外层循环,代表玩家 玩通了一个级别,级别+1
    for(int i = 0; i < LevelInitial.levelsArr.length; i++){
   
    //1.1 玩家级别 +1
    //晋级
    levelNo += 1;
   
    //1.2获取新的开始时间。。。
    //TODO
    startTime = System.currentTimeMillis();
   
    //1.这里代表 每个级别单独计分数
    //分数可以在这里清零
    //score = 0;
   
    //根据当前的级别,来看 这个级别下 要玩多少次
    //例如玩家在 第一级别,那么在规定的30秒内 玩8次游戏
    //例如 玩家在 第二级别,那么在规定的30秒内 玩 7次游戏
    for(int j = 0; j < LevelInitial.levelsArr[levelNo -1].getStrTime();j++){
   
    //玩游戏
    //1.1 生成字符串
    String out = game.printStr();
   
    //1.2 玩家输入字符串
    String in = input.next();
   
    //1.3 比较结果
    game.result(out, in);
   
    }
    }
    }
}




public class Test {

public static void main(String[] args){

//创建玩家,玩游戏
Player p = new Player();

p.player();
}
}


老师布置的作业是一个游戏项目,我看了一遍,愣是没有看懂



然后我就放弃了,今天老师讲了之后,我还是有许多没懂的,可是我明白了大致的结构


不像昨天,什么也不知道,老师告诉我们,不去思考就什么也不会懂


我感触很深,意思到自己的错误,在仔细去看了一遍之后,发现我虽然不能完全写出来


可也能画一个构架出来,是我自己太容易放弃了。


以后一定要改正这个错误,做什么都要努力的去尝试!






这道题目,首先阅读题目,了解意思,明白需求是什么,要达到什么样的目的


其次,分析出需要哪几个类,比如玩家这个类,等级这个类


然后试着写出每个类需要什么,比如等级这个类,需要的是次数,时间等


然后完善其中的细节。


最后再写一个测试类,用来测试其中的错误。


每一个项目都该如此。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Quickhit项目案例中的打字游戏代码,供您参考: 1. 在VSCode中创建一个新的文件,保存为“index.html”,并添加以下HTML代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Quickhit 打字游戏</title> <style> #text { font-size: 3rem; font-weight: bold; text-align: center; margin: 20px; } #input { font-size: 2rem; text-align: center; margin: 20px; padding: 10px; border: none; border-bottom: 2px solid #333; outline: none; background-color: #f5f5f5; } #timer { font-size: 2rem; text-align: center; margin-bottom: 20px; } </style> </head> <body> <h1>Quickhit 打字游戏</h1> <p id="text">请在下方输入框中输入以下内容:</p> <input type="text" id="input" autofocus> <p id="timer">倒计时:<span id="countdown">30</span> 秒</p> <script src="app.js"></script> </body> </html> ``` 2. 在同一目录下创建一个名为“app.js”的JavaScript文件,并添加以下代码: ```javascript const text = "Quickhit 是一个快速开发工具集,可用于构建 Web 应用程序、移动应用程序和后端服务。"; const input = document.getElementById("input"); const timer = document.getElementById("countdown"); let timeLeft = 30; let score = 0; let gameStarted = false; function startGame() { gameStarted = true; // 设置定时器 const countdown = setInterval(() => { if (timeLeft <= 0) { clearInterval(countdown); endGame(); } else { timeLeft--; timer.textContent = timeLeft + " 秒"; } }, 1000); // 监听输入框 input.addEventListener("input", () => { if (!gameStarted) return; if (input.value === text) { score++; input.value = ""; updateText(); } }); // 初始化文本 updateText(); } function updateText() { const textContainer = document.getElementById("text"); const newText = text.substring(score); textContainer.textContent = newText; } function endGame() { gameStarted = false; input.disabled = true; alert(`游戏结束!您的得分为 ${score} 分!`); } startGame(); ``` 3. 打开“index.html”文件,并在VSCode的底部状态栏中点击“Go Live”按钮,即可在浏览器中运行该打字游戏。 以上代码实现了一个简单的打字游戏,玩家需要在30秒内尽可能多地输入给定的文本,最终得分将在游戏结束后显示。您可以根据自己的需求和想法对代码进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值