Snake Problem wie bewegen?
-
Hallo
Ich probiere ein snake spiel zu programmieren aber weiß nicht wie ich die schlange bewegen soll.
Das hab ich schon versucht:
[code]
bool exit = false;
while(!exit)
{
if(kbhit()) // Nur wenn auch eine Taste gedrückt ist
{
char c = getch();
switch(c)
{
case 'w':
x--;
break;case 'a':
y--;
break;case 's':
y++;
break;case 'd':
y--;break;
}
}
Sleep(20);}
und noch sämtliche andere aber ich bekomms nicht hin
kann mir vlt einer helfen?
Vielen Dank
-
1. Du hast das Zeichnen deiner Schlange vergessen. Wo/Wie machst du das denn? Wenn du in jedem Schleifendurchlauf deine Schlange an Position x,y zeichnest, dann sollte das schon klappen.
2. Mit so einem switch kann man das schon machen, aber du hast deine Koordinaten ein wenig durcheinandergewürfelt. Mit w gehst du nach links, mit a nach oben...?
-
Also ein Frame wird schon in einer großen Schleife berechnet. D.h. pro Frame musst du alles berechnen.
Normalerweise ist die Schleife, ganz grob, nach dem guten alten EVA Prinzip aufgebaut. Also:
Eingabe -> Verarbeitung -> Ausgabe,
wasd -> Schlange bewegen, Apfel erscheinen lass, etc. -> Zeichnen.
Du brauchst also die Benutzereingaben, die du so eig. schon hast (prüf nochmal die Tasten, manche machen das selbe), dann eine Funktion, die die Schlange bewegt und sachen erscheinen lässt etc. und eine Funktion, die dann alles ausgibt.
-
Ok vielen dank
Hab jetz ein neues Problem

Wie geb ich nun die schlange auf dem Feld aus?
Das Feld und die schlange sind ja 2d arrays aber wie verknüpfe ich die beiden?
-
Ich würde die schlange in kein array packen, da ihre laenge variabel ist wäre ein vector besser.
Ansonsten bastelst du dir eine schlaife, die sooft durchlaufen wird wie die schlange lang ist, und setzt für jedes stück schlange das entsprechende feldelement um.
Bzw behandelst du kedes feldelemt einzeln. Sprich, du prüfst das element(0,0); was ist da? Schlange? Apfel? Nix? Setze entsprechendes zeichen! Prüfe element (1,0)... Brauchst hier 2 for schleifen für die reihen und spalten und eine abfragekette, die pro feld einmal durchlafen werden muss.
-
Ich verzweifel noch daran!!!!
Hab jetzt iwi 2 schlangen kann auch beide bewegen[code]
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>using namespace std;
struct snake
{
int X;
int Y;
};snake pos[1];
const int breite = 40;
const int hoehe = 20;
char Feld [breite][hoehe];
int x;
int y;
char schlange[40][20];int main()
{
pos[0].X = 1;
pos[0].Y = 1;bool exit = false;
while(!exit)
{
if(kbhit()) // Nur wenn auch eine Taste gedrückt ist
{
char c = getch();
switch(c)
{
case 'w':
pos[0].X-- ;
break;case 'a':
pos[0].Y--;
break;case 's':
pos[0].X++;
break;case 'd':
pos[0].Y++;
break;}
}
Sleep(1);
system("cls");for(x = 0; x < hoehe; x++)
{
cout << endl;for( y = 0; y < breite; y++)
{Feld [x][y] = '*';
Feld [pos[0].X][pos[0].Y] = 'O';
Feld [pos[0].X][pos[0].Y] == 1;
cout << Feld [x][y];
}}
}cin.get();
return 0;
}ich weiß ich bin noch nicht so weit will aber erstmal ein Feld haben wo man eine schlange bzw. O bewegen kann

-
Da Du für Windows schreiben willst, benutze für die Ausgabe der Zeichen die WinAPI. Damit kannst Du ganz gezielt Positionen in der Konsole beschreiben, bzw. löschen. Das erspart Dir das Löschen des Bildschirmes und Neuzeichnen des ganzen Feldes bei jedem Frame(Schritt).
Funktionen dafür findest Du ein paar Stationen weiter oben im Konsoleforum zuhauf.
Dann verwalte Deine Schlange in einer Liste. Speichere in dieser Liste Positionen bestehend aus x und y Position. Wenn Deine Schlange sich nun vorwärts bewegen soll, bestimme die Richtung, kopiere das erste Listelement und berichtige die Position mit Hilfe der ermittelten Richtung, gib den Kopf auf der neuen Position aus und füge das kopierte und berichtigte Element als neues erstes Element in Deine Liste ein.
Soll die Schlange gleichzeitig wachsen, bist Du schon fertig, ansonsten nimm nun das letzte Listelement, lösche die entsprechende Konsolenposition und entferne das Element aus der Liste. -- Fertig!
So manipulierst Du maximal zwei Positionen auf der Konsole: den neuen Platz für den Schlangenkopf, und den alten Platz des Schlangenendes. Das verhindert übrigens auch Bildschirmflimmern.
-
lolipoplol:
schließ bitte auch deine code tags wieder
sonst wird aus
code blablanur ein [code]code
einfach nochmal auf den butten klicken, der hat dann auch so ein sternchen