【Java】数字炸弹小游戏源程序及个人编程时的想法

本人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,如果需要提取码的话。

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值