C# Apple in einem Snake-Game korrekt spawnen lassen

!Anonymous

Cadet 4th Year
Registriert
Feb. 2012
Beiträge
92
Hey Leute,
ich mache grade ein Snake-Game und will das Futter auf einem 20x20 Felder großen Spielfeld in einem der Felder spawnen lassen, in dem sich keines der Glieder meiner Snake befindet, sodass das Futter nicht in der Schlange spawnt.
Folgendes habe ich schon:
- X- und Y-Position des Futters werden mit Random zufällig berechnet
- Dann dachte ich mir, ich gehe mit einer Foreach-Schleife alle Punkte aus meiner Liste mit Snake-Teilen durch und überprüfe ob die zufällig berechneten X-und Y-Koordinaten beide mit einem dieser Punkte übereinstimmen.
Aber wie kann ich dann dem Programm sagen, es soll so lange neue Koordinaten für meinen Apple berechnen, bis mal der Punkt des Apples mit keinem Punkt meiner Snake-Teile übereinstimmt?

MfG
 
Das wäre mein Vorschlag:

Code:
  int foodY;
  int foodX;
  while (true) {
    foodX = // Random value
    foodY = // Random value
    if (!pointIsPartOfSnake(foodX, foodY)) break;
  } 
 
// ...

public bool pointIsPartOfSnake(int x, int y) {
  // To be implemented...
}

Eleganter (aber auch aufwändiger) wäre es wie schon gesagt, wenn du zuerst eine Liste mit freien Feldern erstellst.
 
Achtung: Falls dein Zufallsgenerator nicht echt zufällig ist, kann sich dein Programm aufhängen (die freien Felder werden nicht gezogen).
Das ist zwar nicht komplett falsch, aber alle mir bekannten Zufallsgeneratoren erreichen alle Werte auf einem 20x20 Feld. In der Regel sind einfach nur die möglichen Ergebnisse nicht gleichverteilt. Aber P[bestimmstes Ergebnis] >0 sollte eigentlich gelten. Wobei es das z.b. bei Fließkommarithmetik mit rand() * (a - b) + a wahrscheinlich schon nicht funktioniert, was ja immerhin ein typischer C-Weg ist...
Egal: Für dieses Problem hier tut jeder Generator!
 
@misu:
Klar, es sollte jeder Generator tun, aber es ist wie floats, man kann diese als bessere ganzzahlen verwenden, aber irgendwann schepperts halt dann doch.

Ich empfehl dir die Lösung mit einer Liste. Sollte mit einem der Standardcontainer (ArrayList?) relativ kompakt vonstatten gehen und hat ein lineares Laufzeitverhalten.
 
Zurück
Oben