Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “熄灯”有效性检查_Java_Solver - Fatal编程技术网

Java “熄灯”有效性检查

Java “熄灯”有效性检查,java,solver,Java,Solver,我一直在尝试编写一个熄灯游戏,并对游戏及其机制进行了编码。我唯一的问题是,每一个难题都不是可以解决的。我试图编写一个方法来检查它创建的谜题的可解性,但是当我运行游戏时,现在什么也没有显示。这场比赛从来没有进行过。我相信它被固定在checkValidity方法中的某个地方,但我不确定在哪里。有什么帮助吗 import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JOptionPane; import java

我一直在尝试编写一个熄灯游戏,并对游戏及其机制进行了编码。我唯一的问题是,每一个难题都不是可以解决的。我试图编写一个方法来检查它创建的谜题的可解性,但是当我运行游戏时,现在什么也没有显示。这场比赛从来没有进行过。我相信它被固定在checkValidity方法中的某个地方,但我不确定在哪里。有什么帮助吗

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.GridLayout;
import java.awt.Dimension;
import java.awt.Color;

import java.util.Random;

public class buildBoard {
    public static JButton[][] board = new JButton[5][5];
    public static boolean[][] color = new boolean[5][5];;
    JFrame frame = new JFrame();

    public static UIManager UIManager = new UIManager();

    public static int boardWidth, boardHeight, numBlack, moves = 0;

    public static String bottomRow = "";
    public static boolean isSolvable = false;

    public buildBoard(final int width, final int height){

        boardWidth = width;
        boardHeight = height;

        frame.setLayout(new GridLayout(5, 5));

        boolean[][] color = new boolean[boardWidth][boardHeight];

        for(int a = 0; a < width; a++){
            for(int b = 0; b < height; b++){
                board[a][b] = new JButton();
            }
        }
        generateLights();
        while(isSolvable == false){
        generateLights();
        checkValidity();
        if(isSolvable == false){
                for(int c = 0; c < boardWidth; c++){
                    for(int d = 0; d < boardHeight; d++){
                        color[c][d] = false;
                    }
                }
            }
        }
        for(int a = 0; a < width; a++){
            for(int b = 0; b < height; b++){    
                board[a][b].addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        moves++;
                        for (int i = 0; i < width; i++) {
                            for (int j = 0; j < height; j++){
                                if(e.getSource()==board[i][j]){ //gameButtons[i][j] was clicked
                                    if(board[i][j].getBackground() == Color.BLUE){
                                        board[i][j].setBackground(Color.BLACK);
                                    }
                                    else{
                                        board[i][j].setBackground(Color.BLUE);
                                    }
                                    if(j > 0 && (board[i][j-1].getBackground() == Color.BLUE)){
                                        board[i][j-1].setBackground(Color.BLACK);
                                    }
                                    else if(j > 0){
                                        board[i][j-1].setBackground(Color.BLUE);
                                    }
                                    if(i > 0 && board[i-1][j].getBackground() == Color.BLUE){
                                        board[i-1][j].setBackground(Color.BLACK);
                                    }
                                    else if (i > 0){
                                        board[i-1][j].setBackground(Color.BLUE);
                                    }
                                    if(i < width-1 && board[i+1][j].getBackground() == Color.BLUE){
                                        board[i+1][j].setBackground(Color.BLACK);
                                    }
                                    else if(i < width-1){
                                        board[i+1][j].setBackground(Color.BLUE);
                                    }
                                    if(j < height-1 && board[i][j+1].getBackground() == Color.BLUE){
                                        board[i][j+1].setBackground(Color.BLACK);
                                    }
                                    else if(j < height-1){
                                        board[i][j+1].setBackground(Color.BLUE);
                                    }
                                    checkIfWon();
                                }
                            }
                        }
                    }
                });
            try {
                UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
            } catch (Exception e) { } 
            frame.add(board[a][b]);
        }
    }

    frame.setTitle("Lights Out!");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setMinimumSize(new Dimension(250, 250));
    frame.pack();
    frame.setVisible(true);

}

public void checkIfWon(){
    int numBlack = 0;
    for(int i = 0; i < boardWidth; i++){
        for(int j = 0; j < boardHeight; j++){
            if(board[i][j].getBackground() == Color.BLACK){
                numBlack++;
            }
        }
    }
    if(numBlack == 25){
        JOptionPane.showMessageDialog(null, "Hooray! You Won!\nYou won in " + moves + " moves.");
        System.exit(0);
    }
}

public static void checkValidity(){     
    for(int j = 0; j < boardHeight - 1; j++){
        for(int i = 0; i < boardWidth; i++){
            if(color[i][j] == true){
                if(color[i][j] == true){
                    color[i][j] = false;
                }
                else{
                    color[i][j] = true;
                }
                if(j > 0 && color[i][j+1] == true){
                    color[i][j+1] = false;
                }
                else if(j > 0){
                    color[i][j+1] = true;
                }
                if(i > 0 && color[i-1][j+1] == true){
                    color[i-1][j+1] = false;
                }
                else if (i > 0){
                    color[i-1][j+1] = true;
                }
                if(i < boardWidth-1 && color[i+1][j+1] == true){
                    color[i+1][j+1] = false;
                }
                else if(i < boardWidth-1){
                    color[i+1][j+1] = true;
                }
                if(j < boardHeight-2 && color[i][j+2] == true){
                    color[i][j+2] = false;
                }
                else if(j < boardHeight-2){
                    color[i][j+2] = true;
                }
            }
        }
    }
    for(int c = 0; c < boardWidth; c++){
        if(color[4][c] == true){
            bottomRow += "1";
        }
        else{
            bottomRow += "0";
        }
    }
    if(bottomRow.equals("10001") || bottomRow.equals("01010") || bottomRow.equals("11100") || bottomRow.equals("00111") || bottomRow.equals("10110") || bottomRow.equals("01101") || bottomRow.equals("11011")){
        isSolvable = true;
    }
    else{
        isSolvable = false;
    }
}

