【问题标题】:Can't figure out why my program is not printing contents of array无法弄清楚为什么我的程序没有打印数组的内容
【发布时间】:2014-11-23 01:43:20
【问题描述】:

我正在尝试用 java 创建 24 游戏来练习。 24 游戏是一种算术游戏,其目标是找到一种方法来处理四个整数,以使最终结果为 24。可以使用任何数字顺序的加法、减法、乘法或除法来生成四位数从一到九的运算等于 24。

规则很简单:每个数字只需要使用一次,并且只有从用户那里读取的 4 个数字才能找到一个方程来获得 24。

我的问题是程序完成后我没有收到任何输出。问题可能出在 append(String equation) 方法中,该方法用于防止重复答案并将正确的方程添加到 ans 数组中。或者它可能在其他地方。我这辈子都想不通。

编辑代码:

public class TwentyFourGame {

    String [] ans = new String[20];
    boolean [] used = new boolean[20];
    int count = 0;
    int value = 0;

    public void Solve(double w, double x, double y, double z){
        double [] nums = {w,x,y,z};
        double eHold=0, fHold=0;

        //Replaces null array elements with empty string to avoid NPE
        for(int d=0; d<ans.length;d++){
            ans[d] = "";
        }

        for (int a=0;a< 4; a++){
            for (int b=0;b< 3; b++){
                for (int c=0;c<2; c++){
                    fHold = nums[2]+nums[3];
                    if (((nums[0]/nums[1])*fHold)==24)
                        append (nums[0]+" / "+nums[1]+" * ("+nums[2]+" + "+nums[3]+")" + " = 24");
                    else if (((nums[0]/nums[1])-fHold)==24)
                        append (nums[0]+" / "+nums[1]+" - ("+nums[2]+" + "+nums[3]+")" + " = 24");
                    else if (((nums[0]*nums[1])-fHold)==24)
                        append (nums[0]+" * "+nums[1]+" - ("+nums[2]+" + "+nums[3]+")" + " = 24");
                    else if (((nums[0]*nums[1])/fHold)==24)
                        append (nums[0]+" * "+nums[1]+" / ("+nums[2]+" + "+nums[3]+")" + " = 24");
                    else if (((nums[0]-nums[1])*fHold)==24)
                        append (nums[0]+" - "+nums[1]+" * ("+nums[2]+" + "+nums[3]+")" + " = 24");
                    else if (((nums[0]-nums[1])/fHold)==24)
                        append (nums[0]+" - "+nums[1]+" / ("+nums[2]+" + "+nums[3]+")" + " = 24");
                    else value++;
                    fHold=nums[2]-nums[3];

                    if (((nums[0]/nums[1])*fHold)==24)
                        append (nums[0]+" / "+nums[1]+" * ("+nums[2]+" - "+nums[3]+")" + " = 24");
                    else if (((nums[0]/nums[1])+fHold)==24)
                        append (nums[0]+" / "+nums[1]+" + ("+nums[2]+" - "+nums[3]+")" + " = 24");
                    else if (((nums[0]*nums[1])+fHold)==24)
                        append (nums[0]+" * "+nums[1]+" + ("+nums[2]+" - "+nums[3]+")" + " = 24");
                    else if (((nums[0]*nums[1])/fHold)==24)
                        append (nums[0]+" * "+nums[1]+" / ("+nums[2]+" - "+nums[3]+")" + " = 24");
                    else if (((nums[0]+nums[1])*fHold)==24)
                        append (nums[0]+" + "+nums[1]+" * ("+nums[2]+" - "+nums[3]+")" + " = 24");
                    else if (((nums[0]+nums[1])/fHold)==24)
                        append (nums[0]+" + "+nums[1]+" / ("+nums[2]+" - "+nums[3]+")" + " = 24");
                    else value++;
                    fHold=nums[2]*nums[3];

                    if (((nums[0]/nums[1])-fHold)==24)
                        append (nums[0]+" / "+nums[1]+" * ("+nums[2]+" * "+nums[3]+")" + " = 24");
                    else if (((nums[0]/nums[1])+fHold)==24)
                        append (nums[0]+" / "+nums[1]+" + ("+nums[2]+" * "+nums[3]+")" + " = 24");
                    else if (((nums[0]-nums[1])+fHold)==24)
                        append (nums[0]+" - "+nums[1]+" + ("+nums[2]+" * "+nums[3]+")" + " = 24");
                    else if (((nums[0]-nums[1])/fHold)==24)
                        append (nums[0]+" - "+nums[1]+" / ("+nums[2]+" * "+nums[3]+")" + " = 24");
                    else if (((nums[0]+nums[1])-fHold)==24)
                        append (nums[0]+" + "+nums[1]+" - ("+nums[2]+" * "+nums[3]+")" + " = 24");
                    else if (((nums[0]+nums[1])/fHold)==24)
                        append (nums[0]+" + "+nums[1]+" / ("+nums[2]+" * "+nums[3]+")" + " = 24");
                    else value++;
                    fHold=nums[2]/nums[3];

                    if (((nums[0]-nums[1])*fHold)==24)
                        append (nums[0]+" - "+nums[1]+" * ("+nums[2]+" / "+nums[3]+")" + " = 24");
                    else if (((nums[0]-nums[1])+fHold)==24)
                        append (nums[0]+" - "+nums[1]+" + ("+nums[2]+" / "+nums[3]+")" + " = 24");
                    else if (((nums[0]*nums[1])+fHold)==24)
                        append (nums[0]+" * "+nums[1]+" + ("+nums[2]+" / "+nums[3]+")" + " = 24");
                    else if (((nums[0]*nums[1])-fHold)==24)
                        append (nums[0]+" * "+nums[1]+" - ("+nums[2]+" / "+nums[3]+")" + " = 24");
                    else if (((nums[0]+nums[1])*fHold)==24)
                        append (nums[0]+" + "+nums[1]+" * ("+nums[2]+" / "+nums[3]+")" + " = 24");
                    else if (((nums[0]+nums[1])-fHold)==24)
                        append (nums[0]+" + "+nums[1]+" - ("+nums[2]+" / "+nums[3]+")" + " = 24");
                    else value++;
                    fHold=nums[1]*nums[2];

                    if (((nums[0]-fHold)/nums[3])==24)
                        append (nums[0]+" - ("+nums[1]+" * "+nums[2]+") / "+nums[3] + " = 24");
                    else if (((nums[0]-fHold)+nums[3])==24)
                        append (nums[0]+" - ("+nums[1]+" * "+nums[2]+") + "+nums[3] + " = 24");
                    else if (((nums[0]/fHold)+nums[3])==24)
                        append (nums[0]+" / ("+nums[1]+" * "+nums[2]+") + "+nums[3] + " = 24");
                    else if (((nums[0]/fHold)-nums[3])==24)
                        append (nums[0]+" / ("+nums[1]+" * "+nums[2]+") - "+nums[3] + " = 24");
                    else if (((nums[0]+fHold)/nums[3])==24)
                        append (nums[0]+" + ("+nums[1]+" * "+nums[2]+") / "+nums[3] + " = 24");
                    else if (((nums[0]+fHold)-nums[3])==24)
                        append (nums[0]+" + ("+nums[1]+" * "+nums[2]+") - "+nums[3] + " = 24");
                    else value++;
                    fHold=nums[1]-nums[2];

                    if (((nums[0]*fHold)/nums[3])==24)
                        append (nums[0]+" * ("+nums[1]+" - "+nums[2]+") / "+nums[3] + " = 24");
                    else if (((nums[0]*fHold)+nums[3])==24)
                        append (nums[0]+" * ("+nums[1]+" - "+nums[2]+") + "+nums[3] + " = 24");
                    else if (((nums[0]/fHold)+nums[3])==24)
                        append (nums[0]+" / ("+nums[1]+" - "+nums[2]+") + "+nums[3] + " = 24");
                    else if (((nums[0]/fHold)*nums[3])==24)
                        append (nums[0]+" / ("+nums[1]+" - "+nums[2]+") * "+nums[3] + " = 24");
                    else value++;
                    fHold=nums[1]/nums[2];

                    if (((nums[0]-fHold)*nums[3])==24)
                        append (nums[0]+" - ("+nums[1]+" / "+nums[2]+") * "+nums[3] + " = 24");
                    else if (((nums[0]-fHold)+nums[3])==24)
                        append (nums[0]+" - ("+nums[1]+" / "+nums[2]+") + "+nums[3] + " = 24");
                    else if (((nums[0]*fHold)+nums[3])==24)
                        append (nums[0]+" * ("+nums[1]+" / "+nums[2]+") + "+nums[3] + " = 24");
                    else if (((nums[0]*fHold)-nums[3])==24)
                        append (nums[0]+" * ("+nums[1]+" / "+nums[2]+") - "+nums[3] + " = 24");
                    else if (((nums[0]+fHold)*nums[3])==24)
                        append (nums[0]+" + ("+nums[1]+" / "+nums[2]+") * "+nums[3] + " = 24");
                    else if (((nums[0]+fHold)-nums[3])==24)
                        append (nums[0]+" + ("+nums[1]+" / "+nums[2]+") - "+nums[3] + " = 24"); 
                    else value++;
                    fHold=nums[1]+nums[2];

                    if (((nums[0]*fHold)/nums[3])==24)
                        append (nums[0]+" * ("+nums[1]+" + "+nums[2]+") / "+nums[3] + " = 24");
                    else if (((nums[0]*fHold)-nums[3])==24)
                        append (nums[0]+" * ("+nums[1]+" + "+nums[2]+") - "+nums[3] + " = 24");
                    else if (((nums[0]/fHold)-nums[3])==24)
                        append (nums[0]+" / ("+nums[1]+" + "+nums[2]+") - "+nums[3] + " = 24");
                    else if (((nums[0]/fHold)*nums[3])==24)
                        append (nums[0]+" / ("+nums[1]+" + "+nums[2]+") * "+nums[3] + " = 24");
                    else value++;

                    if (value == 192){
                        append("There is no solution for this set of numbers");

                        this.count ++;
                    }
                    // 0=a 1=b 2=c 3=d
                    eHold=nums[2];
                    nums[2]=nums[3];
                    nums[3]=eHold;
                }
                eHold=nums[1];
                nums[1]=nums[2];
                nums[2]=nums[3];
                nums[3]=eHold;
            }
            eHold=nums[0];
            nums[0]=nums[1];
            nums[1]=nums[2];
            nums[2]=nums[3];
            nums[3]=eHold;

            for (int j=0; j<ans.length;j++){
                if (ans[j] != "")
                    System.out.println(ans[j]);
            }
        }
    }


