JavaScript / Snake: Wie kann ich das Spiel beenden, sobald die Schlange sich selbst berührt?
Servus.
Ich bin gerade dabei, ein Snake selber zu machen. Jedoch bekomme ich kein Gameover hin, wenn die Schlange sich selbst berührt und ich verstehe auch nicht wieso. Könnte mir vielleicht ein netter Jemand helfen?
...
gleichx = false;
gleichy = false;
countgx = 0;
countgy = 0;
// wie?
for (k = 0; k <= laengex.length; k++) {
countx = 0;
countgx++;
for (t = 0; t <= laengex.length; t++) {
if (gleichx == false) {
countx++;
if (k != t) {
if (laengex[k] == laengex[t]) {
gleichx = true;
break;
}
}
}
}
if (gleichx == true) {
break;
}
}
for (k = 0; k <= laengey.length; k++) {
countgy++;
county = 0;
for (t = 0; t <= laengey.length; t++) {
if (gleichx == false) {
county++;
if (k != t) {
if (laengey[k] == laengey[t]) {
gleichy = true;
break;
}
}
}
}
if (gleichy == true) {
break;
}
}
// bis hier
if (gleichx == true && gleichy == true && countgx == countgy && countx == county) {
window.alert("You lost!");
}
...
2 Antworten
Der code ist grausam zu lesen. Bitte benenn deine variablen aussagekräftiger.
Ok ich denke ich habe das Problem:
Du brichst bei der ersten gefundenen gleichen x koordinate ab.
Sagen wir, schlangen glied 1 und 2 haben die gleiche x koordinate.
Dann hat deine Erste for verschachtelung das ergebniss: Gleiches x bei 1 und 2 gefunden.
Und dann prüfst du seperat wo die erste y überschneidung zu finden ist. Die ist sagen wir in dem beispiel bei 2 und 3.
Und guckst dann. Ist alles gleich.
Gut ist hier nicht der fall.
Die schlange berührt sich aber selbst am punkt 1 und 5.
glied 1 und 2 haben nur zufällig die selben x koordinaten.
Denn glied 1 und 5 haben auch die selben x korrdinaten. Und glied 1 und 3.
(Jetzt als beispiel)
Imgrunde kannstedas alles löschen und neu machen.
Als tipp:
Überlege dir genau was die schlange pro rechenschritt macht. Und wie sie geht.
Üblicherweise geht eine snake schlange immer einen schritt vorwärts. dh. die schlange muss zuerst mit ihrem ersten glied eine überschneidung haben (der kopf). Also z.b. Kopf trifft auf glied 4.
Glied 2 und 4 z.b. könnten sich erst nachdem der kopf eine überschneidung hatte überschneiden.
Was bedeutet:
Du brauchst hier ersteinmal gar keine verschachtelten vor.
Wir wollen ja nur wissen ob der kopf (lx[0] und ly[0]) nochmal die selben koordinaten hat.
Ergo reicht eine for schleife aus. Weil wir immer mit position 0 prüfen.
Bei jeder übereinstimmung. Prüfen wir sofort die y position. (das I gibt uns ja an welche position wir prüfen müssen)
Ist wenn die X position gleich ist. Auch die Y position gleich. Ists n gameover.
Wenn nicht. Dann prüfen wir weiter.
Als beispiel mit den imaginären daten von oben:
Merken uns die kopfkooridanten. Also Kopfx Kopfy. Starten die x schleife bei 1. (weil 0 ist ja der kopf den brauchen wir nicht)
und prüfen ob kopfx = längex[i] ist.
uzuerste haben wir 0 und 1. Jo die koordinate ist gleich.
Cool. Dann prüfen wir ob kopfY =längey[i] ist. Nein? Ok weiter.
So wird weiter gehen bis wir bei i = 4 angekommen sind. Da gibt es dann ne gleiche x koordinate. Und kopfy ist auch gleich längey[i]. Game Over.
Ich weis, meine Variablen kann irgendwie nur ich lesen. XD Vielen Lieben Dank aber, du hast mir sehr geholfen!
Ave!
Erst einmal würde ich alle Blöcke der Schlange in einem Objekt mit x und y in einem Array speichern.
Hiermit können wir sehr simpel arbeiten. Da wir ausschließlich sterben können, wenn wir mit dem Kopf einen anderen Block berühren, ist eine simple Abfrage ohne viel drumherum möglich.
Beispielsweise liegen die Koordinaten für unseren "Kopf"-Block immer im Array mit dem Index 0. Wir müssen jetzt also mit jedem Gameloop abfragen ob diese Koordinaten des Kopfes sich mit einem Körperteil decken, bzw. übereinstimmen. Ist das der Fall, hat sich die Schlange berührt.
Beispiel:
let headX = snake.blocks[0].x; // X-Koordinate des Kopfes
let headY = snake.blocks[0].y; // Y-Koordinate des Kopfes
for (let i = 1; i < snake.blocks.length; i++){ // Iteration aller anderen Blöcke außer des Kopfes (Deswegen beginnen wir bei i=1)
if (headX == snake.blocks[i].x && headY == snake.blocks[i].y){ // Wenn die Koordinaten des Kopfes mit dem aktuellen Block übereinstimmen
end(); // Beende das Spiel
}
}