src/game.c

changeset 23
824c9522ce66
parent 22
41bbfd4d17a3
child 25
3ab0c2e1a4e2
     1.1 --- a/src/game.c	Mon Mar 31 14:08:00 2014 +0200
     1.2 +++ b/src/game.c	Mon Mar 31 15:03:25 2014 +0200
     1.3 @@ -35,12 +35,12 @@
     1.4  
     1.5  static const uint8_t boardx = 10, boardy = 10;
     1.6  
     1.7 -static void draw_board(Board board, MoveListRoot *movelist, uint8_t mycolor) {
     1.8 +static void draw_board(GameState *gamestate) {
     1.9      
    1.10      for (uint8_t y = 0 ; y < 8 ; y++) {
    1.11          for (uint8_t x = 0 ; x < 8 ; x++) {
    1.12 -            uint8_t col = board[y][x] & COLOR_MASK;
    1.13 -            uint8_t piece = board[y][x] & PIECE_MASK;
    1.14 +            uint8_t col = gamestate->board[y][x] & COLOR_MASK;
    1.15 +            uint8_t piece = gamestate->board[y][x] & PIECE_MASK;
    1.16              char piecec;
    1.17              if (piece) {
    1.18                  piecec = piece == PAWN ? 'P' : getpiecechr(piece);
    1.19 @@ -51,8 +51,8 @@
    1.20              attrset((col == WHITE ? A_BOLD : A_DIM) |
    1.21                  COLOR_PAIR((y&1)==(x&1) ? COL_WB : COL_BW));
    1.22              
    1.23 -            int cy = mycolor == WHITE ? boardy-y : boardy-7+y;
    1.24 -            int cx = mycolor == WHITE ? boardx+x*3 : boardx+21-x*3;
    1.25 +            int cy = gamestate->mycolor == WHITE ? boardy-y : boardy-7+y;
    1.26 +            int cx = gamestate->mycolor == WHITE ? boardx+x*3 : boardx+21-x*3;
    1.27              mvaddch(cy, cx, ' ');
    1.28              mvaddch(cy, cx+1, piecec);
    1.29              mvaddch(cy, cx+2, ' ');
    1.30 @@ -61,8 +61,8 @@
    1.31      
    1.32      attrset(A_NORMAL);
    1.33      for (uint8_t i = 0 ; i < 8 ; i++) {
    1.34 -        int x = mycolor == WHITE ? boardx+i*3+1 : boardx+22-i*3;
    1.35 -        int y = mycolor == WHITE ? boardy-i : boardy-7+i;
    1.36 +        int x = gamestate->mycolor == WHITE ? boardx+i*3+1 : boardx+22-i*3;
    1.37 +        int y = gamestate->mycolor == WHITE ? boardy-i : boardy-7+i;
    1.38          mvaddch(boardy+1, x, 'a'+i);
    1.39          mvaddch(y, boardx-2, '1'+i);
    1.40      }
    1.41 @@ -72,14 +72,14 @@
    1.42      uint8_t logy = 0;
    1.43      const uint8_t logx = boardx + 30;
    1.44      int logi = 1;
    1.45 -    MoveList *logelem = movelist->first;
    1.46 +    MoveList *logelem = gamestate->movelist;
    1.47      
    1.48      while (logelem) {
    1.49          logi++;
    1.50          if (logi % 2 == 0) {
    1.51              if ((logi - 2) % 4 == 0) {
    1.52                  logy++;
    1.53 -                wmove(tchess_window, logy, logx);
    1.54 +                move(logy, logx);
    1.55              }
    1.56              printw("%d. ", logi / 2);
    1.57          }
    1.58 @@ -108,15 +108,14 @@
    1.59  }
    1.60  
    1.61  
    1.62 -static int sendmove(Board board, MoveListRoot *movelist,
    1.63 -    uint8_t mycolor, int opponent) {
    1.64 +static int sendmove(GameState *gamestate, int opponent) {
    1.65      
    1.66      const size_t buflen = 8;
    1.67      char movestr[buflen];
    1.68      _Bool remisrejected = FALSE;
    1.69      uint8_t code;
    1.70      
    1.71 -    int inputy = getmaxy(tchess_window) - 6;
    1.72 +    int inputy = getmaxy(stdscr) - 6;
    1.73      while (1) {
    1.74          move(inputy, 0);
    1.75          if (remisrejected) {
    1.76 @@ -156,7 +155,7 @@
    1.77              }
    1.78          } else {
    1.79              Move move;
    1.80 -            int eval_result = eval_move(board, mycolor, movestr, &move);
    1.81 +            int eval_result = eval_move(gamestate, movestr, &move);
    1.82              switch (eval_result) {
    1.83              case VALID_MOVE_SYNTAX:
    1.84                  net_send_data(opponent, NETCODE_MOVE, &move, sizeof(Move));
    1.85 @@ -166,8 +165,7 @@
    1.86                  if (code == NETCODE_DECLINE) {
    1.87                      printw("Invalid move.");
    1.88                  } else {
    1.89 -                    apply_move(board, &move);
    1.90 -                    addmove(movelist, &move);
    1.91 +                    apply_move(gamestate, &move);
    1.92                      if (move.checkmate) {
    1.93                          printw("Checkmate!");
    1.94                          clrtoeol();
    1.95 @@ -194,9 +192,9 @@
    1.96      }
    1.97  }
    1.98  
    1.99 -static int recvmove(Board board, MoveListRoot *movelist, int opponent) {
   1.100 +static int recvmove(GameState *gamestate, int opponent) {
   1.101      
   1.102 -    int inputy = getmaxy(tchess_window) - 6;
   1.103 +    int inputy = getmaxy(stdscr) - 6;
   1.104      while (1) {
   1.105          move(inputy, 0);
   1.106          printw("Awaiting opponent move...");
   1.107 @@ -225,9 +223,8 @@
   1.108                  break;
   1.109              case NETCODE_MOVE:
   1.110                  net_recieve_data(opponent, &move, sizeof(Move));
   1.111 -                if (validate_move(board, &move)) {
   1.112 -                    apply_move(board, &move);
   1.113 -                    addmove(movelist, &move);
   1.114 +                if (validate_move(gamestate, &move)) {
   1.115 +                    apply_move(gamestate, &move);
   1.116                      if (move.check) {
   1.117                          net_send_code(opponent, NETCODE_CHECK);
   1.118                      } else if (move.checkmate) {
   1.119 @@ -243,40 +240,12 @@
   1.120      }
   1.121  }
   1.122  
   1.123 -void freemovelist(MoveListRoot* list) {
   1.124 -    MoveList *elem;
   1.125 -    elem = list->first;
   1.126 -    while (elem) {
   1.127 -        MoveList *cur = elem;
   1.128 -        elem = elem->next;
   1.129 -        free(cur);
   1.130 -    };
   1.131 -    free(list);
   1.132 -}
   1.133 -
   1.134 -void addmove(MoveListRoot* list, Move *move) {
   1.135 -    MoveList *elem = malloc(sizeof(MoveList));
   1.136 -    elem->next = NULL;
   1.137 -    elem->move = *move;
   1.138 -    
   1.139 -    if (list->last) {
   1.140 -        list->last->next = elem;
   1.141 -        list->last = elem;
   1.142 -    } else {
   1.143 -        list->first = list->last = elem;
   1.144 -    }
   1.145 -}
   1.146 -
   1.147  void game_start(Settings *settings, int opponent) {
   1.148      _Bool myturn = is_server(settings) ==
   1.149          (settings->gameinfo.servercolor == WHITE);
   1.150 -    uint8_t mycolor = myturn ? WHITE:BLACK;
   1.151      
   1.152 -    _Bool running;
   1.153 -    
   1.154 -    MoveListRoot* movelist = calloc(1, sizeof(MoveListRoot));
   1.155 -    
   1.156 -    Board board = {
   1.157 +    GameState gamestate;
   1.158 +    Board initboard = {
   1.159          {WROOK, WKNIGHT, WBISHOP, WQUEEN, WKING, WBISHOP, WKNIGHT, WROOK},
   1.160          {WPAWN, WPAWN,   WPAWN,   WPAWN,  WPAWN, WPAWN,   WPAWN,   WPAWN},
   1.161          {0,     0,       0,       0,      0,     0,       0,       0},
   1.162 @@ -286,22 +255,26 @@
   1.163          {BPAWN, BPAWN,   BPAWN,   BPAWN,  BPAWN, BPAWN,   BPAWN,   BPAWN},
   1.164          {BROOK, BKNIGHT, BBISHOP, BQUEEN, BKING, BBISHOP, BKNIGHT, BROOK}
   1.165      };
   1.166 +    memcpy(gamestate.board, initboard, sizeof(Board));
   1.167 +    gamestate.mycolor = myturn ? WHITE:BLACK;
   1.168 +    gamestate.movelist = gamestate.lastmove = NULL;
   1.169      
   1.170 +    _Bool running;
   1.171      do {
   1.172          clear();
   1.173 -        draw_board(board, movelist, mycolor);
   1.174 +        draw_board(&gamestate);
   1.175          if (myturn) {
   1.176 -            running = !sendmove(board, movelist, mycolor, opponent);
   1.177 +            running = !sendmove(&gamestate, opponent);
   1.178          } else {
   1.179 -            running = !recvmove(board, movelist, opponent);
   1.180 +            running = !recvmove(&gamestate, opponent);
   1.181              flushinp(); // flush any input the user hacked in while waiting
   1.182          }
   1.183          myturn ^= TRUE;
   1.184      }  while (running);
   1.185      
   1.186 -    freemovelist(movelist);
   1.187 +    gamestate_cleanup(&gamestate);
   1.188      
   1.189 -    mvaddstr(getmaxy(tchess_window)-1, 0,
   1.190 +    mvaddstr(getmaxy(stdscr)-1, 0,
   1.191          "Game has ended. Press any key to leave...");
   1.192      getch();
   1.193  }

mercurial