编辑:感谢所有帮助我了解我必须做的事情以及问题所在的人。
SudokuStuff界面
public interface SudokuStuff
{
int[][] sudokuGrid = new int[][] {{2,4,0,6,8,0,3,0,0},
{0,0,0,0,0,0,9,0,0},
{6,5,0,0,1,0,0,8,7},
{0,0,0,0,0,7,0,9,8},
{9,3,2,5,0,8,7,1,4},
{7,1,0,4,0,0,0,0,0},
{4,9,0,0,7,0,0,2,5},
{0,0,5,0,0,0,0,0,0},
{0,0,1,0,4,5,0,7,3}};
void addNumber(int x, int y, int value);
void removeNumber(int x, int y);
void resetGrid();
void drawGrid();
}
数独课程
public class Sudoku implements SudokuStuff{
public void drawGrid(){
System.out.println(" ----- ----- ----- ");
for(int i = 0; i < 9; i++){
if(i==3||i==6){
System.out.println(" ----- ----- ----- ");
}
for(int j = 0; j < 9; j++){
if(j==0||j==3||j==6){
System.out.print(" |");
}
if(sudokuGrid[i][j] != 0){
System.out.print(" "+sudokuGrid[i][j]);
} else{
System.out.print(" ");
}
if(j==8){
System.out.print(" |");
}
}
System.out.println();
}
System.out.println(" ----- ----- ----- ");
}
public void addNumber(int x, int y, int value){
if(x>9||x<1||y>9||y<1||value>9||value<0){
System.out.println("Bad Input");
}else{
sudokuGrid[x-1][y-1] = value;
}
drawGrid();
}
public void removeNumber(int x, int y){
if(x>9||x<1||y>9||y<1){
System.out.println("Bad Input");
}else{
sudokuGrid[x-1][y-1] = 0;
}
drawGrid();
}
public void resetGrid(){
sudokuGrid = {{2,4,0,6,8,0,3,0,0},
{0,0,0,0,0,0,9,0,0},
{6,5,0,0,1,0,0,8,7},
{0,0,0,0,0,7,0,9,8},
{9,3,2,5,0,8,7,1,4},
{7,1,0,4,0,0,0,0,0},
{4,9,0,0,7,0,0,2,5},
{0,0,5,0,0,0,0,0,0},
{0,0,1,0,4,5,0,7,3}};
drawGrid();
}
}
所以为了回答我的问题,在SudokuStuff中我有一个2D预设值,在Sudoku中我有一个不起作用的resetGrid方法。如你所见,我希望它将网格重置为原始形式。这样做有什么建议吗?我现在拥有的是一个非法的表达错误开始。
如果您知道答案,请注意,是否有任何方法可以在交互窗格中从SudokuStuff运行Sudoku中的方法。这是我期中考试的一个练习题,我仍然对界面事物感到困惑。
任何帮助将不胜感激,如果我不立即回答它可能是因为我昏倒了,因为它已经很晚了。感谢。
答案 0 :(得分:1)
您的重置功能不起作用的原因是您在resetGrid函数中声明了一个具有相同名称的新变量,而不是将您想要的值分配给类级别变量。拿走sudokuGrid上的类型,它应该可以工作。
答案 1 :(得分:0)
您需要new int[][]
:
sudokuGrid = new int[][] {...};
我不认为(?)它甚至可以编译。您只能在声明变量时使用= {...}
,而不能重新分配变量。
决赛:
public void resetGrid(){
sudokuGrid = new int[][] {{2,4,0,6,8,0,3,0,0},
{0,0,0,0,0,0,9,0,0},
{6,5,0,0,1,0,0,8,7},
{0,0,0,0,0,7,0,9,8},
{9,3,2,5,0,8,7,1,4},
{7,1,0,4,0,0,0,0,0},
{4,9,0,0,7,0,0,2,5},
{0,0,5,0,0,0,0,0,0},
{0,0,1,0,4,5,0,7,3}};
}
在评论后修改:
好的编辑完全脱离了我的头脑而没有真正想到它。有一个静态的最终数组“默认值”,并用它来重置你修改的数组:
static final int[][] defaultGrid = new int[][] {{2,4,0,6,8,0,3,0,0},
{0,0,0,0,0,0,9,0,0},
{6,5,0,0,1,0,0,8,7},
{0,0,0,0,0,7,0,9,8},
{9,3,2,5,0,8,7,1,4},
{7,1,0,4,0,0,0,0,0},
{4,9,0,0,7,0,0,2,5},
{0,0,5,0,0,0,0,0,0},
{0,0,1,0,4,5,0,7,3}};
...
// This will reset the grid to whatever is in defaultGrid
// assuming they have the same lengths
for (int i = 0; i = sudokuGrid.length; i++) {
for (int y = 0; y = sudokuGrid[y].length; y++) {
sudokuGrid[i][y] = defaultGrid[i][y];
}
}
答案 2 :(得分:0)
您将要遇到的问题是在接口中声明的变量本质上是最终的。您可以做一些不同的事情,但最简单的方法是在数据库中创建一个变量,通过在运行时将sudokuGrid克隆到其中来填充,并且在重置时,只需通过再次重新调用sudokuGrid来重置它的值。
答案 3 :(得分:0)
在界面中声明的字段为static
和 final
(更不用说public
),换句话说,它们是常量,这意味着您无法重新分配他们。
如果您希望能够执行类似
的操作public void resetGrid(){
sudokuGrid = new int[][]{
{2,4,0,6,8,0,3,0,0},
{0,0,0,0,0,0,9,0,0},
{6,5,0,0,1,0,0,8,7},
{0,0,0,0,0,7,0,9,8},
{9,3,2,5,0,8,7,1,4},
{7,1,0,4,0,0,0,0,0},
{4,9,0,0,7,0,0,2,5},
{0,0,5,0,0,0,0,0,0},
{0,0,1,0,4,5,0,7,3}
};
drawGrid();
}
你应该在班上制作int[][] sudokuGrid
字段。
编辑:
如果必须在接口中声明此数组,则可以尝试重新分配其行(它们不是最终的)。以下是如何执行此操作的示例:
public void resetGrid(){
int[][] tmp = {
{2,4,0,6,8,0,3,0,0},
{0,0,0,0,0,0,9,0,0},
{6,5,0,0,1,0,0,8,7},
{0,0,0,0,0,7,0,9,8},
{9,3,2,5,0,8,7,1,4},
{7,1,0,4,0,0,0,0,0},
{4,9,0,0,7,0,0,2,5},
{0,0,5,0,0,0,0,0,0},
{0,0,1,0,4,5,0,7,3}
};
for (int i=0; i<sudokuGrid.length; i++)
sudokuGrid[i]=tmp[i];
drawGrid();
}