蓝桥云课近期上线了 轻实验 功能,支持在社区发布技术类帖子的时候绑定实验环境。读者可以在阅读技术内容的时,打开实验环境练习。
你现在看到的帖子就是一个轻实验,可以点击标题右侧的【启动环境】试一下。😄
接下来,我们来看一看实验内容吧 ~
今天我们需要使用 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
好了,猜数小游戏的基础代码已经全部实现了,挺有意思吧 ~ 🌸
大家可以在此基础上还可以增强功能,如记录游戏者的成绩,保存到文件中,还可以将成绩进行排名哦!