Bewegungsrichtung ändern
-
Hallo,
ich lerne seit knapp 1 1/2 Wochen C und bin dabei als Übungsaufgabe Snake selbst zu programmieren um mein bisher erlerntes Wissen anzuwenden und zu vertiefen. Zudem glaube ich, dass dies ein guter Anhaltspunkt ist, um auf mir noch unbekannte Möglichkeiten der C-Programmierung aufmerksam zu werden.
Bisher habe ich das how-to auf www.c-howto.de durchgearbeitet und mich mithilfe diverser Foren und ein paar alten C-Büchern durchgeschlagen.Bislang bin ich soweit gewesen, dass sich mein "Schlangenkopf" vom Ursprugsort mit den Tasten WASD bewegen lässt und dabei ein Stück "Körper" hinterlässt.
Nun will ich dies dahingehend optimieren, dass sich der "Schlangenkopf" selbständig bewegt und ich nur noch Richtungsangaben einzugeben habe.Mithilfe dieses Codeschnipsels bewegt sich der "Schlangenkopf" nach erstmaliger Richtungsanweisung selbstständig, nimmt aber (in diesem Stadium logisch) keine weiteren Richtungsanweisungen entgegen.
Meine Überlegung: Ich lasse die innere Schleife durchlaufen bis ich eine Richtungsanweisung, oder den Abbruchbefehl 'x' eingebe.
Ich habe auch schon einmal probiert dies über eine if-Anweisung zu lösen wurde aber dadurch gezwungen definitiv eine Eingabe zu machen, was nicht gewollt ist.
Die Bibliothek conio.h und somit die funktion kbhit() stehen mir nicht zur Verfügung.Ziel ist es also, die innere Schleife bei einer neuen Richtungsanweisung zu verlassen und die äußere wieder ablaufen zu lassen, da ich mir durch dieses Vorgehen das gewünschte Verhalten verspreche.
Die Funktionen, Variablen und Arrays sind soweit deklariert und laufen fehlerlos.
Hier sind die Deklarationen aller im Codeschnipsel auftauchenden Variablen, Arrays und Funktionen:
char field[30][30], zug, e; int posx=5, posy=5, y, x, i, a, b, j=0, pkt,k=0, l; void printfield(char *field); void move(char *field, int *posy, int *posx, char zug, int *a, int *b); int tty_getchar();
do { printfield(&field[0][0]); // printf("schleife1"); zug=tty_getchar(); e=zug; do { // printf("schleife2"); printfield(&field[0][0]); // tty_getchar()=e; move(&field[0][0], &posy, &posx, zug, &a, &b); sleep(1); }while(zug == e); zug=tty_getchar(); e=zug; }while(zug != 'x');
Vielen Dank
Edit: da hat sich doch noch ein Vertipper eingeschlichen
-
Du musst in der Schleife die Taste abfragen und ggfs. die Richtung ändern.
Wenn keine Taste gedrückt wurde, gehts in der alten Richtung weiter.Die Eingabefunktionen von Standard-C beenden sich aber erst, wenn ein Zeichen vorliegt.
Du musst da auf spezielle Funktionen für dein System zurückgreifen.
Da du aber nicht schreibst womit (Compiler, Betriebssystem) du programmierst, kann ich dir nicht weiterhelfen.Obwohl, schau mal da: http://c-faq.com/osdep/cbreak.html
-
Danke für die schnelle Antwort.
Ich wusste doch, dass ich irgendeine Angabe vergessen habe, dabei habe ich versucht meinen ersten Beitrag hier nicht wie eine Katastrophe aussehen zu lassen.
Ich programmiere auf Fedora 17 und nutze den gcc compiler.Ich werde mir dies in ruhe anschauen, da aber meine Englischkenntnisse nicht hervorragend sind wird dies ein wenig dauern.
Sobald ich damit durch bin und mit den neuen Erkenntnissen ein paar Versuche durchgenommen habe melde ich mich noch einmal (hoffentlich mit einer Erfolgsmeldung).
-
Um das Englisch wirst du nicht drum rum kommen.
Hast du schon mal nach "linux kbhit" gesucht?
Hier im Forum oder bei Goooooooooogle?
-
Die Funktionen getch und vllt auch kbhit dürften für dich interessant sein:
http://www.undertec.de/blog/2009/05/kbhit_und_getch_fur_linux.html
-
Das Englisch ist auch nicht weiter schlimm.
Es dauert halt nur ein wenig länger, englische Anleitungen, Erklärungen usw. durchzuarbeiten. Allerdings heißt es nicht, dass ich diese meide.Auf kbhit bin ich als Lösungsansatz schon ein paar mal gestoßen, jedoch noch auf die Möglichkeit diese selbst "nachzubauen".
Ich werde mich den Quellen und Hilfestellungen annehmen und versuchen eine somit auf eine Lösung zu kommen.
Vielen Dank
-
Ich habe nun die "nachgebaute" Funktion kbhit ersteinmal 1:1 übernommen und eine if-Anweisung in die innere Schleife eingefügt, die bei einer neuen Richtungsanweisung jene Schleife abbricht und mit der äußeren fortfährt.
Dieser Teil des Codeschnipsels sieht nun folgendermaßen aus:
do { printfield(&field[0][0]); // printf("schleife1"); zug=tty_getchar(); e=zug; do { // printf("schleife2"); printfield(&field[0][0]); // tty_getchar()=e; move(&field[0][0], &posy, &posx, zug, &a, &b); if(kbhit()) break; sleep(1); }while(zug == e); zug=tty_getchar(); e=zug; }while(zug != 'x');
Vielleicht werde ich nochmal einen Lösungsansatz suchen für etwaige unsaubere Bewegungen der "Schlange", jedoch werde ich mir vorerst mal den Code für die KBhit-Funktion genauer anschauen und versuchen zu verstehen, da dies für mich im moment sehr kryptisch ist und ich gern verstehen würde, was in meinem Programm so drin steht.
Wenn keine weiteren Anmerkungen, gut gemeinte Ratschläge mehr anliegen, möchte ich mich nochmal bei den Helfenden bedanken.
Das Thema kann von meiner Seite aus als abgeschlossen/gelöst angesehen werden.Ich wünsche euch noch einen schönen Abend
PS: Die späte Antwort ist leider durch einen Ausfall der Internetverbindung verursacht worden.