Snake die Zweite
-
Hab mich auch an Snake gewagt, es funktioniert soweit auch gut... bin jetzt soweit, dass sich der Punkt Bewegen kann und zufällig neues Fressen erscheint.
Nach zufälliger Zeit jedoch bleibt das Essen an der Schlange hängen, Selbsttest erwünscht. Hier der so gut wie möglich ausformulierte Quelltext aus dem Borland Builder 5:/* Spiel SCHNAKE von Torsten Scholze (c) Verfielfältigung oder Veröffentlichung dieses Quelltextes wird strafrechtlich verfolgt. Also tut mir den Gefallen und fragt nach, bevor ihr ihn anderweitig verwendet :) */ //--------------------------------------------------------------------------- #pragma hdrstop #include <iostream.h> #include <conio.h> #include <windows.h> //--------------------------------------------------------------------------- #pragma argsused int main() { char richtung='k'; //k nur, um das Programm nicht starten zu müssen int f=1,x=5,y=5,v=40,w=6; //f ist Hilfsvariable für Randberührung double long schleife=1; //schleife für Geschwindigkeit der Schlange gotoxy(v,w); cprintf("*"); gotoxy(5,5); while (richtung != 't') { gotoxy(v,w); cprintf("+"); gotoxy(1,20); textbackground(LIGHTBLUE); textcolor(YELLOW); cprintf("________________________________________________________________________________"); cout << endl; cprintf("Links - a, rechts - d, unten - s, oben - w. Fuer Pause: Beliebiger Tastendruck!"); gotoxy(x,y); while (schleife < 5000000) //schleife für Geschwindigkeit der Schlange {schleife++;} schleife = 1; if (kbhit()) //für Richtungsänderung { richtung = getch(); } switch (richtung) //Nachprüfung der Richtung { case 'w': y--; break; case 'a': x--; break; case 's': y++; break; case 'd': x++; break; } clrscr(); f=x; //Von hier bis unten ist der Randberührungsteleport if (x == 80) { f = 2; } if (x == 1) { f = 79; } x=f; f=y; if (y == 0) { f = 19; } if (y == 20) { f = 1; } y=f; if (x==v) //Überprüfung ob das Fressen gefunden worde { if (y==w) { v=0; w=0; Beep(900,20); randomize(); if (v==0) {v=random(78d);} if (w==0) {w=random(18);} while (schleife < 1000) //schleife wartet kurz {schleife++;} schleife = 1; //cprintf("Gratz!"); //getch(); } } gotoxy(x,y); cprintf("*"); } getch(); return 0; } //---------------------------------------------------------------------------
-
Einige kleinere Punkte:
- du mußt randomize() nur einmal bei Programmbeginn aufrufen, um den Zufallsgenerator zu initialisieren - danach läuft der alleine weiter.
- "random(78d)" - das sieht nach einem Tippfehler aus
- du hast v und w gerade auf Null gesetzt - da ist es (sorry) Schwachsinn, nochmal zu überprüfen, ob sie 0 sind
- diese "f=x;if(f...)...;x=f;" Sequenz sieht auch unnötig kompliziert aus
Ansonsten würde ich dir erst einmal raten, das Programm etwas besser zu strukturieren, vielleicht siehst du dann ja den Fehler.
(und eine gute Idee wäre es, mit dem Debugger durchzulaufen)
-
du mußt randomize() nur einmal bei Programmbeginn aufrufen, um den Zufallsgenerator zu initialisieren - danach läuft der alleine weiter.
Stimmt
"random(78d)" - das sieht nach einem Tippfehler aus
Den Schreibfehler hab ich vorhin ausversehen rein gebaut, da "d" für rechts steht und das Prog langsam gestartet wurde. Sonst gehts ^^
du hast v und w gerade auf Null gesetzt - da ist es (sorry) Schwachsinn, nochmal zu überprüfen, ob sie 0 sind
Die if hab ich zu while-Schleifen gemacht. Dummer Fehler *schäm*
(hab ich gemacht, damit nie ein Punkt auf die 0-Stelle kommt, was ja unerreichbar wäre)
Hab also noch viel Arbeit vor mir... Danke für die Antworten
-
statt der "while(v==0) v=random(78);" solltest du lieber den Zufallswert um 1 erhöhen - das geht schneller:
v = random(79)+1;//Zufällig im Bereich 1..78
(übrigens solltest du die Richtungsbehandlung anders lösen - wenn der Spieler etwas anderes als asdf drückt, bleibt die Schlange stehen)
-
Hab extra drunter geschrieben "Für Pause: Beliebiger Tastendruck!"... asdw hab ich auch nur genommen, weil ich keine Ahnung hab wie ich auf die Pfeiltasten zugreifen kann.
-
die pfeiltasten:
if (kbhit()) // für Richtungsänderung mit Pfeiltasten
{
richtung = getch(); // Richtung muss mit getch() abgefragt 0 sein!
}if (richtung== 0) switch (getch()) // nun zur eigendlichen Richtungswahl
{
case 72:y--; // hoch
break;
case 75:x--; // links
break;
case 77:x++; // rechts
break;
case 80:y++; // runter
break;
}