public static void generateLights(){
    Random random = new Random();

    for(int a = 0; a < boardWidth; a++){
        for(int b = 0; b < boardHeight; b++){
            if(random.nextInt(99)+1 > 75){
                board[a][b].setBackground(Color.BLUE);
                color[a][b] = true;
            }else{
                board[a][b].setBackground(Color.BLACK);
                color[a][b] = false;
            }
        }
    }
}

    public static void main(String []args){
        new buildBoard(5, 5);
    }
}
checkValidity方法是问题所在,并发布在此处,上面列出了使用该方法的其余代码,以防万一:

public static void checkValidity(){     
    for(int j = 0; j < boardHeight - 1; j++){
        for(int i = 0; i < boardWidth; i++){
            if(color[i][j] == true){
                if(color[i][j] == true){
                    color[i][j] = false;
                }
                else{
                    color[i][j] = true;
                }
                if(j > 0 && color[i][j+1] == true){
                    color[i][j+1] = false;
                }
                else if(j > 0){
                    color[i][j+1] = true;
                }
                if(i > 0 && color[i-1][j+1] == true){
                    color[i-1][j+1] = false;
                }
                else if (i > 0){
                    color[i-1][j+1] = true;
                }
                if(i < boardWidth-1 && color[i+1][j+1] == true){
                    color[i+1][j+1] = false;
                }
                else if(i < boardWidth-1){
                    color[i+1][j+1] = true;
                }
                if(j < boardHeight-2 && color[i][j+2] == true){
                    color[i][j+2] = false;
                }
                else if(j < boardHeight-2){
                    color[i][j+2] = true;
                }
            }
        }
    }
    for(int c = 0; c < boardWidth; c++){
        if(color[4][c] == true){
            bottomRow += "1";
        }
        else{
            bottomRow += "0";
        }
    }
    if(bottomRow.equals("10001") || bottomRow.equals("01010") || bottomRow.equals("11100") || bottomRow.equals("00111") || bottomRow.equals("10110") || bottomRow.equals("01101") || bottomRow.equals("11011")){
        isSolvable = true;
    }
    else{
        isSolvable = false;
    }
}

public static void generateLights(){
    Random random = new Random();

    for(int a = 0; a < boardWidth; a++){
        for(int b = 0; b < boardHeight; b++){
            if(random.nextInt(99)+1 > 75){
                board[a][b].setBackground(Color.BLUE);
                color[a][b] = true;
            }else{
                board[a][b].setBackground(Color.BLACK);
                color[a][b] = false;
            }
        }
    }
}

问题确实出在您的有效性检查器中,特别是您的bottowRow永远无效

在第一次运行时,您生成了一个无效的5个字符的字符串,然后重新开始,但您从未重置该字符串,而是一直附加到该字符串,使其不断增长。我修改了你的程序以输出它检查的每一行,这就是我得到的

Checking bottom row: 00001
Checking bottom row: 0000100000
Checking bottom row: 000010000000000
Checking bottom row: 00001000000000000000
Checking bottom row: 0000100000000000000000000
Checking bottom row: 000010000000000000000000000000
Checking bottom row: 00001000000000000000000000000000001
重新生成电路板时,需要将数据结构重置为空


从风格上讲,过度使用类级变量会损害您在此进行调试的能力,您应该尽可能将数据保持在本地。例如,放弃使用statics,改为使用things实例变量,让您的方法返回数据,而不仅仅是设置数据

使用调试器或探查器来准确地找出它被卡住的位置,例如,只需在调试器中运行一段时间,然后暂停,然后查看堆栈在该点的位置。我猜它在某个地方进入了一个无限循环。你可以将跟踪代码放在其中,更改窗口上的标题,这样你就知道它停在哪里了。请细化你的问题,以指向与你的代码最相关的部分。第172行bottomRow+=0;我不知道该怎么办…为什么所有的反对票和接近票?这似乎是一个合理的问题,OP甚至成功地指向了代码区域,在该区域中,实际问题isI试图在循环之前和方法调用之前添加bottomRow重置,但没有更改。顺便说一句,谢谢你的风格提示,但出于某种原因,我似乎总是在返回时遇到麻烦。如果没有重置,就永远不会产生进一步的序列。bottomRow变量永远不会在方法之外读取,因此请去掉公共静态字符串bottomRow=;而是将字符串bottomRow=包含在上面第一次使用它的checkValidity方法中。这不会完全解决您的问题,因为您在该方法中的实际逻辑存在问题,特别是您的checkValidity方法正在修改它应该检查的数据,因此无论颜色数组中出现什么值,它都会切换到[false,false,false,false,false]或[false][假,假,假,假,真]-它永远不会生成正确的序列。不知道您实际要做什么,我将无法提供更多帮助抱歉没有回复,我这个周末很忙。无论如何,我尝试的是让checkValidity方法确定生成的矩阵是否是一个可解的熄灯游戏。我是通过hav完成的让电脑玩出这个谜题,直到它达到一个点,在这个点上,可以很容易地检查有效性,而最下面的一行是对照检查序列的。