我的数独求解器工作得很好,现在我想做的就是 "检查"当用户点击"解决"按钮。这是一个用户输入的自定义数独, 所以根据用户在盒子上的输入,解算器将解决。
我正在尝试检查用户是否放置了无效值,例如" 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 ;
}
答案 0 :(得分:0)
是的,你有线程问题;如果你在一个线程中运行所有代码,它就无法在窗口上绘制并运行循环。在更新GUI之前,它将等待循环完成。线程允许您一次运行多段代码,这可能很危险。
想象一下两个人需要使用同一个浴室。如果这些人是代码,他们会抛出错误,而不是发脾气。因此,为了避免错误,线程应该避免修改其他人的数据(他们可以查看彼此的数据而没有太多问题,而且通常是必要的)。您的数独求解类应使用Runnable
接口,该接口允许创建线程。您需要提供一个run()
方法,其中包含用于线程的代码。然后,在按钮的actionPerformed代码中,调用new Thread(new SudokuChecker()).start();
确保你使用swing作为一个线程(我忘记了代码,但它涉及SwingUtilities.invokeRunnable...
,并且可以在整个网络上找到。线程是一个非常麻烦的工作,但他们没有&# 39;如果他们做自己的事情会导致许多问题。当他们开始改变而不是简单地检查其他线程的数据时会遇到问题。