【问题标题】:Static vs Dynamic programming静态与动态编程
【发布时间】:2013-01-22 07:20:09
【问题描述】:

我知道为了清理您的代码,您需要使用循环。即,而不是说

myItem = myArray[0]
my2ndItem = myArray[1]

最多 100 个左右的元素将占用 100 行代码,而且会很丑陋。 使用循环可以使它变瘦并看起来不错/更高效。

假设您正在创建一个游戏,并且您有 100 个非玩家控制的敌人,它们生成在一个确切的位置,每个位置都不同。

在不使用 100 行代码的情况下,您究竟如何生成每一个? 我可以理解,例如,如果您希望它们都相距 25 码,您可以使用循环并增加 25。

也就是说,在这种情况下,静态编程是我看到可能结果的唯一方法,但我知道动态编程是要走的路。

人们如何做到这一点?如果你能提供其他类似的例子那就太好了。

【问题讨论】:

  • 你对静态和动态的定义不正确..
  • 我不确定我是否理解这个问题。如何创建一个文件,其中包含有关哪些敌人将在哪里以预定格式生成的信息?然后你可以使用循环读取它。
  • 您应该将这些位置隔离到一个数据文件(或一个数组)中并循环运行它。
  • 您可以创建一个包含 100 个特定职位的列表。然后您可以遍历这些位置,并为每个位置创建并生成一个具有该位置的敌人。
  • @Simon Whitehead,这绝对是可能的;我是新手。也许你可以编辑它?

标签: c# dynamic static


【解决方案1】:
var spawnLocs = new SpawnLocation[10];
if (RandomPosition)
{
    for (int i = 0; i < spawnLocs.Length; i++)
    {
        spawnLocs[i] = // auto define using algorithm / logic
    }
}
else
{
    spawnLocs[0] = // manually define spawn location
    spawnLocs[1] = 
    ...
    ...
    spawnLocs[9] = 
}

产生新的敌人:

void SpawnEnemy(int spawnedCount)
{
    if (EnemyOnMap < 10 && spawnedCount < 100)
    {
        var rd = new Random();
        Enemy e = new Enemy();
        SpawnLocation spawnLoc = new SpawnLocation();
        bool locationOk = false;
        while(!locationOk)
        {
            spawnLoc = spawnLocs[rd.Next(0, spawnLoc.Length)];
            if (!spawnLoc.IsOccupied)
            {
                locationOk = true; 
            }
        }
        e.SpawnLocation = spawnLoc;

        this.Map.AddNewEnemy(e);
    }
}

【讨论】:

  • 这样随机放置的可能问题是重叠。您需要检查您设置的位置是否尚未使用
【解决方案2】:

只需将位置指定为数组或列表或任何适合目的的数据格式,然后实现一个 3 行循环,从输入中读取每个敌人,并找到并设置相应的位置。

大多数语言都有某种“速记”格式,用于直接为数组或列表提供数据,例如在 C# 中:

var myList = new List<EnemyPosition>{
                          new EnemyPosition{ x = 0, y = 1 },
                          new EnemyPosition{ x = 45, y = 31 },
                          new EnemyPosition{ x = 12, y = 9 },
                          (...)
                };

您可以自然地将相同的数据放入 XML 文件、数据库或您的祖母柜中,只要您有一些接口可以在需要时检索它。

然后你可以设置一个循环,就像你的问题一样。

【讨论】:

  • 很好的答案,我认为使用这两个答案都会提供有用的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多