本人Java新手,有一点c语言基础,自学到循环这章感觉没比c多出什么新内容,于是完善了书上的数字炸弹算法,灵感来源于快乐大本营的同名游戏。
望大佬勿喷!!!
(一)Java源程序
话不多说,先上源程序。PS:考虑到大家文件名可能都不一样,我省略了文件名那一行。
import java.util.*; public static void main(String[] args) { int i,j=0,k,n,max; System.out.println("输入该数字最大范围的数:"); Scanner input=new Scanner(System.in); max=input.nextInt(); k=max-1; i=(int)(Math.random()*max); System.out.println("开始猜吧:"); n=input.nextInt(); for(;;){ if(n>i){ System.out.println(Math.min(j,n)+"到"+Math.max(j,n)+",再输入:"); k=n; j=Math.min(j,n); n=input.nextInt(); } if(n<i){ System.out.println(Math.min(k,n)+"到"+Math.max(k,n)+",再输入:"); j=n; k=Math.max(k,n); n=input.nextInt(); } if(n==i){ System.out.println("没错就是这个!"); break; } } }
书中的算法只能告诉你你输入的数字比它随机出的数字大还是小,而源程序中能够不断缩小数字的范围。
(二)编程时的想法。
先说说基本思路,循环前先赋值随机数,循环中分三段选择,输入数比随机数大、比随机数小、等于随机数。第三个成立直接break,这没啥好说的,关键是前两个。
拿比随机数大举例。最初,代码如下:
if(n>i){
System.out.println(j+"到"+n+"再输入:");
j=n;
n=input.nextInt();
}
j预先赋值0,如果比随机数大,那第一次输出一定是0到输入数的范围。再让j=n,为下一次做准备。
很快我意识到一个问题,比方说随机数是276。第一次输入500,则要显示0到500这个范围。如果第二次输入410,还比随机数大,之前j=n=500,输出是500到410,所以输出里少一个排序。运用Math.min()和Math.max()改进。
if(n>i){
System.out.println(Math.min(j,n)+"到"+Math.max(j,n)+",再输入:");
j=n;
n=input.nextInt();
}
随后又迎来新的问题。如果第二次输入260,比随机数小,理论输出应为260到500,而此时n还是为预先赋的值999,实际输出是260到999。因此,在此选择中还应对k赋值。(k相当于此选择中的j,在输入数小于随机数的选择中)
接着,我以500作为第一个输入值,第二次分情况讨论,两个输入值分别为410和250,分别大于随机数和小于随机数,讨论理论输出对应的j,k相应值,再以410为第二次输入值,在第三次继续分情况讨论。(此间经过无数次调整,情况冗杂,最后附一张草稿图)
这里先给个定义,j是输入数大于随机数的if选择的主变量,n是小于随机数的主变量,以便说明。总的看,一次输入数大于随机数,如果再来一次小于,k的值不在上一次选择改变就会很难办。所以先明确一点,j、k都要做出调整。其次,如果第一次是大于,第二次还是大于,那么,j的调整又至关重要,在j作为主变量时首先考虑j的赋值(这里较武断,是整理多次讨论后得出),其可能只有自己和n,我想到的可能就是使用Math.min()或Math.max()赋值。经过多次尝试,j使用min。n做主变量时,赋值使用max。基本算法结束。
if(n>i){
System.out.println(Math.min(j,n)+"到"+Math.max(j,n)+",再输入:");
k=n;
j=Math.min(j,n);
n=input.nextInt();
}
if(n<i){
System.out.println(Math.min(k,n)+"到"+Math.max(k,n)+",再输入:");
j=n;
k=Math.max(k,n);
n=input.nextInt();
}
if(n==i){
System.out.println("没错就是这个!");
break;
}
最后,由于Java产生随机数的特性,我加上了自定义数字范围。Math.random()函数不用多说。
System.out.println("输入该数字最大范围的数:");
Scanner input=new Scanner(System.in);
max=input.nextInt();
k=max-1;
i=(int)(Math.random()*max);
还是没有Scanner写开头的习惯,上学期一直在学c语言,以后慢慢改过来吧。。
最后附上辣鸡草稿地址(图片上传不了。。。)
百度网盘 请输入提取码:提取码为9999,如果需要提取码的话。
更多推荐
【Java】数字炸弹小游戏源程序及个人编程时的想法
发布评论