【问题标题】:JAVA - sudoku weird bugJAVA - 数独奇怪的错误
【发布时间】:2014-06-03 12:52:00
【问题描述】:

我的数独求解器工作得很好,现在我要做的就是 当用户单击“解决”按钮时“检查”。这是一个采用自定义数独的用户输入, 因此,根据用户在框上的输入,求解器将求解。

我正在尝试检查用户是否输入了无效值,例如“1 1 2 3 4 5 6 7 8”,因为“1 1”而这将是错误的。因为我有自己的 checkRow、checkBox、checkCol 方法,用于解决难题,所以我会在运行之前使用这些方法检查任何无效值 - 因为如果用户输入无效值,程序将冻结。

非常奇怪的是,我的 sysout 插入尝试调试,我得到以下信息:

I, J, NUM 0 0 1

方法行:真

主R:假

主 C: 假

主B:假

方法行:真

检查:0、0、假

方法行:真

which METHOD 显示 checkRow 方法的返回值,而 Main R 显示从解决 actionListener 调用时的返回值,位于 main() 中。

线程问题??我对 JAVA 不太熟悉,所以我确实将大部分代码放在了 main 中(我知道这不好,但我仍在学习)。

提前感谢您的帮助。

solve.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent event) {

            solve.setEnabled(false);

            for (int i=0; i<9; i++) {
                for (int j=0; j<9; j++) {

                    try {

                        problem[i][j]=Integer.parseInt(board[i][j].getText());  
                        System.out.println("I, J, NUM " +i+" "+j+" "+problem[i][j]);
                        System.out.println("TOP R: " + checkRow(i, problem[i][j]));
                        System.out.println("TOP C: " + checkCol(j, problem[i][j]));
                        System.out.println(("TOP B:" + checkBox(i, j, problem[i][j])));
                        if(problem[i][j] != 0){
                                System.out.println
                                ("Check: " + i +", "+j +", " +check(i, j, problem[i][j]));
                             if( !check(i, j, problem[i][j])) {
                                 solve.setEnabled(true);
                                 JOptionPane.showMessageDialog(null, "Bad Input!");
                                 clear_board();
                                 return;
                             }
                        }
                    }catch(NumberFormatException e) {

                        problem[i][j] = 0;
                    }
                }
            }
            try {

                solve_s(0,0);
            } catch (Exception e) {
            }               
        }
    });

/** 检查 num 是否是给定行的可接受值 */

protected static boolean checkRow( int row, int num )
{
  for( int col = 0; col < 9; col++ ) {
         if( problem[row][col] == num ) {
                System.out.println("ROW C: "+ (problem[row][col] == num));
            return false ;
    }
      return true;
   }

   /** Checks if num is an acceptable value for the given column */
   protected static boolean checkCol( int col, int num )
   {
      for( int row = 0; row < 9; row++ ){
        //  System.out.println("COL C: "+ (problem[row][col] == num));
         if( problem[row][col] == num )
            return false ;
      }
      return true ;
   }

   /** Checks if num is an acceptable value for the box around row and col */
   protected static boolean checkBox( int row, int col, int num )
   {
      row = (row / 3) * 3 ;
      col = (col / 3) * 3 ;

      for( int r = 0; r < 3; r++ ) {
         for( int c = 0; c < 3; c++ ) {
         if( problem[row+r][col+c] == num ) {
            // System.out.println("BOX C: "+ (problem[row][col] == num));
            return false ;
         }
         }
      }

      return true ;
   }

【问题讨论】:

    标签: java sudoku


    【解决方案1】:

    是的,你有线程问题;如果您在一个线程中运行所有代码,则它不能在窗口上绘制并运行循环。在更新您的 GUI 之前,它将等待循环完成。线程允许您一次运行多段代码,这可能很危险。

    想象两个人需要使用同一间浴室。如果这些人是代码,他们会抛出错误,而不是发脾气。因此,为避免错误,线程应该避免修改彼此的数据(他们可以查看彼此的数据而不会出现太多问题,而且通常是必要的)。您的数独求解类应使用Runnable 接口,该接口允许创建线程。您需要提供一个 run() 方法,其中包含用于线程的代码。然后,在按钮的 actionPerformed 代码中,调用 new Thread(new SudokuChecker()).start();

    确保您使用 swing 作为线程(我忘记了代码,但它涉及 SwingUtilities.invokeRunnable...,并且可以在整个网络上找到。线程是一个巨大的麻烦,但它们不会导致如果他们自己做,就会出现很多问题。当他们开始更改而不是简单地检查其他线程的数据时,您就会遇到问题。

    【讨论】:

    • “想象一下两个人需要使用同一个卫生间。如果这些人是代码,他们会抛出错误,而不是发脾气”哈哈
    • 我明白了,谢谢您的解释!抱歉,我不能投票(我认为),因为我的分数太低了
    • 顺便问一下,我想知道,难道不能只检查然后更新视图吗??
    • @user2130500 这是可能的,但需要非常快速地检查以避免冻结 GUI。总体而言,最好在与 GUI 不同的线程中使用需要很长时间才能完成的方法,例如游戏循环(直到游戏结束才停止),以避免冻结。因此,您可以清楚地了解如何设置线程,我为您提供了一个不错的教程的链接。事实上,看起来我也可以使用它^^; javaworld.com/article/2074217/java-concurrency/…
    • 嗯,实际上,我刚刚实现了插入(将所有用户的文本字段输入更改为 int[][])、检查(检查所有 int[9][9] 是否有错误)和求解。 Solve 有效,但 insert 和 check 不能正常工作,尽管它们使用与 solve 相同的方法进行检查。你还觉得是线程问题吗??
    猜你喜欢
    • 2015-06-02
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多