Snake
-
noobLolo schrieb:
hast du das abgeschrieben??
iGroeßeSchlangesei doch mal so nett, und post ein compilierbares beispiel...
Ich habe gemeint das das Abschreiben auf iGroeßeSchlange bezogen war.
Der Code wird lange, habe ich mit der zweiten Antwort gemeint, habe aber den Code extrem gekürzt und macht nach 7 bewegungen eine Richtungsänderung und da sieht man die Löcher die ich meine.#include <iostream> #include <conio.h> #include <windows.h> //#include "clrscr.h" //#include "gotoxy.h" using namespace std; const int iFeldX = 79; const int iFeldY = 24; void clrscr(){ COORD coordScreen = { 0, 0 }; /* here's where we'll home the cursor */ BOOL bSuccess; DWORD cCharsWritten; CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ DWORD dwConSize; /* number of character cells in the current buffer */ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); /* get the number of character cells in the current buffer */ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi); dwConSize = csbi.dwSize.X * csbi.dwSize.Y; /* fill the entire screen with blanks */ bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten); /* get the current text attribute */ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi); /* now set the buffer's attributes accordingly */ bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); /* put the cursor at (0, 0) */ bSuccess = SetConsoleCursorPosition(hConsole, coordScreen); return; } void gotoxy(int x,int y) { COORD cur={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cur); } void StartSchlange(int iSchlangeX[], int iSchlangeY[], int *iGroeßeSchlange){ *iGroeßeSchlange = 4; } void ZeichneSchlange(int iSchlangeX[], int iSchlangeY[], int &iGroeßeSchlange, int &iKopfX, int &iKopfY){ for(int i=0; i<iGroeßeSchlange; i++){ if(iSchlangeX[i] == iKopfX && iSchlangeY[i] == iKopfY){ //Wenn Kopf, s schreiben gotoxy(iSchlangeX[i], iSchlangeY[i]); cout<<"S"; } else{ gotoxy(iSchlangeX[i], iSchlangeY[i]); //Wenn nicht Kopf, * schreiben cout<<"*"; } } } void Haupt(int iSchlangeX[], int iSchlangeY[], int &iGroeßeSchlange){ bool bRechts = false; bool bLinks = true; bool bOben = false; bool bUnten = false; int iKopfX = iSchlangeX[0]; int iKopfY = iSchlangeY[0]; int iZaehlerV= 0; int iZaehlerH = 0; int iZaehler = 0; StartSchlange(iSchlangeX, iSchlangeY, &iGroeßeSchlange); while(1){ Sleep(500); clrscr(); iZaehler++; if(bLinks == true){ iKopfX--; iZaehlerH++; iSchlangeX[iGroeßeSchlange-iZaehlerH]=iKopfX; iSchlangeY[iGroeßeSchlange-iZaehlerH]=iKopfY; if(iZaehlerH==iGroeßeSchlange){ iZaehlerH=0; } } if(bOben == true){ iKopfY--; iZaehlerV++; iSchlangeX[iGroeßeSchlange-iZaehlerV]=iKopfX; iSchlangeY[iGroeßeSchlange-iZaehlerV]=iKopfY; if(iZaehlerV==iGroeßeSchlange){ iZaehlerV=0; } } if(iZaehler==7){ bOben = true; bLinks = false; } ZeichneSchlange(iSchlangeX, iSchlangeY, iGroeßeSchlange, iKopfX, iKopfY); } } void main(){ int iSchlangeX[iFeldX] = {30, 31, 32, 33}; int iSchlangeY[iFeldY] = {12, 12, 12, 12}; int iGroeßeSchlange = 0; Haupt(iSchlangeX, iSchlangeY, iGroeßeSchlange); _getch(); }
-
typedef struct _snake{ struct{ char data[20000]; int rows; int cols; }map; struct{ char data[1024][2]; int length; int center; }snake; }snake; void moveSnakeOneStep(snake *s,int direction){ if(s->snake.center++ >= s->snake.length-1){ s->snake.center = 0; } int sCenter = s->snake.center; int lsCenter = (sCenter > 0) ? s->snake.center-1 : s->snake.length-1 ; switch(direction){ case MOVE_UP: s->snake.data[sCenter][X] = s->snake.data[lsCenter][X]+1; s->snake.data[sCenter][Y] = s->snake.data[lsCenter][Y]; break; case MOVE_LEFT: s->snake.data[sCenter][X] = s->snake.data[lsCenter][X]; s->snake.data[sCenter][Y] = s->snake.data[lsCenter][Y]-1; break; case MOVE_RIGHT: s->snake.data[sCenter][X] = s->snake.data[lsCenter][X]; s->snake.data[sCenter][Y] = s->snake.data[lsCenter][Y]+1; break; case MOVE_DOWN: s->snake.data[sCenter][X] = s->snake.data[lsCenter][X]-1; s->snake.data[sCenter][Y] = s->snake.data[lsCenter][Y]; break; } }hätte sowas im angebot, evtl. hilft dir auch die url
http://www.simonhuggins.com/courses/cbasics/course_notes/snake.htmlg lolo
-
mir ist gerade aufgefallen, das ich X und Y vertauscht hab

