Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在游戏中组合项目_Java - Fatal编程技术网

Java 在游戏中组合项目

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

在我的游戏中,用户将能够组合物品,如果兼容,将产生一个新物品。项目ID保存为int

我想知道这样做最有效的方法是什么,同时确保交换的订单始终会产生相同的结果,以便用户可以输入订单:

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()就是您所需要的。