    //Method used to check if there are duplicates in the array of equations
    public void append(String equation){
        String text = equation;

        for (int e=0;e<used.length;e++){
            if (used[e]==false){
                ans[e] = text;
                used[e] = true;
                break;
            }
        }

        //Check if elements in the array are the same
        for (int c=0;c<ans.length;c++){
            for (int d = 0; d < ans.length; d++) {
                //if elements are the same do nothing
                if (ans[c].equals(ans[d])){
                    ans[d] = "";
                }
            }
        }
    }


    public static void main(String[]args){
        java.util.Scanner input = new java.util.Scanner(System.in);
        System.out.println("Enter 4 numbers between 1 - 9");
        double w,x,y,z;
        TwentyFourGame Player1 = new TwentyFourGame();
        w = input.nextDouble();
        x = input.nextDouble();
        y = input.nextDouble();
        z = input.nextDouble();
        input.close();
        Player1.Solve(w,x,y,z);
    }
}

【问题讨论】:

  • 您完全没有输出? main()第二行的println()语句是否运行?
  • main() 的第二行中的 println() 确实运行了。没有其他输出

标签: java arrays for-loop


【解决方案1】:

我怀疑你的逻辑是错误的,这就是为什么你从来没有使用append(String) 方法。如果你调试它,你会看到value 只达到 32,而不是你期望的 192。

