我的Java程序只循环一次

我的Java程序只循环一次,java,android,debugging,Java,Android,Debugging,我已经在这个程序上工作了大约一天了,我不明白为什么它不工作。我能发现的是,程序中检查代码是否已经被使用的部分工作得并不完美 该程序的目标是选择随机数,直到它与您输入的代码匹配为止。它模拟了安卓手机上的模式锁定,所以为了让它更高效,我添加了一个数组列表来跟踪它所做的所有猜测,以便它不会重复自己 我的代码 import java.util.*; public class CrackerMain { public static void main(String[] args) { //Ins

我已经在这个程序上工作了大约一天了,我不明白为什么它不工作。我能发现的是,程序中检查代码是否已经被使用的部分工作得并不完美

该程序的目标是选择随机数,直到它与您输入的代码匹配为止。它模拟了安卓手机上的模式锁定,所以为了让它更高效,我添加了一个数组列表来跟踪它所做的所有猜测,以便它不会重复自己

我的代码

import java.util.*;
public class CrackerMain {
public static void main(String[] args) {

    //Instances
    Scanner scan=new Scanner(System.in);
    Random gen=new Random();
    //Variables
    long endTime=0;
    long startTime=0;
    boolean solved=false;
    boolean newnumb=false;
    int ran=0;
    int correct=0;
    boolean running=true;
    int dots;
    int codex;
    int codey;
    int zero;
    int x;
    int y;
    ArrayList<int[][]>  UsedCodes = new ArrayList<int[][]>();
    int[][] code={{0,0,0},
                  {0,0,0},
                  {0,0,0}};
    int[][] guess={{0,0,0},
                   {0,0,0},
                   {0,0,0}};
    UsedCodes.add(guess);
    //Program

    //Enter Code
    System.out.println("Enter a Code to Crack: ");
    System.out.println("1 for 1st etc. 0 for Not Used");
    System.out.println("y x0  1  2");
    System.out.println("0 {x}{x}{x}");
    System.out.println("1 {x}{x}{x}");
    System.out.println("2 {x}{x}{x}");
    System.out.println("Enter Number for 0,0");
    code[0][0]=scan.nextInt();
    System.out.println("Enter Number for 0,1");
    code[0][1]=scan.nextInt();
    System.out.println("Enter Number for 0,2");
    code[0][2]=scan.nextInt();
    System.out.println("Enter Number for 1,0");
    code[1][0]=scan.nextInt();
    System.out.println("Enter Number for 1,1");
    code[1][1]=scan.nextInt();
    System.out.println("Enter Number for 1,2");
    code[1][2]=scan.nextInt();
    System.out.println("Enter Number for 2,0");
    code[2][0]=scan.nextInt();
    System.out.println("Enter Number for 2,1");
    code[2][1]=scan.nextInt();
    System.out.println("Enter Number for 2,2");
    code[2][2]=scan.nextInt();

    System.out.println("Entered");
    System.out.println("{"+code[0][0]+"}{"+code[0][1]+"}{"+code[0][2]+"}");
    System.out.println("{"+code[1][0]+"}{"+code[1][1]+"}{"+code[1][2]+"}");
    System.out.println("{"+code[2][0]+"}{"+code[2][1]+"}{"+code[2][2]+"}");
    //guessing
    startTime = System.nanoTime();
    while(solved==false){
        correct=0;
        newnumb=false;
        while(newnumb==false){
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=1;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=2;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=3;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=4;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=5;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=6;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=7;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=8;
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=9;
            //Enter Zeros Randomly
            zero=gen.nextInt(100);
            if(zero==0){
                x=gen.nextInt(3);
                y=gen.nextInt(3);
                guess[x][y]=0;  
            }
            zero=gen.nextInt(100);
            if(zero==0){
                x=gen.nextInt(3);
                y=gen.nextInt(3);
                guess[x][y]=0;  
            }
        zero=gen.nextInt(100);
        if(zero==0){
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=0;  
        }
        zero=gen.nextInt(100);
        if(zero==0){
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=0;  
        }
        zero=gen.nextInt(100);
        if(zero==0){
            x=gen.nextInt(3);
            y=gen.nextInt(3);
            guess[x][y]=0;  
        }

        //Check if New
        for(int i=0; i>ran; i++){
            if(guess!=UsedCodes.get(i)){
                correct++;
            }
        }

        if(correct==ran){
            newnumb=true;
            ran++;  
        }
    }
    //Add Guess to ArrayList
    UsedCodes.add(guess);
    //Say What Guessed
    System.out.println(" ");
    System.out.println("{"+guess[0][0]+"}{"+guess[0][1]+"}{"+guess[0][2]+"}");
    System.out.println("{"+guess[1][0]+"}{"+guess[1][1]+"}{"+guess[1][2]+"}");
    System.out.println("{"+guess[2][0]+"}{"+guess[2][1]+"}{"+guess[2][2]+"}");

    //Check if Worked
    if(code[0][0]==guess[0][0]&&code[0][1]==guess[0][1]&&code[0][2]==guess[0][2]&&code[1][0]==guess[1][0]&&code[1][1]==guess[1][1]&&code[1][2]==guess[1][2]&&code[2][0]==guess[2][0]&&code[2][1]==guess[2][1]&&code[2][2]==guess[2][2]){
        solved=true;
        endTime = System.nanoTime();
        ran++;
    }
    else{
        guess[0][0]=0;
        guess[0][1]=0;
        guess[0][2]=0;
        guess[1][0]=0;
        guess[1][1]=0;
        guess[1][2]=0;
        guess[2][0]=0;
        guess[2][1]=0;
        guess[2][2]=0;
    }

}   
System.out.println("Solution");
System.out.println("{"+guess[0][0]+"}{"+guess[0][1]+"}{"+guess[0][2]+"}");
System.out.println("{"+guess[1][0]+"}{"+guess[1][1]+"}{"+guess[1][2]+"}");
System.out.println("{"+guess[2][0]+"}{"+guess[2][1]+"}{"+guess[2][2]+"}");
System.out.println("Broke Your Passcode in: "+((endTime - startTime)/1000000000) + " seconds"); 
import java.util.*;
公开课{
公共静态void main(字符串[]args){
//实例
扫描仪扫描=新扫描仪(System.in);
Random gen=新的Random();
//变数
长结束时间=0;
长起始时间=0;
布尔值=假;
布尔值newnumb=false;
int-ran=0;
int correct=0;
布尔运行=真;
整数点;
国际法典;
国际法典委员会;
整数零;
int x;
int-y;
ArrayList UsedCodes=新的ArrayList();
int[][]代码={{0,0,0},
{0,0,0},
{0,0,0}};
int[][]猜测={{0,0,0},
{0,0,0},
{0,0,0}};
添加(猜测);
//节目
//输入代码
System.out.println(“输入要破解的代码:”);
System.out.println(“1表示第一次,0表示未使用”);
System.out.println(“y x0 1 2”);
System.out.println(“0{x}{x}{x}”);
System.out.println(“1{x}{x}{x}”);
System.out.println(“2{x}{x}{x}”);
System.out.println(“输入0,0的编号”);
代码[0][0]=scan.nextInt();
System.out.println(“输入0,1的编号”);
代码[0][1]=scan.nextInt();
System.out.println(“输入0,2的编号”);
代码[0][2]=scan.nextInt();
System.out.println(“输入1,0的编号”);
代码[1][0]=scan.nextInt();
System.out.println(“输入1,1的编号”);
代码[1][1]=scan.nextInt();
System.out.println(“输入1,2的编号”);
代码[1][2]=scan.nextInt();
System.out.println(“输入2,0的编号”);
代码[2][0]=scan.nextInt();
System.out.println(“输入2,1的编号”);
代码[2][1]=scan.nextInt();
System.out.println(“输入2,2的编号”);
代码[2][2]=scan.nextInt();
系统输出打印项次(“输入”);
System.out.println(“{”+代码[0][0]+“}{”+代码[0][1]+“}{”+代码[0][2]+“}”);
System.out.println(“{”+代码[1][0]+“}{”+代码[1][1]+“}{”+代码[1][2]+“}”);
System.out.println(“{”+代码[2][0]+“}{”+代码[2][1]+“}{”+代码[2][2]+“}”);
//猜测
startTime=System.nanoTime();
while(已解决==false){
正确=0;
newnumb=false;
while(newnumb==false){
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=1;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=2;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=3;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=4;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=5;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=6;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=7;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=8;
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=9;
//随机输入零
零=gen.nextInt(100);
如果(0==0){
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=0;
}
零=gen.nextInt(100);
如果(0==0){
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=0;
}
零=gen.nextInt(100);
如果(0==0){
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=0;
}
零=gen.nextInt(100);
如果(0==0){
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=0;
}
零=gen.nextInt(100);
如果(0==0){
x=第二代(3);
y=gen.nextInt(3);
猜测[x][y]=0;
}
//检查是否是新的
对于(int i=0;i>ran;i++){
if(猜测!=UsedCodes.get(i)){
正确的++;
}
}
如果(正确==运行){
newnumb=true;
ran++;
}
}
//将猜测添加到ArrayList
添加(猜测);
//你猜怎么说
System.out.println(“”);
System.out.println(“{”+猜测[0][0]+“}{”+猜测[0][1]+“}{”+猜测[0][2]+“}”);
System.out.println(“{”+猜测[1][0]+”}{”+猜测[1][1]+“}{”+猜测[1][2]+“}”);
System.out.println(“{”+猜测[2][0]+“}{”+猜测[2][1]+“}{”+猜测[2][2]+“}”);
//检查是否有效
如果(代码[0][0]==猜测[0][0]&&code[0][1]==猜测[0][1]&&code[0][2]&&code[1][0]==猜测[1][0]&&code[1][1]==猜测[1][1]&&code[1][2]&&code[2][0]==猜测[2][0]&&code[2][1]==猜测[2][1]&&code[2][2][2]==猜测[2][2]){
已解决=正确;
endTime=System.nanoTime();
ran++;
}
否则{
猜测[0][0]=0;
猜测[0][1]=0;
猜测[0][2]=0;
猜测[1][0]=0;
猜测[1][1]=0;
猜测[1][2]=0;
猜测[2][0]=0;
猜测[2][1]=0;
猜测[2][2]=0;
}
}   
System.out.println(“解决方案”);
System.out.println(“{”+猜测[0][0]+“}{”+猜测[0][1]+“}{”+猜测[0][2]+“}”);
System.out.println(“{”+猜测[1][0]+”}{”+猜测[1][1]+“}{”+猜测[1][2]+“}”);
System.out.println(“{”+猜测[2][0]+“}{”+猜测[2][1]+“}{”+猜测[2][2]+“}”);
println(“在:+((endTime-startTime)/1000000000)+“秒”中中断您的密码);
} }


谢谢

为什么随机它永远找不到秘密模式。您要做的是尝试所有可能的组合(蛮力方法)

有两种情况:3.. 12. ..4
123
456
789
import java.util.*;

public class Cracker {
    static List<Integer> secret = new ArrayList<Integer>() {{
        add(4); add(5); add(1); add(9);
    }};

    static final int MIN_DIGITS = 1;
    static final int MAX_DIGITS = 9;

    static List<Integer> crack(List<Integer> left, List<Integer> choosen, 
            int depth) {
        if (left.isEmpty() || depth == 0) {
            return choosen.equals(secret) ? choosen : null;
        }
        for (int i = 0; i < left.size(); i++) {
            int choice = left.get(i);
            left.remove(i);
            choosen.add(choice);
            List<Integer> res = crack(left, choosen, depth - 1);
            left.add(i, choice);
            if (res != null) return res;
            choosen.remove(choosen.size() - 1);
        }
        return null;
    }

    public static List<Integer> crack() {
        for (int i = MIN_DIGITS; i <= MAX_DIGITS; i++) {
            List<Integer> left = new ArrayList<Integer>() {{
                add(1); add(2); add(3);
                add(4); add(5); add(6);
                add(7); add(8); add(9);
            }};
            List<Integer> choosen = new ArrayList<Integer>();
            List<Integer> res = crack(left, choosen, i);
            if (res != null) return res;
        }
        return null;
    }

    public static void print(List<Integer> board) {
        for (int i = 1; i < 10; i++) {
            System.out.print(board.contains(i) ? board.indexOf(i) + 1 : ".");
            if (i % 3 == 0) System.out.println();
        }
    }

    public static void main(String[] args) {
        print(secret);
        System.out.println();
        print(crack()); // should be the same!
    }
}
        for(int i=0; i>ran; i++){
        for (int i=0; i<ran; i++)…
    //Add Guess to ArrayList
    UsedCodes.add(guess);
        //Check if New
        for(int i=0; i…
            if(guess!=UsedCodes.get(i)){
    while (solved==false)
    {
        guess = new int[3][3];
        // Check if new
        for (int i=0; i<ran; i++)
        {
            if (!Arrays.deepEquals(guess, UsedCodes.get(i)))…