2017-07-26 4 views
0

ゲーム用のTradeプラグインをコーディングしようとしています。私の考えは、プレイヤーが別のプレイヤーにリクエストを送信し、他のプレイヤーがそれを受け入れる場合は、各サイドがトレードするアイテムを選択する必要があるということです。どのようにOutOfBoundsエラーを取得せずに、ArrayList内の特定の項目を設定できますか?

私は4つのArrayListsを持っています: リクエスタを保存するために、要求されたものを保存し、リクエスタが選択したアイテムを保存し、要求されたアイテムを保存する。問題は、複数のプレイヤーが同時に取引する場合、誰かの取引と一致することができるので、リストにアイテムを追加するだけでは不十分であるということです。私はこれを実行しようとしました:requesterIndexは、他のリスト内のリクエスタの指標であり、クリック

requesterItems.set(requesterIndex, clicked); 

が選択されているアイテムです。

エラーが発生する理由を知っていますが、回避策は考えられません。問題は、Listが空であり、このインデックスに要素がないことです。リストの他の場所に触れることなく、そこに要素を追加するにはどうすればよいですか?

+0

なぜすべてのトランザクションで同じリストを使用していますか?これは悪いデザインのように聞こえますIMHO – 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をtheresの。

このコード例は、安全に問題がないわけではありません。アイテムを実際にこのリストに入れてエラーを回避するには、何らかのチェックを追加することをお勧めします。 Like:

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!"); 

私はこれがあなたの問題を解決するのに役立つことを願っています。あなたが間違っているかどうか教えてください!がんばろう!

関連する問題