Placement ennemi aléatoire sur une grille 2D

11

Je veux placer mes objets et ennemis au hasard (ou aussi au hasard que possible). Pour le moment, j'utilise la Randomclasse XNA pour générer un nombre compris entre 800 pour X et 600 pour Y. On dirait que les ennemis apparaissent plus vers le haut de la carte qu'au milieu ou en bas. Je n'amorce pas le générateur, c'est peut-être quelque chose à considérer.

Y a-t-il d'autres techniques décrites qui peuvent améliorer le placement aléatoire de l'ennemi sur une grille 2D?

Robb
la source
Cette question semble malformée. Vous voulez placer des choses au hasard, sans utiliser une source de données aléatoires? C'est une contradiction. Qu'essayez-vous réellement de réaliser?
Andrew Russell
Je voudrais savoir s'il existe des techniques autres que de s'appuyer sur la classe aléatoire de XNA pour générer un nombre compris entre min et max. Je vais essayer de faire une question plus claire
Robb
1
La classe aléatoire dont vous parlez fait partie du framework .NET, pas XNA. Juste FYI.
Michael Coleman
@Omnion - je suis au courant. J'étais un peu fatigué lors de la création de la question;)
Robb

Réponses:

16

Le placement aléatoire ne semble pas assez aléatoire à l'œil nu. Vous voudrez probablement que les ennemis soient espacés un peu plus uniformément. Jetez un œil à cet article sur l'échantillonnage de disques de Poisson ou lisez le bruit bleu.

amitp
la source
7

Shawn Hargreaves à la rescousse!

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

Quand vous pensez distribution aléatoire, vous voulez vraiment dire distribution uniforme. Aléatoire de .Net pense au hasard. Vous avez besoin d'autre chose pour égaliser. La méthode d'échantillonnage de disque de Poisson amitp liée à semble parfaite pour vos besoins.

Cubed2D
la source
+1 a sorti les mots de ma bouche, même la distribution semble être mélangée avec une distribution aléatoire tout le temps (j'ai moi-même fait la même erreur)
Spooks
0

Le code C # suivant générera pour vous un ensemble de points uniformes:

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
}

Notez que lorsque vous utilisez le constructeur Random () sans paramètres, l'objet Random que vous créez est prédéfini en fonction de l'heure, donc il va être essentiellement aléatoire à moins que vous ne le répétiez avec très peu de temps entre les appels.

James King
la source