我这做了一个很简单的猜数字游戏,程序它还有点小瑕疵,求改进

问题遇到的现象和发生背景

大二学生做的简单程序,遇到的难题,解答

问题相关代码
package just;
import java.util.Scanner;
class G{
    static int re=-1;
     public void G(){
         int n=(int)(Math.random()*10000);
        int n1=n/1000,n2=n/100%10,n3=n/10%10,n4=n%10;
        while(n1==n2||n1==n3||n1==n4||n2==n3||n2==n4||n3==n4){
            n=(int)(Math.random()*10000);
        }
        System.out.println("Start The Game");
        int se=1,gn;
        while(se!=0){
        Scanner build=new Scanner(System.in);
        System.out.println("请输入你猜测的四位数");
        gn=build.nextInt();
        while(gn<1000||gn>9999){
            System.out.println("输入错误,请重新输入1个4位数:");
            gn=build.nextInt();
        }
        int g1=gn/1000,g2=gn/100%10,g3=gn/10%10,g4=gn%10;
        int b=0,a=0;
        while(g1==g2||g1==g3||g1==g4||g2==g3||g2==g4||g3==g4){
            System.out.println("有重复数字,请重新输入:");
            gn=build.nextInt();
            g1=(gn/1000);g2=(gn/100%10);g3=(gn/10%10);g4=(gn%10);
        }
        if(g1==n1){
            a++;
        }else  if(g1==n2||g1==g3||g1==g4){
                b++;
              }
        
        if(g2==n2){
            a++;
        }else  if(g2==n1||g2==n3||g2==n4){
                b++;
            }
        
         if(g3==n3){
             a++;
         }else if(g3==n1||g3==n2||g3==n4){
                 b++;
             }
         
         if(g4==n4){
           a++;
         }else if(g4==n2||g4==n3||g4==n4){
                     b++;
             }
         if(a==4){
             System.out.println("锣鼓喧天,鞭炮齐鸣     您猜对啦!!!");
             System.out.println("是否继续游戏(退出请输入0)");
             re=build.nextInt();
             if(re==0&&re!=-1){
                 break;
             }else{
                    new G();
                    G.re=-1;
                }
         }
         else
         {
         System.out.println(a+"A"+b+"B");
         System.out.println("是否继续游戏(退出请输入0)");
         se=build.nextInt();
         }
        }    
     }
}
public class guess {
    public static void main(String[] args) {
        G g=new G();
        g.G();
    }
}

运行结果的瑕疵

img

我想要达到的结果

解决上面截图中,在输入时同样的四个数只是位置不同,但是却出现结果的偏差的问题

import java.util.Scanner;
class G{
    static int re=-1;
    public void G(){
        int n=(int)(Math.random()*10000);
        int n1=n/1000,n2=n/100%10,n3=n/10%10,n4=n%10;
        while(n1==n2||n1==n3||n1==n4||n2==n3||n2==n4||n3==n4){
            n=(int)(Math.random()*10000);
            n1=n/1000;
            n2=n/100%10;
            n3=n/10%10;
            n4=n%10;
        }
        System.out.println("Start The Game");
        int se=1,gn;
        while(se!=0){
            Scanner build=new Scanner(System.in);
            System.out.println("请输入你猜测的四位数");
            gn=build.nextInt();
            while(gn<1000||gn>9999){
                System.out.println("输入错误,请重新输入1个4位数:");
                gn=build.nextInt();
            }
            int g1=gn/1000,g2=gn/100%10,g3=gn/10%10,g4=gn%10;
            int b=0,a=0;
            while(g1==g2||g1==g3||g1==g4||g2==g3||g2==g4||g3==g4){
                System.out.println("有重复数字,请重新输入:");
                gn=build.nextInt();
                g1=(gn/1000);g2=(gn/100%10);g3=(gn/10%10);g4=(gn%10);
            }
            System.out.println(g1+"  "+g2+"   "+g3+"   "+g4);
            if(g1==n1){
                a++;
            }else  if(g1==n2||g1==g3||g1==g4){
                b++;
            }

            if(g2==n2){
                a++;
            }else  if(g2==n1||g2==n3||g2==n4){
                b++;
            }

            if(g3==n3){
                a++;
            }else if(g3==n1||g3==n2||g3==n4){
                b++;
            }

            if(g4==n4){
                a++;
            }else if(g4==n2||g4==n3||g4==n1){
                b++;
            }
            if(a==4){
                System.out.println("锣鼓喧天,鞭炮齐鸣     您猜对啦!!!");
                System.out.println("是否继续游戏(退出请输入0)");
                re=build.nextInt();
                if(re==0&&re!=-1){
                    break;
                }else{
                    new G();
                    G.re=-1;
                }
            }
            else
            {
                System.out.println(a+"A"+b+"B");
                System.out.println("是否继续游戏(退出请输入0)");
                se=build.nextInt();
            }
        }
    }
}
public class guess {
    public static void main(String[] args) {
        G g=new G();
        g.G();
    }
}

建议去熟悉一下阿里的代码规范。你这代码看不进去。

首先建议类分文件创,每个类只干一件或一类与它的名字匹配的事情。
然后获取随机数,可以使用Math库来获取,也可以使用System类获取当前系统的毫秒数求余来生成。
其实还有一种思路,你这个限制了数的范围是一个四位数,那么可以将这些四位数用循环存入一个List中,
再调用Collections类的静态方法suffer打乱,然后出第一个。
其实整体只需要分为这样几步:
第一步:生成一个随机数
第二步:开启循环,接收用户输入
第三步:检查输入的有效性
第四步:判断两值是否相等的具体实现
第五步:根据是否相等选择提示或者结束循环
第六步:重写开始或结束游戏的业务实现。
有了这样的模板,你很容易构建一个抽象父类。在抽象父类中写下这六个方法。
对于一些可以去掉的业务,例如:
检查输入有效性,提示等,可以再次分离出来,做成接口。
在抽象父类中完成基本的功能。
然后在直接的子类中进行基础,实现具体的业务。

卧槽 你这代码都没缩进啥的看的很难受 你如果用ij的话按alt+ctrl+L格式化下代码 还有你这详细的要求得讲下 要不然都不知道你要干啥 给的什么0A2B都不知道是什么意思

img


你这里每次不都是随机生成的数吗,你生成的不一样,结果肯定也不一样呀
然后,如果生成了有重复数字的随机数,你这个while也死循环了,没对n1n2n3n4重新赋值