JAVA - 数独奇怪的bug

时间:2014-04-18 23:17:35

标签: java sudoku

我的数独求解器工作得很好,现在我想做的就是 "检查"当用户点击"解决"按钮。这是一个用户输入的自定义数独, 所以根据用户在盒子上的输入,解算器将解决。

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

非常奇怪的是我的sysout插入试图和调试,我得到以下内容:

I,J,NUM 0 0 1

METHOD ROW:true

MAIN R:false

主C:假

主B:假

METHOD ROW:true

检查:0,0,假

METHOD ROW:true

哪个METHOD显示checkRow方法的返回值,而Main R显示从solve actionListener调用时的返回值,该操作位于main()中。

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

感谢您提前提供任何帮助。

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 ;
   }

1 个答案:

答案 0 :(得分:0)

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

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

确保你使用swing作为一个线程(我忘记了代码,但它涉及SwingUtilities.invokeRunnable...,并且可以在整个网络上找到。线程是一个非常麻烦的工作,但他们没有&# 39;如果他们做自己的事情会导致许多问题。当他们开始改变而不是简单地检查其他线程的数据时会遇到问题。