【轻实验】猜数小游戏
25实验 481查看
taotao
taotao
L1179
2022-06-30 16:43
启动环境

图片描述

蓝桥云课近期上线了 轻实验 功能,支持在社区发布技术类帖子的时候绑定实验环境。读者可以在阅读技术内容的时,打开实验环境练习。

你现在看到的帖子就是一个轻实验,可以点击标题右侧的【启动环境】试一下。😄

接下来,我们来看一看实验内容吧 ~

今天我们需要使用 Java 中的基础语法和流的知识来完成一个小游戏。

🤔 那是一个什么小游戏呢?

猜数的小游戏,程序会给出一个随机数,然后你来猜,过程中会给出相应的提示。

先来看看游戏效果 👇

图片描述

😎 有点意思,那么我们就动手分步来实现,在 /home/project 目录下新建 Game.java 源文件,并添加一个 guessNum() 方法,在 main 方法中调用该方法实现猜数的游戏功能。

图片描述

🍒 基础结构代码如下:

/**
 * 猜数小游戏
 */
public class Game{
    /**
     * 实现猜数功能
     */
    public void guessNum(){

    }

    public static void main(String[] args) {
        new Game().guessNum();
    }
}
copy

第一步,产生随机数

对,猜数我们就可以想到这个数字应该是随机产生的,而这个随机数还需要给出一个范围,不然这个数字就太难猜了。在此我们指定的范围是 1 - 100 的随机整数,代码如下:

public void guessNum(){
    //产生1-100之间的随机数
    int a = (int) (Math.random()*100)+1;
    System.out.println(a);
}
copy

图片描述

从图中可以看到已经产生随机数了,采用的是 Math 类中的静态方法 random() 获取的。

第二步,实现数字对比

随机数产生之后,我们就可以通过 BufferedReader 流从标准输入 System.in 控制台获取猜测的数字信息,然后和随机数进行比较,比较后给出提示信息,猜大了还是猜小了或是猜对了,guessNum 方法中实现的核心代码如下:

// 提示信息
System.out.println("请输入 1 - 100 随机数:");
// 通过缓冲流从标准输入获取数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 获取所猜的数字信息
String s = null;
try {
    s = br.readLine();
    int b = Integer.parseInt(s);
    if(a > b) {
        System.out.println("猜小了");
    }else if(a < b) {
        System.out.println("猜大了");
    }else {
        System.out.println("恭喜你,猜对了");
    }
} catch (IOException e) {
    e.printStackTrace();
}

// 完成操作后资源释放
if(br != null){
    try {
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
copy

图片描述

执行结果可见,猜测的数字和随机数可以进行比较了,但是每次只能猜测一次肯定不行,因此我们需要改进。

第三步,实现多次猜数

实现多次猜数进行比较,我们就可以使用循环,但是需要循环多少次呢,这是不能确定的,因此我们需要采用无限循环 while(true){ },当猜对了时,终止该循环即可。guessNum 方法中实现的核心代码如下:

图片描述

图片描述

图中可见,可以猜多次了,直到猜对了程序结束。

第四步,提高游戏强韧性

我们来看看以下两种情况:

图片描述

从控制台输入非整数数字,没有输入任何内容直接敲回车,都会抛出异常,若让游戏者碰到这样的信息感觉就不好了,会觉得游戏很 low 所以我们必须要提高游戏的强韧性。

可以将以下语句:

int b = Integer.parseInt(s);
copy

修改成:

int b = 0;
try {
    b = Integer.parseInt(s);
} catch (NumberFormatException e) {
    System.out.println("请输入整数!");
    continue;
}
copy

图片描述

执行的结果就不会出现异常信息,上面的问题也解决了,不过也会有游戏者一直输入非数字的信息,你可以想想办法不要一直提示 “请输入整数!”,不然没完没了了,对吧 ~ 😜

第五步,我不是一次性的游戏

为了提高游戏的可玩性,并不是一次性的游戏,我们可以在一轮猜数结束后,询问游戏者是否需要继续,当输入 n 时结束整个游戏,当输入非 n 的内容时,将开启新一轮猜数游戏,guessNum 方法中核心实现代码如下:

// 通过缓冲流从标准输入获取数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
    //产生1-100之间的随机数
    int a = (int) (Math.random()*100)+1;
    System.out.println(a);

    // 提示信息
    System.out.println("请输入 1 - 100 随机数:");
    
    // 获取所猜的数字信息
    String s = null;

    while(true){
        // 内循环中的代码不变(这里省略)
    }

    System.out.println("是否继续(Y/N):");
    try {
        s = br.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    if("n".equalsIgnoreCase(s)){
        System.out.println("byebye");
        break;
    }
}

// 完成操作后资源释放(这里省略)
copy

代码中添加一个大循环,将 BufferedReader 流对象放在大循环之外,需要频繁创建,然后再小循环后添加是否继续的询问,当输入 n 时结束真个游戏。

图片描述

第六步,太笨不适合玩

所谓太笨不适合玩,是指猜的次数超过 10 次了都还没有猜对,我们可以让程序正常结束。可以在代码中使用一个变量记录猜的次数,太笨的就不要让他玩啦。 🥺

guessNum 方法中核心实现代码如下:

图片描述

Game.java 完整代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 猜数小游戏
 */
public class Game{

    /**
     * 实现猜数功能
     */
    public void guessNum(){

        // 通过缓冲流从标准输入获取数据
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            //产生1-100之间的随机数
            int a = (int) (Math.random()*100)+1;

            // 提示信息
            System.out.println("请输入 1 - 100 随机数:");
            
            // 获取所猜的数字信息
            String s = null;
            // 记录猜的次数
            int count = 0;
            while(true){
                try {
                    s = br.readLine();
                    int b = 0;
                    try {
                        b = Integer.parseInt(s);
                    } catch (NumberFormatException e) {
                        System.out.println("请输入整数!");
                        continue;
                    }
                    count++;
                    if(a > b) {
                        System.out.println("猜小了");
                    }else if(a < b) {
                        System.out.println("猜大了");
                    }else {
                        System.out.println("恭喜你,猜对了");
                        break;
                    }
                    if(count == 10){
                        System.out.println("太笨了不适合玩 Over!");
                        // 系统正常退出
                        System.exit(0);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("是否继续(Y/N):");
            try {
                s = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if("n".equalsIgnoreCase(s)){
                System.out.println("byebye");
                break;
            }
        }
        
        // 完成操作后资源释放
        if(br != null){
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Game().guessNum();
    }
}
copy

好了,猜数小游戏的基础代码已经全部实现了,挺有意思吧 ~ 🌸

大家可以在此基础上还可以增强功能,如记录游戏者的成绩,保存到文件中,还可以将成绩进行排名哦!

#轻实验
你的回复