此外,一旦您确实使用了append 方法(尝试1、1、3、7),当您尝试评估ans[c].equals(ans[d]) 时,您会得到NullPointerException,因为ans[c] 为空。

【讨论】:

  • 我不明白为什么我的逻辑是错误的。如果我错误地点击 append 方法,我不会收到运行时错误吗?
  • 我明白了为什么我的逻辑是错误的。现在为这个 NullPointerException。如果元素开始为空,我如何检查它们是否相等?
  • 我使用循环将数组的所有元素设置为"",然后我更改了append 方法,以便将(String equation) 分配给数组中的一个元素,然后进行比较。但是,现在我的打印输出都是空字符串。 public void append(String equation){ String text = equation; for (int e=0;e&lt;used.length;e++){ if (used[e]==false){ ans[e] = text; used[e] = true; break; } } for (int c=0;c&lt;ans.length;c++){ for (int d = 0; d &lt; ans.length; d++) { if (ans[c].equals(ans[d])){ ans[d] = ""; }}}}
【解决方案2】:
  1. 双输入?确定不想使用 int 吗?
  2. 您不会将任何结果打印到控制台。只需尝试查找所有 System.out.println(...) 语句。

    int value = 0;
    
    if (value == 192){ // <== Here value == 0, so this condition is always FALSE. And print never happens.
        for (int i=0; i<ans.length;i++){
            System.out.println(ans[i]);
        }
    }
    

【讨论】:

  • 我一起删除了 if 语句。没必要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多