最近看到网络视频上有一些有趣的小游戏,于是想到用Java代码实现一下:
游戏玩法:由计算机随机产生1~100的整数。用户猜测计算机产生的数字(即答案),用户输入数字,如果输入的数字与答案相同则获胜。当输入的数字小于或大于答案,会出现关于输入数值与答案比较的提示信息,用户通过提示信息进一步猜测答案,直到指定次数后游戏结束。
变量:
- 输入数值
- 随机产生的答案
- 猜测回合(次数)
逻辑流程:
import java.util.Random;
import java.util.Scanner;
public class MathGame {
public static void main(String[] args) {
Random ran = new Random();//实例化随机对象
System.out.println("欢迎进入猜数游戏");
int answer = ran.nextInt(100) + 1;//随机生成一个整数作为猜的目标答案
int i;
for (i = 0; i < 10; i++) {
//给游戏设定一个次数,最多输入10次
System.out.println("请输入一个整数:");
//实例化一个输入流对象
Scanner input = new Scanner(System.in);
//输入为int类型
if (input.hasNextInt()) {
int inputFigure = input.nextInt();
if (inputFigure < answer) {
System.out.printf("输入数值比答案小,还剩%2d次机会", 9 - i);
} else if (inputFigure > answer) {
System.out.printf("输入数值比答案大,还剩%2d次机会", 9 - i);
} else {//否则就是等于答案
System.out.println("猜中正确答案%2d,获胜,游戏结束", amswer);
break;
}
} else {//输入不是int类型
if ("end".equals(input.next())) {//判断输入的是否为“end”
System.out.println("玩家选择游戏结束");
break;
} else {
System.out.println("输入错误");
i--;//i-1 此次输入不算次数
}
}
}
if (i == 10) {//输入次数为10次
System.out.println("游戏结束,失败");
}
}
}
拓展: 怎么用最少的次数找到答案?
二分法(粗略)解决思路:答案首先会告诉范围,那么首先猜这个范围的中间值,然后根据猜测提示(偏大还是偏小),继续猜测答案所在区间的中值,以此类推,次数最多的情况是直到区间缩小到2个数二选一。
示例题目:答案是69,给定答案区间[0,100](101个数)
解法示例一(二分法上取整法则):
第一次猜50((100+0)/2),提示偏小,确定区间[51,100](50个数);
第二次猜75((100+51)/2下取整),提示偏大,确定区间[51,74](24个数);
第三次猜62((51+74)/2下取整),提示偏小,确定区间[63,74](12个数);
第四次猜68((63+74)/2下取整),提示偏小,确定区间[69,74](6个数);
第五次猜71((69+74)/2下取整),提示偏大,确定区间[69,70](2个数);
第六次猜69(69、70二选一),提示获胜
或第六次猜70(69、70二选一),提示偏大,锁定69;第七次输入69,提示获胜
解法示例二(二分法下取整法则):
第一次猜50((100+0)/2),提示偏小,确定区间[51,100](50个数);
第二次猜76((100+51)/2上取整),提示偏大,确定区间[51,75](25个数);
第三次猜63((51+75)/2),提示偏小,确定区间[64,75](12个数);
第四次猜70((64+75)/2上取整),提示偏大,确定区间[64,69](6个数);
第五次猜67((64+69)/2上取整),提示偏小,确定区间[68,69](2个数);
第六次猜68(68、69二选一),提示偏小,锁定69;第七次输入69,提示获胜
或第六次猜69(68、69二选一),提示获胜;