将敌人随机放置在二维网格上


11

我想将物品和敌人随机放置(或尽可能随机放置)。目前,我使用XNA的Random类来生成一个介于X的800和Y的600之间的数字。感觉就像敌人向地图顶部生成的次数多于在中间或底部生成的数。我没有为生成器添加种子,也许这是要考虑的事情。

是否描述了其他可以改善2D网格上随机敌人放置的技术?


这个问题似乎不正确。您想随机放置事物,而不使用随机数据源吗?那是一个矛盾。您实际上想实现什么?
安德鲁·罗素

我想知道是否有其他技术依赖于XNA的Random类来生成介于最小值和最大值之间的数字。我将尝试提出一个更明确的问题
Robb

1
您谈论的Random类是.NET框架的一部分,而不是XNA。只是
Michael Coleman

@Omnion-我知道。在提出问题时,我有点累了;)
Robb

Answers:


16

随机放置看起来不够随机。您可能希望敌人间隔更均匀。查看有关泊松磁盘采样的本文,或阅读有关蓝噪声的文章。


7

肖恩·哈格里夫斯(Shawn Hargreaves)来救援!

http://blogs.msdn.com/b/shawnhar/archive/2009/12/17/the-psychology-of-randomness.aspx http://blogs.msdn.com/b/shawnhar/archive/2010/09 /10/links-5charles-bloom-on-randomness.aspx

当您考虑随机分配时,实际上是指平均分配。.Net的Random正在考虑随机。您还需要其他一些东西来平衡它。链接到的Poisson磁盘采样方法amitp看起来非常适合您的需求。


+1从我的口中说出了正确的话,即使分配似乎总是与随机分配混合在一起(我自己犯了同样的错误)
Spooks

0

以下C#代码将为您生成一组统一点:

Random rand = new Random(); // creates a new random number generator with a time-based seed
int X, Y;
for(int i = 0; i < numberOfPoints; i++)
{
  X = rand.Next(800); // generates a random int between 0 and 799, inclusive
  Y = rand.Next(600); // generates a random int between 0 and 599, inclusive
  AddPointToSet(X,Y); // write this method however you want
}

请注意,当您使用不带任何参数的Random()构造函数时,您创建的Random对象将根据时间进行播种,因此,除非您在两次调用之间花费很少的时间重复执行此操作,否则它将基本上是随机的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.