2014-10-03 42 views
1

我正在構建河內遊戲塔,可以從控制檯或命令行播放。請注意,這不是一個遞歸程序;我正在嘗試構建一個可以由用戶播放的遊戲。我正在使用ArrayList的ArrayList存儲用戶選擇的釘(1,2,3)和光盤(N)。陣列列表ArrayList的掛鉤和光盤在河內遊戲塔

我的實例變量和構造函數:

private ArrayList lists; 
private ArrayList peg1 = new ArrayList<>(); 
private ArrayList peg2 = new ArrayList<>(); 
private ArrayList peg3 = new ArrayList<>(); 

//Constructor 
public TowersOfHanoi() { 

    ArrayList<Integer>[] lists = new ArrayList[3]; 
    lists[0]= this.peg1; 
    lists[1]= this.peg2; 
    lists[2]= this.peg3; 

} 

如何初始化遊戲

public ArrayList initializeGame(int n) { 

    for (int i = 1; i < n; i++) { 
     peg1.add(i); 
     } 
} 

我試圖讓,將採取兩個整數作爲從和崗位參數的移動方法。 I.E.用戶將光盤從帖子N移到帖子N,並檢查該移動是否合法。

我試圖找出過去幾個小時的情況,但我甚至無法弄清楚如何獲得適當的掛鉤並將磁盤從一個掛鉤移動到另一個掛鉤,更別說檢查一個更大的磁盤是不是' t被移動到較小的磁盤上。這是我想出來的方法,我得到一個空指針異常,這讓我認爲lists未正確初始化。這是我明顯錯誤的方法。

public void move(int moveFrom, int moveTo){ 

    lists.get(moveTo) 
    lists.add(0, moveTo); 
} 

因此,誰能幫助我瞭解如何使用int作爲索引,以獲得相應的PEG(int值由用戶輸入)和移動盤?

+0

你'lists'陣列被遮蔽了'lists'場(這是一個ArrayList,而不是一個數組, 順便一提)。因此,該字段永遠不會被分配,並將'null'作爲默認值。 – 2014-10-03 01:38:34

+0

好吧,我明白你在說什麼,我改成'this.lists = new ArrayList [3]'。但是,我的移動方法仍然是錯誤的,只是不確定如何處理這裏的邏輯。 – 2014-10-03 01:55:38

回答

1

列表,因爲您聲明型ArrayList

private ArrayList lists; 

的實例對象,它是空不被初始化。然後,在你的構造函數,你聲明並初始化ArrayList[]類型的本地對象 - 爲的ArrayList

ArrayList<Integer>[] lists = new ArrayList[3]; 

的數組,然後你把你釘到這個陣列ArrayList的的

lists[0]= this.peg1; 
lists[1]= this.peg2; 
lists[2]= this.peg3; 

和那麼你退出構造函數而不對數組做任何事情。您需要:

private ArrayList[] lists; 
private ArrayList peg1 = new ArrayList<>(); 
private ArrayList peg2 = new ArrayList<>(); 
private ArrayList peg3 = new ArrayList<>(); 

//Constructor 
public TowersOfHanoi() { 

    lists = new ArrayList[3]; 
    lists[0]= this.peg1; 
    lists[1]= this.peg2; 
    lists[2]= this.peg3; 

} 

OR

private ArrayList<ArrayList> lists = new ArrayList<>(3); 
private ArrayList peg1 = new ArrayList<>(); 
private ArrayList peg2 = new ArrayList<>(); 
private ArrayList peg3 = new ArrayList<>(); 

//Constructor 
public TowersOfHanoi() { 

    lists.add(this.peg1); 
    lists.add(this.peg2); 
    lists.add(this.peg3); 

} 

或最可能

private ArrayList[] lists = new ArrayList[3]; 
private ArrayList peg1 = new ArrayList<>(); 
private ArrayList peg2 = new ArrayList<>(); 
private ArrayList peg3 = new ArrayList<>(); 

//Constructor 
public TowersOfHanoi() { 

    lists[0]= this.peg1; 
    lists[1]= this.peg2; 
    lists[2]= this.peg3; 

} 
+0

好吧,我意識到我在構造函數中犯的錯誤。然而,當我解決它,我不能用'lists.get'或'lists.add'你的第一個和第三個構造函數將工作,但是,我得到了第二個錯誤。我最大的問題是理解移動方法中的邏輯。我不知道如何從用戶那裏獲得INT,並使用它來訪問相應的掛鉤。我以爲我可以這樣做'名單[moveFrom]獲得(0);'但我真的不知道怎麼說了.. – 2014-10-03 02:14:07

+0

對不起,我的前兩個例子都過的語法錯誤,但我固定他們。如果我們假設你使用#3,這是我的建議,那麼你可以使用'lists [moveFrom] .get(peg_number)'來訪問一個掛鉤''你可以用'list [moveFrom] .size'來檢查一個堆棧的大小 – 2014-10-03 14:10:54

+0

謝謝我最終使用了一個非常類似於數字2的語法。謝謝修復。 – 2014-10-07 00:52:27