Colocación aleatoria del enemigo en una cuadrícula 2D

11

Quiero colocar mis artículos y enemigos al azar (o tan al azar como sea posible). Por el momento, uso la Randomclase XNA para generar un número entre 800 para X y 600 para Y. Parece que los enemigos aparecen más hacia la parte superior del mapa que en el medio o en la parte inferior. No siembro el generador, tal vez eso es algo a considerar.

¿Se describen otras técnicas que pueden mejorar la colocación aleatoria del enemigo en una cuadrícula 2D?

Robb
fuente
Esta pregunta parece malformada. ¿Desea colocar cosas al azar, sin usar una fuente de datos aleatorios? Eso es una contradicción. ¿Qué estás tratando de lograr realmente?
Andrew Russell el
Me gustaría saber si existen otras técnicas además de confiar en la clase Aleatoria de XNA para generar un número entre un mínimo y un máximo. Trataré de hacer una pregunta más clara
Robb
1
La clase aleatoria de la que habla es parte del marco .NET, no XNA. Solo para tu información.
Michael Coleman
@ Omnion - Soy consciente. Estaba un poco cansado al crear la pregunta;)
Robb

Respuestas:

16

La colocación aleatoria no parece lo suficientemente aleatoria a la vista. Probablemente querrás que los enemigos se separen un poco más uniformemente. Eche un vistazo a este artículo sobre el muestreo de disco de Poisson o lea sobre el ruido azul.

amitp
fuente
7

¡Shawn Hargreaves al rescate!

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-5-charles-bloom-on-randomness.aspx

Cuando piensas en una distribución aleatoria, realmente te refieres a una distribución uniforme. .Net's Random está pensando al azar. Necesitas algo más para igualarlo. El método de muestreo de disco Poisson amitp vinculado se ve perfecto para sus necesidades.

Cubed2D
fuente
+1 sacó las palabras de mi boca, incluso la distribución parece estar mezclada con una distribución aleatoria todo el tiempo (yo mismo he cometido el mismo error)
Spooks
0

El siguiente código C # generará un conjunto de puntos uniformes para usted:

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
}

Tenga en cuenta que cuando usa el constructor Random () sin parámetros, el objeto Random que crea se siembra en función del tiempo, por lo que será esencialmente aleatorio a menos que lo haga repetidamente con muy poco tiempo entre llamadas.

James King
fuente