/* GEM Worm * Copyright (C) 2009 Jeffrey Armstrong * http://jeff.rainbow-100.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * A full version of the license terms is available in LICENSE.txt. */ #include #include "player.h" #include "field.h" void move_player(WPLAYER *player, char dir) { player->dir = dir; } void swap(char *i, char *j) { char s; s = *i; *i = *j; *j = s; } void grow(WPLAYER *player, int count) { player->grow += count; } int update_player(WPLAYER *player, int *tailx, int *taily) { WUNIT *walker; char lastx, lasty; int alive; walker = player->head; lastx = walker->c_x; lasty = walker->c_y; switch(player->dir) { case WUP: lasty--; break; case WDOWN: lasty++; break; case WLEFT: lastx--; break; case WRIGHT: lastx++; break; } while(walker != NULL) { swap(&lastx, &walker->c_x); swap(&lasty, &walker->c_y); if(walker->next == NULL && player->grow > 0) { walker->next =(WUNIT *)malloc(sizeof(WUNIT)); ((WUNIT *)walker->next)->next = NULL; ((WUNIT *)walker->next)->c_x = lastx; ((WUNIT *)walker->next)->c_y = lasty; player->grow--; } walker = (WUNIT *)walker->next; } *tailx = lastx; *taily = lasty; walker = (WUNIT *)player->head->next; alive = ALIVE; while(walker != NULL) { if(walker->c_x == player->head->c_x && walker->c_y == player->head->c_y) { alive = DEAD; break; } walker = (WUNIT *)walker->next; } return alive; } WUNIT *reset_body(WUNIT *head) { WUNIT *walker; WUNIT *tmp; int i; char lastx; walker = head; while(walker != NULL) { tmp = walker; walker = (WUNIT *)walker->next; tmp->next = NULL; free(tmp); } walker = (WUNIT *)malloc(sizeof(WUNIT)); walker->c_x = CELLW/3*2; walker->c_y = CELLH/2; tmp = walker; for(i=1;ic_x; walker->next = (WUNIT *)malloc(sizeof(WUNIT)); walker = (WUNIT *)walker->next; walker->c_y = CELLH/2; walker->c_x = lastx+1; walker->next = NULL; } return tmp; } void reset_player(WPLAYER *player) { player->length = STARTLENGTH; player->dir = WLEFT; player->head = reset_body(player->head); } WPLAYER *init_player() { WPLAYER *player; player = (WPLAYER *)malloc(sizeof(WPLAYER)); player->head = NULL; reset_player(player); player->grow = 0; player->score = 0; return player; }