我正在尝试为游戏编写Trade插件代码。我的想法是玩家向另一个玩家发送请求,如果另一个玩家接受,那么每一方都必须选择要交易的项目。
我有4个ArrayLists: 存储请求者,存储所请求的,存储请求者所选择的项目并存储所请求的所选项目。问题在于,如果多个玩家同时进行交易,我只能将该项目添加到列表中,因为它可以与其他人的交易相匹配。我试着这样做:
requesterItems.set(requesterIndex, clicked);
其中requesterIndex是另一个列表中请求者的索引,单击是选择的项目。
我知道为什么会出现错误,但我无法想到解决方法。问题是List是空的,并且此索引中没有元素。如何在不触及列表中的其他位置的情况下在其中添加元素?
答案 0 :(得分: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,其中玩家为关键,而他/她的项目为List-value。
代码示例不是故障安全的。我建议添加一些检查项目是否真的在此列表中,以避免错误。像:
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!");
我希望这有助于解决您的问题,如果我错了,请告诉我!祝你好运!