2017-07-26 23 views
0

我正在嘗試爲遊戲編寫一個Trade插件。我的想法是,玩家向其他玩家發送請求,如果其他玩家接受,則每方都必須選擇要交易的物品。如何在ArrayList中設置特定的項目,而不會出現OutOfBounds錯誤?

我有4個ArrayList: 存儲請求者,存儲請求者,存儲請求者選擇的項目和存儲請求的選擇項目。問題是,如果多個玩家同時進行交易,我不能只是將該商品添加到列表中,因爲它可以與其他人的交易相匹配。我試圖這樣做:

requesterItems.set(requesterIndex, clicked); 

其中requesterIndex是請求者在另一個列表中的索引,並且clicked是選擇的項目。

我知道爲什麼會出現錯誤,但我無法想到解決方法。問題是List是空的,並且這個索引沒有元素。如何在不觸及列表中的其他位置的情況下添加元素?

+0

你爲什麼要對所有交易使用相同的清單?這聽起來像一個糟糕的設計恕我直言 – Lino

+0

因爲我必須以某種方式儲存物品,所以當雙方都接受時我可以把它們放在玩家的庫存中。你有什麼想法? –

+4

您可以改爲使用地圖。另外,我會建議你重新考慮你的解決方案。我建議你創建一個類似貿易類的東西,在那裏存儲一筆交易的信息。 – Christian

回答

2

如果可能,我會避免使用具體索引,而使用對象。

正如已經在評論中提到的那樣,我會推薦一個帶有HashMap的自己的類。下面有一些代碼像我會做(未測試!):

private HashMap<YourPlayerClass, List<YourItemClass>> playerItemMap = new HashMap<>(); 

private void tradeItems(YourPlayerClass p_player1, YourPlayerClass p_player2, 
         YourItemClass p_itemOfPlayer1, YourItemClass p_itemOfPlayer2) 
{ 
    List<YourItemClass> itemsOfPlayer1 = playerItemMap.get(p_player1); 
    List<YourItemClass> itemsOfPlayer2 = playerItemMap.get(p_player2); 

    //Carry out the trade for player 1 
    itemsOfPlayer1.remove(p_itemOfPlayer1); 
    itemsOfPlayer1.add(p_itemOfPlayer2); 
    playerItemMap.put(p_player1, itemsOfPlayer1); //Not sure if this put is necessary 

    //Carry out the trade for player 2 
    itemsOfPlayer2.remove(p_itemOfPlayer2); 
    itemsOfPlayer2.add(p_itemOfPlayer1); 
    playerItemMap.put(p_player2, itemsOfPlayer2); //Not sure if this put is necessary 
} 

所以那裏有與球員的關鍵和他/她的項目,如列表值一個HashMap。

該代碼示例不是故障安全的。我建議添加一些檢查項目是否真的在這個列表中以避免錯誤。喜歡:

if(itemsOfPlayer1.contains(p_itemOfPlayer1)) 
{ 
    //Carry out the trade 
} 
else 
    System.err.println("Player 1 tried to trade an item which wasn't in his/her inventory! Shouldn't be possible!"); 

我希望這有助於解決您的問題,讓我知道如果我錯了你!祝你好運!

相關問題