Witam, tworze coś co ciężko jest określić (nazwałbym to grą pisaną dla przećwiczenia pozanej wiedzy).
Mam postać towrzoną za zasadzie listy dwukierunkowej
typedef struct hero
{
int x, y; //współżędne
char *view; //wygląd w postaci literowej np. "A"
hero *next, *prev;
};
No i jej inicjacja
hero *player = new hero;
hero *element2 = new hero;
player->x = 10;
player->y = 10;
player->view = "O";
player->next = NULL;
player->prev = elemnent2;
player->x = 10;
player->y = 9;
player->view = "o";
player->next = player;
player->prev = NULL;
Taki wężyk. Następnie pobieram od użytkownika klawisz w którym kierunku miałby się poruszyć ten wąż, poruszam go i wyświetlam funkcjami:
void printSnake(snake **tail, WINDOW *field) //WINDOW *field to wskaznik do okna w ktorym ma się owy wąż wyświetlać
{
snake *tmp = *tail;
wclear(field);//funkcja z ncurses
box(field, 0, 0);//funkcja z ncurses
while(tmp != NULL)
{
mvwprintw(field, tmp->y, tmp->x, tmp->view); //funkcja z ncurses
wrefresh(field); //funkcja z ncurses
tmp = tmp->next;
}
}
void moveSnake(snake **tail, snake **head, int way, WINDOW *field)
{
switch(way)
{
case KEY_LEFT:
if((*tail) != (*head))
{
snake *newElement = new snake;
newElement->x = (*head)->x--;
newElement->y = (*head)->y;
newElement->view = "o";
newElement->next = (*head);
newElement->prev = (*head)->prev;
(*head)->prev->next = newElement;
(*head)->prev = newElement;
(*tail) = (*tail)->next;
delete (*tail)->prev;
(*tail)->prev = NULL;
}
else (*head)->x--;
break;
case KEY_RIGHT:
if((*tail) != (*head))
{
snake *newElement = new snake;
newElement->x = (*head)->x++;
newElement->y = (*head)->y;
newElement->view = "o";
newElement->next = (*head);
newElement->prev = (*head)->prev;
(*head)->prev->next = newElement;
(*head)->prev = newElement;
*tail = (*tail)->next;
delete (*tail)->prev;
(*tail)->prev = NULL;
}
else (*head)->x++;
break;
case KEY_UP:
if((*tail) != (*head))
{
snake *newElement = new snake;
newElement->x = (*head)->x;
newElement->y = (*head)->y--;
newElement->view = "o";
newElement->next = (*head);
newElement->prev = (*head)->prev;
(*head)->prev->next = newElement;
(*head)->prev = newElement;
*tail = (*tail)->next;
delete (*tail)->prev;
(*tail)->prev = NULL;
}
else (*head)->y--;
break;
case KEY_DOWN:
if((*tail) != (*head))
{
snake *newElement = new snake;
newElement->x = (*head)->x;
newElement->y = (*head)->y++;
newElement->view = "o";
newElement->next = (*head);
newElement->prev = (*head)->prev;
(*head)->prev->next = newElement;
(*head)->prev = newElement;
(*tail) = (*tail)->next;
delete (*tail)->prev;
(*tail)->prev = NULL;
}
else (*head)->y++;
break;
}
printSnake(tail, field);
}
I jak wszystko sobie działa i chciałbym teraz dodać coś takiego aby po naciśnięciu np klawisza w lewo wąż poruszał się ciągle w lewo do momentu aż użytkownik nie klinknie kolejnego klawisza. Jestem pewnien że da się to zrobić tylko i wyłącznie za pomocą wątków. Chciałbym użyć tych z <process.h>. Tylko nie bardzo mi to wychodzi. Spłodziłem coś takiego.
typedef struct thread
{
int speed, way;
snake **tail, **head;
WINDOW *field;
};
void moving(void *parametr) //moj watek
{
thread *arg;
arg = (thread*)parametr;
while(1)
{
moveSnake (arg->tail, arg->head, arg->way);
printSnake(arg->tail, (&arg)->field);
_sleep(arg->speed);
}
}
I miałby on być włączany na początku gry przerywany po naciśnięciu klawisza i znów uruchamiany z nowymi parametrami.
hero *head = player,
*tail = element2;
...
thread a = new thread;
a->head = &head;
a->tail = &tail;
a->way = key;
a->speed = 100;
a->field = field;
_beginthread(moving, 0, &a);
Tylko nie bardzo wiem co robie źle ponieważ nic nie działa. Wątek jest uruchamiany ale albo sie wywala na printSnake(); albo (bez tego, powinno tez działać bo rysowanie jest także w samym moveSnake()) się nie porusza. Byłbym wdzięczny za wskazanie poprawnego rozwiązania. :/