-
Ist eine Konsolenanwendung und verzichtet der Einfachheit halber auf Klassen und Vektoren.
Ob das so sinnvoll ist?
Gerade hier könnte man die Schlange schön als Objekt realisieren, wie noobLolo es gezeigt hat.
-
also ich hab auch mal en snake geschrieben (bzw bin noch dabei) und klassen helfen da schon ziemlich
unter anderem hab ich ne klasse punkt2d (wobei da gibts was aus der java/c++ standart bibliothek) und en vector als schlangenposition
hab allerdings kopf, schwanz und körper untershciedlich immer angesehenbei der bewegung muss man aufpassen dass man nicht ausserhalb raus aus dem spielfeld geht (ich hatte das feld als 2d array und dann gibts fehler, deswegen)
und snake-console ist ne sehr gute übung für klassen und sowas
-
hatt keiner eine erklärung für den Fehler in meinen Code???
Klassen und Vektoren sind ja schön und gut, soll es aber mit Arrays und ohne strukturen oder Klassen machen.
-
es ist immer so ne sache sich mit code anderer menschen zu beschäftigen, besonders wenn man es nicht durch den compiler jagen kann...
evtl. mal ein paar sachen die mir an deinem aufgefallen sind,
1. die schlange geht keine diagonale. das ist aber mit deinem code möglich
2. verwende statt den if's in der while schleife ein switch, das macht dem compiler den optimierungs prozess leichter
3. wieso übergibst du den functionen die ints mit & das ist doch nicht nötig
4. ßöäü und sonstige zeichen haben da nichts verloren, genauso wie andere utf-8 zeichen, denke das regex für ansi c schaut so in der richtung aus "a-zA-Z0-9_" kann mich aber auch täuschen und hab das 'ß' iwie überlesen
bei sowas im zweifel immer die ansi c grammar konsultieren
http://www.lysator.liu.se/c/ANSI-C-grammar-l.html#CONSTANT5. deine schlange geht noch nicht in alle richtungen...
es ist auch fraglich ob 2 arrays (iSchlangeX,iSchlangeY) besser sind als ein zwei dimensionales, bin mir da aber nicht sicher.
6. ich hab dir doch ein beispiel gebastelt das die schlange bewegt, auch wenns jetzt nicht super sauber ist, und man das noch viel schöner machen kann, so sollte es doch funktionieren, zur erklärung kann man evtl. sagen das bei jedem schritt das letzte element der schlange gelöscht wird und als kopf verwendet wird. um nicht das ganze array zu verschieben, gibt es diese "center" variable die angibt wo sich der kopf befindet. und "center-1" ist dann das letzte element.
lg lolo
-
Dieser Code sollte, wenn man ihn in die Entwicklungsumgebung kopiert ohne weiteres starten. Der Code ist nur ein kleiner Ausschnitt des gesamten Projekts und soll das Problem mit den kurzzeitigen Löchern veranschaulichen, wenn man es startet.
Im Gesamten funktioniert alles, nur bei der Richtungsänderung kommt es meistens zu Löchern die aber wieder verschwinden und das soll ja nicht sein. Möchte nur gerne wissen mit was das zusammenhängt, bzw. was geändert werden muss.
mfg
-
hab das gerade mal durch den vc++2010 gejagt, scheinbar erlaubt der utf-8 *kotz*
void Haupt(int iSchlangeX[], int iSchlangeY[], int &iGroeßeSchlange){ int dir = 0; int iKopfX = iSchlangeX[0]; int iKopfY = iSchlangeY[0]; int iZaehlerD = 0; int iZaehler = 0; StartSchlange(iSchlangeX, iSchlangeY, &iGroeßeSchlange); while(1){ iZaehler++; switch(dir){ case 0: iSchlangeX[iGroeßeSchlange-iZaehler]=--iKopfX; iSchlangeY[iGroeßeSchlange-iZaehler]=iKopfY; break; case 1: iSchlangeX[iGroeßeSchlange-iZaehler]=++iKopfX; iSchlangeY[iGroeßeSchlange-iZaehler]=iKopfY; break; case 2: iSchlangeX[iGroeßeSchlange-iZaehler]=iKopfX; iSchlangeY[iGroeßeSchlange-iZaehler]=--iKopfY; break; case 3: iSchlangeX[iGroeßeSchlange-iZaehler]=iKopfX; iSchlangeY[iGroeßeSchlange-iZaehler]=++iKopfY; break; } if(iZaehler==iGroeßeSchlange) iZaehler=0; if(iZaehlerD++>21){ if(iZaehlerD>27) iZaehlerD=0; dir = 1; }else if(iZaehlerD++>14) dir = 2; else if(iZaehlerD++>7) dir = 0; else dir = 3; Sleep(500); clrscr(); ZeichneSchlange(iSchlangeX, iSchlangeY, iGroeßeSchlange, iKopfX, iKopfY); } }lg lolo
-
was ist utf-8???
mfg
-
void _tmain(){
char *中華人民共和 = "utf-8 in source sucks";
cout << 中華人民共和;
}______________________
und wie gut ist dein chinesisch
-
gehörte wieder mal aufpoliert
-
noobLolo schrieb:
void _tmain(){
char *中華人民共和 = "utf-8 in source sucks";
cout << 中華人民共和;
}______________________
und wie gut ist dein chinesisch
das wär doch mal was für den "International Obfuscated C Code Contest"

