让我们说我有一个名为mapId的整数和一个由地图编号组成的三个int数组的集合。根据用户所在的地图,将生成一个项目。对于此示例,我们可以将以下三个项目称为:common_item
,uncommon_item
和rare_item
。
int mapId;
int[] easyMaps = { 7, 10, 3, 44 };
int[] mediumMaps = { 17, 14, 32, 11, 79, 80, 82, 90, 111 };
int[] hardMaps = { 92, 98, 112, 145 };
我希望做的事情如下:
如果玩家在一张简单的地图上,则会产生:common_item
如果玩家位于中等难度的地图上,则会产生:uncommon_item
和common_item
如果玩家在硬地图上,则会产生:rare_item
,uncommon_item
和common_item
如果不编写三个单独的for循环并分别循环遍历三个数组,我怎么能实现这个目的?在没有大量使用数组和循环的情况下,是否有更好的方法来实现这种层次结构的概念?
答案 0 :(得分:2)
您无需手动迭代这些每个数组。你可以使用Array.IndexOf<int>(array, value)
。此函数将返回给定数组中值的index
,如果它不在数组中,则返回-1
。您可以使用与此类似的if语句:
if(Array.IndexOf<int>(easyMaps, mapId) != -1){
//Spawn common_item
}
答案 1 :(得分:2)
除了其他答案之外,我喜欢的另一个选项是System.Linq
命名空间Contains。
然后你可以写:
if(easyMaps.Contains(mapId)) {
//stuff
}
我个人更喜欢这种可读性。
答案 2 :(得分:1)
您可以在此处使用 Array.Exists 方法,如下所示:
if(Array.Exists(easyMaps, mapId)) { // common_items
// your logic
}
if(Array.Exists(mediumMaps, mapId)) { // uncommon_items
// your logic
}
if(Array.Exists(hardMaps, mapId)) { // rare_items
// your logic
}
希望这会有所帮助!!
答案 3 :(得分:0)
<强>问题强>:
给定mapId,获得难度级别,然后决定产生什么。
<强>解决方案:强>
使用Dictionary保持从mapId到Level的链接,增加的好处是字典中的查找比搜索数组更快。
以下是代码:
namespace StackOverflow27884119
{
public enum Level
{
Easy,
Medium,
Hard
}
class Program
{
private static Dictionary<int, Level> mapsDictionary = new Dictionary<int, Level>()
{
{7, Level.Easy}, {10, Level.Easy}, {3, Level.Easy}, {44, Level.Easy},
{17, Level.Medium}, {14, Level.Medium}, /*...*/ {111, Level.Medium},
{92, Level.Hard}, {98, Level.Hard}, {112, Level.Hard}, {145, Level.Hard},
};
static void Main(string[] args)
{
var mapId = 3;
SpawnItem(3);
}
private static void SpawnItem(int mapId)
{
Level level;
bool found = mapsDictionary.TryGetValue(mapId, out level);
if (found)
{
switch (level)
{
case Level.Easy:
// spawn common_item
break;
case Level.Medium:
// spawn common_item
// spawn uncommon_item
break;
case Level.Hard:
// spawn common_item
// spawn uncommon_item
// spawn rare_item
break;
}
}
}
}
}
PS:我并不完全明白产生某个项目的意义。如果它是某种行为,你可以考虑使用策略模式而不是切换案例。