wert einer koordinate
-
halle leute
frohes neus jahr!
ich bin auf der suche nach einer möglichkeit einer koordinate in der Konsole einen wert bzw. ein Zeichen zuzuweisen.
wie an eine bestimmt kooardinate ein zeichen setze weiß ich aber ich will anschließend z.b. den von x1,y1 mit x2,y2 vergleichen
Vielen dank im Voraus
greetz isi
-
Am sinnvollsten ist es wahrscheinlich, wenn du alle Zeichen, die du auf der Konsole ausgibst, selbst in einem Array speicherst. Dann kannst du vergleichen, was du willst, und brauchst nicht darüber nachzudenken, wie du angezeigte Zeichen wieder von der Konsole auslesen kannst.
-
vielen dank
das hat mir schon sehr viel weiter geholfennun hab ich nur noch ein problem
und zwar lasse ich mit w,a,s,d ein zeichen durch dir konsole bewegenjetzt will ich wissen wie ich das machen soll das wenn an der stelle wo sich mein zeichen hinbewegt ein anderer wert aus dem array dass dann halt ne meldung kommt
wie ich das machen soll ist mir noch ein rätsel zwar kann ich ja zwei werte von verschieden positionen vergleichen nicht jedoch wenn die aufeinander treffen
-
Wenn w gedrückt wurde, weißt du ja, dass deine Spielfigur nach oben bewegt werden soll. Also vergleiche einfach vor der Bewegung der Figur die Figur mit dem darüber liegenden Feld.
Eine andere Möglichkeit wäre, im Array, dass dein Spielfeld beinhaltet, nicht die Spielfigur selbst zu speichern. So hättest du im Array immer das komplette Spielfeld, und halt ein extra Wertepaar für die Koordinaten der Spielfigur. Das würde dir erlauben, die Figur auch mit dem "darunter liegenden" Feld zu vergleichen. Außerdem könnte das Feld beibehalten werden, wenn die Figur es wieder verlässt.
Wenn du es für sinnvoll hältst und noch weitere Fragen hast, kannst du ja mal ein wenig Code zeigen. Dann könnte man genauer darauf eingehen und vielleicht noch weitere Tipps geben.
-
okay ehm also hier hab ich ma den code komplett wie er bis jetzt is
(die beiden funktionen hab ich so da reingeschrieben weil ich nen fehler beim einbinden der bibliotek hatte)
das ganze soll später ma auf ein snake hinauslaufen
das prinzip mit dem überliegenden feld hab ich teilweise verstanden
nur wie du ja siehst bin ich einfach an eine stelle gesprungen und hab da ein "o" gesetz.. ich verstehe halt nicht wir ich dem sagen kann schaue an die stelle (5,6) und checke ob da c[1] vorliegtvielen dank auf jeden fall für das interesse