-
thx, funktioniert, muss noch schauen was du anders gemacht hast
-
franz-21 schrieb:
thx, funktioniert, muss noch schauen was du anders gemacht hast
glaub der haupt fehler war iZaehlerH und iZaehlerV die ich zusammengefasst hab zu iZaehler
warum hast da eigentlich "ae" statt "ä" war das ne göttliche eingebung

-
lol, ne, Umlaute sollte man ja nicht benutzen beim Programmieren, oder?!?!?
mfg
-
noobLolo schrieb:
und wie gut ist dein chinesisch

中華人民共和
In Porzellan Leute Porzellan total und!
Besser bekannt als Volksrepublik China.
-
wollts nicht unbeding nochmal ausgraben, aber hatte gestern noch so eine idee die ich euch nich vorenthalten wollte
void Haupt(int iSchlangeX[], int iSchlangeY[], int &iGroeßeSchlange){ int dir = 0; int iKopfX = iSchlangeX[0]; int iKopfY = iSchlangeY[0]; int iZaehlerD = 0; int iZaehler = 0; StartSchlange(iSchlangeX, iSchlangeY, &iGroeßeSchlange); while(1){ iZaehler++; switch(dir){ case 0: iKopfX--; break; case 1: iKopfX++; break; case 2: iKopfY--; break; case 3: iKopfY++; break; } iSchlangeX[iGroeßeSchlange-iZaehler]=iKopfX; iSchlangeY[iGroeßeSchlange-iZaehler]=iKopfY; if(iZaehler==iGroeßeSchlange) iZaehler=0; if(iZaehlerD++>21){ if(iZaehlerD>27) iZaehlerD=0; dir = 1; }else if(iZaehlerD++>14) dir = 2; else if(iZaehlerD++>7) dir = 0; else dir = 3; Sleep(500); clrscr(); ZeichneSchlange(iSchlangeX, iSchlangeY, iGroeßeSchlange, iKopfX, iKopfY); } }aber schlimmer gehts immer;)