Ĺadny brzuch
Witam, wiem że pewnie temat będzie zły ale nie wiedziałem jak nazwać mój problem. Jestem w trakcie pisania "snake'a" i jak narazie wszystko działało bez problemu ale jak dodałem pojawianie się jedzenia i kolizje z nim to program czasami się wywala (bez żadnych błędów) a czasami rysowanie snake'a się jakby restartuje.
#include <curses.h> #include <stdlib.h> #include <time.h> typedef struct snake { int x, y; char *view; snake *next, *prev; }; int moveSnake(snake**, snake**, int, WINDOW*); //poruszanie void printSnake(snake**, WINDOW*, snake**); //rysowanie int checkEvent(snake**, snake**, WINDOW*, WINDOW*, snake**); //sprawdzanie kolizji unsigned short int life = 3, level = 1, elements = 1; unsigned long long score = 0; snake *apple = new snake; int main() { initscr(); curs_set(0); start: snake *player = new snake; srand(time(NULL)); apple->x = ((rand()%20)+1); apple->y = ((rand()%78)+1); apple->view = "A"; apple->prev = NULL; apple->next = NULL; if(!player) { printf("Allocation error!"); for(;;);; } snake *tail = player, *head = player; player->x = 10; player->y = 10; player->view = "O"; player->prev = NULL; player->next = NULL; int key, i, tmp = 0; WINDOW *main = newwin(LINES-3, COLS, 0, 0); WINDOW *stats = newwin(3, COLS, 22, 0); keypad(main, TRUE); box(main, 0, 0); box(stats, 0, 0); printSnake(&tail, main, &apple); mvwprintw(stats, 1, 1, "Life(s): %d\tLevel: %d\tLength: %d\tScore: %llu\t ", life, level, elements, score); wrefresh(main); wrefresh(stats); while((key = wgetch(main)) != KEY_F(1)) { switch(key) { case KEY_LEFT: moveSnake(&tail, &head, KEY_LEFT, main); break; case KEY_RIGHT: moveSnake(&tail, &head, KEY_RIGHT, main); break; case KEY_UP: moveSnake(&tail, &head, KEY_UP, main); break; case KEY_DOWN: moveSnake(&tail, &head, KEY_DOWN, main); break; } i = checkEvent(&head, &tail, main, stats, &apple); if (i == 1) goto start; else if(i == 2)break; } wgetch(main); wgetch(main); endwin(); return 0; } void printSnake(snake **tail, WINDOW *main, snake **apple) { snake *tmp; tmp = *tail; wclear(main); box(main, 0, 0); mvwprintw(main, (*apple)->x, (*apple)->y, (*apple)->view); while(tmp != NULL) { mvwprintw(main, tmp->x, tmp->y, tmp->view); wrefresh(main); tmp = tmp->next; } } int moveSnake(snake **tail, snake **head, int way, WINDOW *main) { switch(way) { case KEY_UP: { if((*tail) != (*head)) { (*head)->x; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = *head; add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x--; add->y = (*head)->y; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->x--; break; } case KEY_DOWN: { if((*tail) != (*head)) { (*head)->x; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = *head; add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x++; add->y = (*head)->y; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->x++; break; } case KEY_LEFT: { if((*tail) != (*head)) { (*head)->y; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = (*head); add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x; add->y = (*head)->y--; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->y--; break; } case KEY_RIGHT: { if((*tail) != (*head)) { (*head)->y; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = (*head); add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x; add->y = (*head)->y++; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->y++; break; } } printSnake(tail, main, &apple); } int checkEvent(snake **head, snake **tail, WINDOW *main, WINDOW *stats, snake **apple) { mvwprintw(stats, 1, 1, "Life(s): %d\tLevel: %d\tLength: %d\tScore: %llu\t ", life, level, elements, score); wrefresh(stats); if(((*head)->y == 00) || ((*head)->y == 79)) { over: life--; mvwprintw(stats, 1, 1, "Life(s): %d\tLevel: %d\tLength: %d\tScore: %llu\t ", life, level, elements, score); if(life == 0) { WINDOW *finish = newwin(10, 30, 5, COLS/2-14); box(finish, 0, 0); wrefresh(finish); mvwprintw(finish, 1, 2, "Game Over, you have lost."); mvwprintw(finish, 3, 8, "Your score is:"); mvwprintw(finish, 4, 14, "%lld", score); wrefresh(finish); return 2; } else return 1; } else if(((*head)->x == 21) || ((*head)->x == 00)) goto over; else if(elements >3) { snake *tmp; tmp = *tail; int i = 0; while(i < elements-4) { if (((*head)->y == tmp->y) && ((*head)->x == tmp->x)) { goto over; break; } else { tmp = tmp->next; i++; } } } if(((*head)->x == (*apple)->x) && ((*head)->y == (*apple)->y)) { score += 10; (*apple)->x = ((rand()%20)+1); (*apple)->y = ((rand()%78)+1); } }
Wiem także że kod jest przydługawy i pewnie "brzydko" i niepoprawnie napisany ale narazie chciałbym się skupić nad jego działaniem a później poprawiać kod.
http://www.filecabin...43786-Snake.zip wstawiłem tu wszystkie include , liby(tylko *.a, dev-cpp) z curses, kod i exe'ka(to tak jakby ktos chciał zobaczyc jak to działa i wygląda).
Błąd występuje tak losowo, raz jesli zjem A poaz 10, drugim razem jesli zjem A poraz 20 a czasami nawet 1 ruchu nie zdąże wykonać.
A błąd jest taki że poprostu po zjedzeniu A albo gra się wyłacza(bez zadnych Windows'owskich komunikatów) albo Snake rysuje się na pozycji startowej 10x10.
Jakby komuś się chciało przebrnąć przez moje wypociny byłbym wdzięczny.
Właściwie nie zadałeś w poście pytania <_< , ale chyba chodzi ci oto czy program wywala ci się przez wyciek pamięci. Według mojej wiedzy wyciek pamięci niema prawa wywalić programu.
Znaczy się nie wiem co to jest ale program mi się poprostu od tak czasami wywala i chciałbym się dowiedzieć czemu i jak to usunąć.
A od czego kolega ma DEBUGER ??
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <curses.h> #include <stdlib.h> #include <time.h> typedef struct snake { int x, y; char *view; snake *next, *prev; }; int moveSnake(snake**, snake**, int, WINDOW*); //poruszanie void printSnake(snake**, WINDOW*, snake**); //rysowanie int checkEvent(snake**, snake**, WINDOW*, WINDOW*, snake**); //sprawdzanie kolizji unsigned short int life = 3, level = 1, elements = 1; unsigned long long score = 0; snake *apple = new snake; int main() { initscr(); curs_set(0); start: snake *player = new snake; srand(time(NULL)); apple->x = ((rand()%20)+1); apple->y = ((rand()%78)+1); apple->view = "A"; apple->prev = NULL; apple->next = NULL; if(!player) { printf("Allocation error!"); for(;;);; } snake *tail = player, *head = player; player->x = 10; player->y = 10; player->view = "O"; player->prev = NULL; player->next = NULL; int key, i, tmp = 0; WINDOW *main = newwin(LINES-3, COLS, 0, 0); WINDOW *stats = newwin(3, COLS, 22, 0); keypad(main, TRUE); box(main, 0, 0); box(stats, 0, 0); printSnake(&tail, main, &apple); mvwprintw(stats, 1, 1, "Life(s): %d\tLevel: %d\tLength: %d\tScore: %llu\t ", life, level, elements, score); wrefresh(main); wrefresh(stats); while((key = wgetch(main)) != KEY_F(1)) { switch(key) { case KEY_LEFT: moveSnake(&tail, &head, KEY_LEFT, main); break; case KEY_RIGHT: moveSnake(&tail, &head, KEY_RIGHT, main); break; case KEY_UP: moveSnake(&tail, &head, KEY_UP, main); break; case KEY_DOWN: moveSnake(&tail, &head, KEY_DOWN, main); break; } i = checkEvent(&head, &tail, main, stats, &apple); if (i == 1) goto start; else if(i == 2)break; } wgetch(main); wgetch(main); endwin(); return 0; } void printSnake(snake **tail, WINDOW *main, snake **apple) { snake *tmp; tmp = *tail; wclear(main); box(main, 0, 0); mvwprintw(main, (*apple)->x, (*apple)->y, (*apple)->view); while(tmp != NULL) { mvwprintw(main, tmp->x, tmp->y, tmp->view); wrefresh(main); tmp = tmp->next; } } int moveSnake(snake **tail, snake **head, int way, WINDOW *main) { switch(way) { case KEY_UP: { if((*tail) != (*head)) { (*head)->x; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = *head; add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x--; add->y = (*head)->y; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->x--; break; } case KEY_DOWN: { if((*tail) != (*head)) { (*head)->x; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = *head; add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x++; add->y = (*head)->y; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->x++; break; } case KEY_LEFT: { if((*tail) != (*head)) { (*head)->y; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = (*head); add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x; add->y = (*head)->y--; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->y--; break; } case KEY_RIGHT: { if((*tail) != (*head)) { (*head)->y; snake *add = new snake; if(!add) { printf("Allocation error!"); for(;;);; } add->next = (*head); add->prev = (*head)->prev; (*head)->prev->next = add; (*head)->prev = add; add->x = (*head)->x; add->y = (*head)->y++; add->view = "o"; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = NULL; } else (*head)->y++; break; } } printSnake(tail, main, &apple); } int checkEvent(snake **head, snake **tail, WINDOW *main, WINDOW *stats, snake **apple) { mvwprintw(stats, 1, 1, "Life(s): %d\tLevel: %d\tLength: %d\tScore: %llu\t ", life, level, elements, score); wrefresh(stats); if(((*head)->y == 00) || ((*head)->y == 79)) { over: life--; mvwprintw(stats, 1, 1, "Life(s): %d\tLevel: %d\tLength: %d\tScore: %llu\t ", life, level, elements, score); if(life == 0) { WINDOW *finish = newwin(10, 30, 5, COLS/2-14); box(finish, 0, 0); wrefresh(finish); mvwprintw(finish, 1, 2, "Game Over, you have lost."); mvwprintw(finish, 3, 8, "Your score is:"); mvwprintw(finish, 4, 14, "%lld", score); wrefresh(finish); return 2; } else return 1; } else if(((*head)->x == 21) || ((*head)->x == 00)) goto over; else if(elements >3) { snake *tmp; tmp = *tail; int i = 0; while(i < elements-4) { if (((*head)->y == tmp->y) && ((*head)->x == tmp->x)) { goto over; break; } else { tmp = tmp->next; i++; } } } if(((*head)->x == (*apple)->x) && ((*head)->y == (*apple)->y)) { score += 10; (*apple)->x = ((rand()%20)+1); (*apple)->y = ((rand()%78)+1); } }
Wiem także że kod jest przydługawy i pewnie "brzydko" i niepoprawnie napisany ale narazie chciałbym się skupić nad jego działaniem a później poprawiać kod.
http://www.filecabin...43786-Snake.zip wstawiłem tu wszystkie include , liby(tylko *.a, dev-cpp) z curses, kod i exe'ka(to tak jakby ktos chciał zobaczyc jak to działa i wygląda).
Błąd występuje tak losowo, raz jesli zjem A poaz 10, drugim razem jesli zjem A poraz 20 a czasami nawet 1 ruchu nie zdąże wykonać.
A błąd jest taki że poprostu po zjedzeniu A albo gra się wyłacza(bez zadnych Windows'owskich komunikatów) albo Snake rysuje się na pozycji startowej 10x10.
Jakby komuś się chciało przebrnąć przez moje wypociny byłbym wdzięczny.
Właściwie nie zadałeś w poście pytania <_< , ale chyba chodzi ci oto czy program wywala ci się przez wyciek pamięci. Według mojej wiedzy wyciek pamięci niema prawa wywalić programu.
Znaczy się nie wiem co to jest ale program mi się poprostu od tak czasami wywala i chciałbym się dowiedzieć czemu i jak to usunąć.
A od czego kolega ma DEBUGER ??