#include <iostream> #include <conio.h> #include <windows.h> using namespace std; void gotoxy(short x, short y); void clreol(); void bewegen(int taste, int ix,int yps,char c[]); void geruest(char c[]); int main() { int taste; int ix=1; int yps=1; char c[1000]; bewegen(taste,ix,yps,c); return 0; } void gotoxy ( short x, short y ) { COORD coord = {x, y}; SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord ); } void clreol() { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hOutput; DWORD dwWritten; if(INVALID_HANDLE_VALUE == (hOutput = GetStdHandle(STD_OUTPUT_HANDLE))) return; if(!GetConsoleScreenBufferInfo(hOutput, &csbi)) return; FillConsoleOutputAttribute(hOutput, csbi.wAttributes, (csbi.dwSize.X - csbi.dwCursorPosition.X), csbi.dwCursorPosition, &dwWritten); FillConsoleOutputCharacter(hOutput, TEXT(' '), (csbi.dwSize.X - csbi.dwCursorPosition.X), csbi.dwCursorPosition, &dwWritten); SetConsoleCursorPosition(hOutput, csbi.dwCursorPosition); } void bewegen(int taste,int ix,int yps,char c[]) { c[0]='*'; for (int i=0;i<100000;++i) { geruest(c); taste=getch(); //////W if (taste==119) { gotoxy(ix,yps); clreol(); if(yps>1) { yps-=1; gotoxy(ix,yps); } if(yps<1) { gotoxy(ix,yps); yps-=yps; } cout<<c[0]; } ////// if (taste==115) { gotoxy(ix,yps); clreol(); if(yps<14) { yps+=1; gotoxy(ix,yps); } if(yps<=15) { gotoxy(ix,yps); } cout<<c[0]; } ///////a if (taste==97) { gotoxy(ix,yps); clreol(); if(ix>=1) {ix-=1; gotoxy(ix,yps); } if(ix==0) { ix=25; gotoxy(ix,yps); } cout<<c[0]; } /////////////d if (taste==100) { gotoxy(ix,yps); clreol(); if(ix<26) { ix+=1; gotoxy(ix,yps); } if(ix>=26) { ix=1; gotoxy(ix,yps); } if(ix>=1) { gotoxy(ix,yps); } cout<<c[0]; } if(c) } } void geruest(char c[]) { c[1]='o'; for(int i=0;i<=26;++i) { gotoxy(i,0); cout<<"X"; } for(int i=0;i<=26;++i) { gotoxy(i,15); cout<<"X"; } for(int k=0;k<16;++k) { gotoxy(0,k); cout<<"X"; } for(int o=0;o<16;++o) { gotoxy(26,o); cout<<"X"; } gotoxy(5,6); cout<<c[1]; }
-
Schon mal 2 Dinge vorweg:
- in Zeile 21 übergibst du der Funktion die Variable taste, die ist aber gar nicht initialisiert, hat also keinen gültigen Wert (bzw. irgendwas, was halt zufällig an der Stelle im Speicher steht). Weise der Variablen also irgendeinen Wert zu (z.B. 0). Da du vermutlich mit dem Visual Studio arbeitest, hättest du eigentlich eine Fehlermeldung bzw. Warnung bekommen müssen. Kann es sein, dass du dein Programm nicht als Debug-Version erstellst? Das solltest du unbedingt tun!
- Anstatt taste mit 119 zu vergleichen, solltest du lieber gleich mit 'w' vergleichen. Das ist vom Ergebnis her gleich, erhöht aber die Lesbarkeit deines Codes. Dann kannst du dir auch den Kommentar sparen, dass hier mit w verglichen wird.
Ok, dann schau ich es mir mal genauer an.
-
okay ehm also hier hab ich ma den code komplett wie er bis jetzt is
(die beiden funktionen hab ich so da reingeschrieben weil ich nen fehler beim einbinden der bibliotek hatte)
das ganze soll später ma auf ein snake hinauslaufen
das prinzip mit dem überliegenden feld hab ich teilweise verstanden
nur wie du ja siehst bin ich einfach an eine stelle gesprungen und hab da ein "o" gesetz.. ich verstehe halt nicht wir ich dem sagen kann schaue an die stelle (5,6) und checke ob da c[1] vorliegtvielen dank auf jeden fall für das interesse

