Java 在游戏中组合项目
在我的游戏中,用户将能够组合物品,如果兼容,将产生一个新物品。项目ID保存为int 我想知道这样做最有效的方法是什么,同时确保交换的订单始终会产生相同的结果,以便用户可以输入订单:Java 在游戏中组合项目,java,Java,在我的游戏中,用户将能够组合物品,如果兼容,将产生一个新物品。项目ID保存为int 我想知道这样做最有效的方法是什么,同时确保交换的订单始终会产生相同的结果,以便用户可以输入订单: item X + item Y = item Z item Y + item X = item Z 我最初想做一些简单的事情,比如开关: private int findItem(id1, id2) { int newID = 0; switch(id1) { c
item X + item Y = item Z
item Y + item X = item Z
我最初想做一些简单的事情,比如开关:
private int findItem(id1, id2)
{
int newID = 0;
switch(id1)
{
case 1:
if(id2.equals(4))
newID = 9;//Item 1 + Item 4 = Item 9
break;
}
return newID
}
但是,我不确定使用开关是否最有效(或整洁),如果函数以相反的顺序接收项目ID,我必须创建另一个案例。我还必须在一个案例中有一个案例来评估“id1”可以与之结合的所有东西
有没有一种简单的方法可以在保持效率的同时不跨越1000行?我建议使用
地图>
来存储食谱。它的键是一组需要的项目(可能不止两个),它的值是精心制作的项目
然后,您可以使用其.containsKey(Set)
方法检查配方是否存在,并使用其.get(Set)
方法获得精心编制的结果
请注意,您的项必须重写Object.hashCode()
,此解决方案才能工作
这里有一个小代码片段,以防不太清楚:我建议使用
Map>
来存储食谱。它的键是一组需要的项目(可能不止两个),它的值是精心制作的项目
然后,您可以使用其.containsKey(Set)
方法检查配方是否存在,并使用其.get(Set)
方法获得精心编制的结果
请注意,您的项必须重写Object.hashCode()
,此解决方案才能工作
这里有一个小代码片段,以防不太清楚:使用
==
比较基本类型值使用一些聪明的数学来选择ID,执行简单的加法,并从映射中获得结果项。有多少可能的项?@Andrewilliamson现在有几个,但我想继续添加新的项目,这样它将随着时间的推移而增长,并成为潜在的巨大项目。@haifzhan nice catch。谢谢。使用==
比较基本类型值使用一些聪明的数学来选择ID,执行简单的加法,并从映射中获得结果项。有多少可能的项?@AndrewWilliamson现在有几个,但我想继续添加新的项目,这样它将随着时间的推移而增长,并成为潜在的巨大项目。@haifzhan nice catch。谢谢。通过这种方式,你可以在一个单独的文件中定义配方,并使用它来填充地图,而不是将其作为代码的一部分。你提供的代码示例确实帮助我理解了这个概念,我能够调整它并使其工作!这个解决方案在确定菜谱返回项时是万无一失的吗,还是可能碰巧有一些东西共享同一个散列或笑料问题?编辑:您回复了我以前的评论,但我已将其更改为字符串。很抱歉给你带来了困惑。我现在将此标记为已解决。hashcodes在理论上无法保证足够大的集合(如所有可能字符串的无限集合)上的标识,因为它的int类型只有这么多唯一值。实际上,除非算法很差,否则使用相同的哈希代码得到两个不同的项是非常不幸运的。如果您需要保证相等,那么equals()就是您所需要的。这样,您可以在单独的文件中定义配方,并使用它来填充地图,而不是将其作为代码的一部分。您提供的代码示例确实帮助我理解了这个概念,并且我能够调整它并使其工作!这个解决方案在确定菜谱返回项时是万无一失的吗,还是可能碰巧有一些东西共享同一个散列或笑料问题?编辑:您回复了我以前的评论,但我已将其更改为字符串。很抱歉给你带来了困惑。我现在将此标记为已解决。hashcodes在理论上无法保证足够大的集合(如所有可能字符串的无限集合)上的标识,因为它的int类型只有这么多唯一值。实际上,除非算法很差,否则使用相同的哈希代码得到两个不同的项是非常不幸运的。如果您需要保证相等,那么equals()就是您所需要的。