2014-02-16 69 views
0

編輯:謝謝大家誰幫助我瞭解我必須做什麼和問題是什麼。重新分配二維數組的值

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與預設值,在數獨我有一個resetGrid方法不工作。正如你所看到的,我希望它將網格重置爲原始形式。有關這樣做的任何建議?我現在擁有的表達錯誤非法開始。

如果你知道答案,還有一個附註,有沒有什麼辦法可以在交互窗格中從SudokuStuff的Sudoku中運行方法。這是我的中期練習題,並且仍然與界面事物混淆。

任何幫助將不勝感激,如果我不立即回答它的可能是因爲我昏昏欲睡,因爲它晚了很晚在這裏。謝謝。

+0

'SodokuStuff'有什麼意義?你計劃有多種Sodoku的實現嗎? –

+0

你知道在接口中聲明的字段是靜態的嗎?換句話說,它們是常量。 – Pshemo

+0

@Pshemo那麼我怎麼能改變他們與我的add/removeNumber方法,我不懷疑你,我只是不知道。 – Kevin

回答

0

字段是staticfinal(更不用說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(); 
} 
+0

我的導師希望我保持界面類不變,所以我會學習如何在同一時間使用二維數組和接口。 – Kevin

+0

這是一個完美的方式來解決它它是最終沒有這樣做http://puu.sh/6Y1Bs/ab6413d09e.txt,非常感謝你。 – Kevin

1

重置函數不起作用的原因是您在resetGrid函數中聲明瞭一個具有相同名稱的新變量,而不是將所需的值分配給類級變量。拿走sudokuGrid上的類型,它應該工作。

+0

Sory爲淹沒我認爲我混淆了Smitty以及我在那裏重新宣佈它的原因是因爲我測試的東西,當我只是sudokuGrid = {...}它給了我非法表達式的開始。 – Kevin

+0

啊,好的。其他人解釋了這是爲什麼。無論如何,你可能不希望這樣做,因爲它要求你在代碼中有兩個正確的值。通常這是不好的 - 如果你改變一個,你會忘記改變另一個。我會給你一個提示 - 正確的解決方案涉及到數組的「深層複製」 - 不僅複製參考位置,而且還複製所有單個值,以便您擁有遊戲網格的當前和初始狀態。 –

+0

不好意思,謝謝。但即時通話將會是一個晚上。我檢查回明日。 – Kevin

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]; 
    } 
} 
+0

很抱歉的混亂,我帽中的int [] []那裏當我在測試的東西,當我嘗試使用 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}}; 它說非法開始表達。 – Kevin

+0

oooo請參閱我的編輯 – Smitty

+0

對不起,當我輸入你建議的內容時,我搞砸了,但是你說得對,我沒有重新分配一個final,但removeNumber和addNumber是如何工作的?猜想不得不穀歌更多的東西,找出如何重置值。 – Kevin

0

你要碰到的問題是在接口中聲明的變量基本上是最後的。你可以做一些不同的事情,但最簡單的做法是在數獨中創建一個變量,通過在運行時將sudokuGrid克隆到其中,並在重置時通過再次重新分配sudokuGrid來重置它。在接口中聲明

+0

感謝您的建議,生病回覆很快希望有一次我Google如何做到這一點。對於編程還有點新意。 – Kevin