#include <iostream> #include <conio.h> #include <windows.h> using namespace std; void gotoxy(short x, short y); void clreol(); void bewegen(int taste, int ix,int yps,char c[]); void geruest(char c[]); int main() { int taste; int ix=1; int yps=1; char c[1000]; bewegen(taste,ix,yps,c); return 0; } void gotoxy ( short x, short y ) { COORD coord = {x, y}; SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord ); } void clreol() { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hOutput; DWORD dwWritten; if(INVALID_HANDLE_VALUE == (hOutput = GetStdHandle(STD_OUTPUT_HANDLE))) return; if(!GetConsoleScreenBufferInfo(hOutput, &csbi)) return; FillConsoleOutputAttribute(hOutput, csbi.wAttributes, (csbi.dwSize.X - csbi.dwCursorPosition.X), csbi.dwCursorPosition, &dwWritten); FillConsoleOutputCharacter(hOutput, TEXT(' '), (csbi.dwSize.X - csbi.dwCursorPosition.X), csbi.dwCursorPosition, &dwWritten); SetConsoleCursorPosition(hOutput, csbi.dwCursorPosition); } void bewegen(int taste,int ix,int yps,char c[]) { c[0]='*'; for (int i=0;i<100000;++i) { geruest(c); taste=getch(); //////W if (taste==119) { gotoxy(ix,yps); clreol(); if(yps>1) { yps-=1; gotoxy(ix,yps); } if(yps<1) { gotoxy(ix,yps); yps-=yps; } cout<<c[0]; } ////// if (taste==115) { gotoxy(ix,yps); clreol(); if(yps<14) { yps+=1; gotoxy(ix,yps); } if(yps<=15) { gotoxy(ix,yps); } cout<<c[0]; } ///////a if (taste==97) { gotoxy(ix,yps); clreol(); if(ix>=1) {ix-=1; gotoxy(ix,yps); } if(ix==0) { ix=25; gotoxy(ix,yps); } cout<<c[0]; } /////////////d if (taste==100) { gotoxy(ix,yps); clreol(); if(ix<26) { ix+=1; gotoxy(ix,yps); } if(ix>=26) { ix=1; gotoxy(ix,yps); } if(ix>=1) { gotoxy(ix,yps); } cout<<c[0]; } if(c) } } void geruest(char c[]) { c[1]='o'; for(int i=0;i<=26;++i) { gotoxy(i,0); cout<<"X"; } for(int i=0;i<=26;++i) { gotoxy(i,15); cout<<"X"; } for(int k=0;k<16;++k) { gotoxy(0,k); cout<<"X"; } for(int o=0;o<16;++o) { gotoxy(26,o); cout<<"X"; } gotoxy(5,6); cout<<c[1]; }
-
Die for-Schleife mit 100000 Durchläufen ist wohl aus der Not heraus geboren.
Stattdessen nimm doch lieber eine while-Schleife, die solange läuft bis der Benutzer ESC (ASCII 27) drückt. Das kann dann so aussehen:while(taste!=27) //für Escape gibts auch ein tolles define, dass mit aber gerade nicht einfallen will. Schau bitte mal selber danach.Du solltest auch mehr mit Funktionen arbeiten. Kleines Beispiel: anstatt immer gotoxy(ix,yps) und cout<<c[0] an vielen Stellen des Programms auszuführen, könnte es eine Funktion DruckeSpieler geben, die diese beiden Anweisungen ausführt. So vermeidet man Redundanz. Dein Code bietet noch viele weitere Möglichkeiten, Redundanz zu eliminieren.
Na ja, ich will jetzt nicht den ganzen Code umstricken. Das solltest du lieber selbst machen. Jedenfalls könnte es in etwa so aussehen:
- Es gibt ein Array, dass das ganze Spielfeld beinhaltet (hier können auch die auszusammelnden 'o'-Zeichen enthalten sein). Die Größe ist fest und ergibt sich durch Länge mal Breite des Spielfeldes (jedenfalls nicht 1000!).
- Die Funktion geruest (dann vielleicht anders benannt) gibt in jedem Schleifendurchlauf das gesamte Spielfeld aus. Hier sind nur verschachtelte 2 Schleifen nötig, die das Array auslesen und die einzelnen Zeichen per cout auf den Bildschirm bringen.
- Die Spielfigur wird ebenfalls in jedem Durchlauf ausgegeben. Ihre Koordinaten werden gesondert gespeichert. Hier könnte man ein eigenes kleines struct nehmen, oder die COORD-Struktur der WinAPI, oder std::pair, oder...
- Jedesmal, wenn sich die Figur bewegt, wird geprüft, ob auf der neuen Position der Figur ein 'o' ist. Ist dem so, folgen weitere Schritte, die wir aber erstmal weglassen (z.B.: Schlange wird länger, hier wird es aber etwas komplizierter). In jedem Fall wird an dieser Position im Spielfeld-Array ' ' geschrieben, um das 'o' zu löschen (es ist ja schließlich gerade gefressen worden).
- Es müssen regelmäßig neue 'o' auf dem Spielfeld gestreut werden. Das könntest du der Einfachheit halber erstmal alle x Schleifendurchläufe machen oder so. Später könnte man z.B. über einen Thread nachdenken, der parallel läuft und alle x Sekunden ein neues 'o' an einer zufälligen Position auf dem Spielfeld setzt.
Versuch erst mal, einige dieser Punkte umzusetzen. Priorität haben die Punkte Spielfeld-Array, Ausgabe des Arrays und dann 'o' auffressen. Das Streuen von neuen 'o' stellen wir erst mal hinten an. Bei Schwierigkeiten sehen wir dann weiter.
-
okay viel dank nochmal
ich werde mich bei zeit dran und melde mich dann

greet isi