src/game.c

Tue, 01 Apr 2014 10:28:08 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 01 Apr 2014 10:28:08 +0200
changeset 24
4d030da07c88
parent 23
824c9522ce66
child 25
3ab0c2e1a4e2
permissions
-rw-r--r--

implemented queen

6
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2014 Mike Becker. All rights reserved.
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 *
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 */
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 #include "game.h"
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
31 #include "network.h"
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
32 #include "input.h"
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
33 #include <ncurses.h>
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
34 #include <string.h>
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
35
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
36 static const uint8_t boardx = 10, boardy = 10;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
37
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
38 static void draw_board(GameState *gamestate) {
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
39
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
40 for (uint8_t y = 0 ; y < 8 ; y++) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
41 for (uint8_t x = 0 ; x < 8 ; x++) {
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
42 uint8_t col = gamestate->board[y][x] & COLOR_MASK;
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
43 uint8_t piece = gamestate->board[y][x] & PIECE_MASK;
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
44 char piecec;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
45 if (piece) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
46 piecec = piece == PAWN ? 'P' : getpiecechr(piece);
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
47 } else {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
48 piecec = ' ';
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
49 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
50
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
51 attrset((col == WHITE ? A_BOLD : A_DIM) |
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
52 COLOR_PAIR((y&1)==(x&1) ? COL_WB : COL_BW));
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
53
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
54 int cy = gamestate->mycolor == WHITE ? boardy-y : boardy-7+y;
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
55 int cx = gamestate->mycolor == WHITE ? boardx+x*3 : boardx+21-x*3;
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
56 mvaddch(cy, cx, ' ');
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
57 mvaddch(cy, cx+1, piecec);
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
58 mvaddch(cy, cx+2, ' ');
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
59 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
60 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
61
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
62 attrset(A_NORMAL);
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
63 for (uint8_t i = 0 ; i < 8 ; i++) {
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
64 int x = gamestate->mycolor == WHITE ? boardx+i*3+1 : boardx+22-i*3;
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
65 int y = gamestate->mycolor == WHITE ? boardy-i : boardy-7+i;
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
66 mvaddch(boardy+1, x, 'a'+i);
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
67 mvaddch(y, boardx-2, '1'+i);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
68 }
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
69
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
70 /* move log */
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
71 // TODO: introduce window to avoid bugs with a long move log
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
72 uint8_t logy = 0;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
73 const uint8_t logx = boardx + 30;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
74 int logi = 1;
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
75 MoveList *logelem = gamestate->movelist;
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
76
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
77 while (logelem) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
78 logi++;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
79 if (logi % 2 == 0) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
80 if ((logi - 2) % 4 == 0) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
81 logy++;
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
82 move(logy, logx);
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
83 }
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
84 printw("%d. ", logi / 2);
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
85 }
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
86
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
87 if (logelem) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
88 Move move = logelem->move;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
89 char logstr[] = {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
90 getpiecechr(move.piece),
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
91 filechr(move.fromfile), rowchr(move.fromrow),
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
92 move.capture ? 'x':'\0',
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
93 filechr(move.tofile), rowchr(move.torow),
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
94 move.check ? '+' : (move.checkmate ? '#' :
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
95 (move.promotion ? '=' : '\0')),
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
96 move.promotion ? getpiecechr(move.promotion) : '\0',
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
97 ' '
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
98 };
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
99 for (int stri = 0 ; stri < sizeof(logstr) ; stri++) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
100 if (logstr[stri]) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
101 addch(logstr[stri]);
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
102 }
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
103 }
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
104
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
105 logelem = logelem->next;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
106 }
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
107 }
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
108 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
109
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
110
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
111 static int sendmove(GameState *gamestate, int opponent) {
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
112
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
113 const size_t buflen = 8;
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
114 char movestr[buflen];
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
115 _Bool remisrejected = FALSE;
11
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
116 uint8_t code;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
117
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
118 int inputy = getmaxy(stdscr) - 6;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
119 while (1) {
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
120 move(inputy, 0);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
121 if (remisrejected) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
122 printw(
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
123 "Use chess notation to enter your move.\n"
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
124 "Remis offer rejected - type 'surr' to surrender. \n\n"
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
125 "Type your move: ");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
126 } else {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
127 printw(
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
128 "Use chess notation to enter your move.\n"
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
129 "Or type 'surr' to surrender or 'remis' to offer remis.\n\n"
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
130 "Type your move: ");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
131 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
132 clrtoeol();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
133 refresh();
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
134 getnstr(movestr, buflen);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
135
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
136 if (strncmp(movestr, "surr", buflen) == 0) {
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
137 printw("You surrendered!");
16
a298c6637c30 introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
138 clrtoeol();
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
139 refresh();
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
140 net_send_code(opponent, NETCODE_SURRENDER);
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
141 return 1;
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
142 } else if (strncmp(movestr, "remis", buflen) == 0) {
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
143 if (!remisrejected) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
144 net_send_code(opponent, NETCODE_REMIS);
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
145 printw("Remis offer sent - waiting for acceptance...");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
146 refresh();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
147 if (net_recieve_code(opponent) == NETCODE_ACCEPT) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
148 printw("\rRemis accepted!");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
149 clrtoeol();
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
150 refresh();
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
151 return 1;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
152 } else {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
153 remisrejected = TRUE;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
154 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
155 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
156 } else {
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
157 Move move;
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
158 int eval_result = eval_move(gamestate, movestr, &move);
16
a298c6637c30 introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
159 switch (eval_result) {
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
160 case VALID_MOVE_SYNTAX:
22
41bbfd4d17a3 improved network performance
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
161 net_send_data(opponent, NETCODE_MOVE, &move, sizeof(Move));
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
162 code = net_recieve_code(opponent);
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
163 move.check = code == NETCODE_CHECK;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
164 move.checkmate = code == NETCODE_CHECKMATE;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
165 if (code == NETCODE_DECLINE) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
166 printw("Invalid move.");
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
167 } else {
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
168 apply_move(gamestate, &move);
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
169 if (move.checkmate) {
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
170 printw("Checkmate!");
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
171 clrtoeol();
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
172 return 1;
14
970748b9a73b fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
173 } else {
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
174 return 0;
11
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
175 }
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
176 }
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
177 break;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
178 case AMBIGUOUS_MOVE:
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
179 printw("Ambiguous move - please specify the piece to move.");
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
180 break;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
181 case INVALID_POSITION:
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
182 printw("Cannot find the piece that shall be moved.");
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
183 break;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
184 case NEED_PROMOTION:
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
185 printw("You need to promote the pawn (append \"=Q\" e.g.)!");
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
186 break;
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
187 default:
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
188 printw("Can't interpret move - please use algebraic notation.");
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
189 }
16
a298c6637c30 introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
190 clrtoeol();
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
191 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
192 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
193 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
194
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
195 static int recvmove(GameState *gamestate, int opponent) {
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
196
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
197 int inputy = getmaxy(stdscr) - 6;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
198 while (1) {
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
199 move(inputy, 0);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
200 printw("Awaiting opponent move...");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
201 clrtoeol();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
202 refresh();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
203
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
204 // TODO: nonblocking
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
205 uint32_t code = net_recieve_code(opponent);
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
206
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
207 Move move;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
208 switch (code) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
209 case NETCODE_SURRENDER:
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
210 printw("\rYour opponent surrendered!");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
211 clrtoeol();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
212 return 1;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
213 case NETCODE_REMIS:
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
214 if (prompt_yesno(
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
215 "\rYour opponent offers remis - do you accept")) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
216 printw("\rRemis accepted!");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
217 clrtoeol();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
218 net_send_code(opponent, NETCODE_ACCEPT);
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
219 return 1;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
220 } else {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
221 net_send_code(opponent, NETCODE_DECLINE);
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
222 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
223 break;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
224 case NETCODE_MOVE:
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
225 net_recieve_data(opponent, &move, sizeof(Move));
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
226 if (validate_move(gamestate, &move)) {
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
227 apply_move(gamestate, &move);
11
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
228 if (move.check) {
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
229 net_send_code(opponent, NETCODE_CHECK);
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
230 } else if (move.checkmate) {
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
231 net_send_code(opponent, NETCODE_CHECKMATE);
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
232 } else {
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
233 net_send_code(opponent, NETCODE_ACCEPT);
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
234 }
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
235 return 0;
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
236 } else {
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
237 net_send_code(opponent, NETCODE_DECLINE);
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
238 }
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
239 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
240 }
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
241 }
6
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
242
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
243 void game_start(Settings *settings, int opponent) {
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
244 _Bool myturn = is_server(settings) ==
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
245 (settings->gameinfo.servercolor == WHITE);
8
52d742aee695 implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
246
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
247 GameState gamestate;
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
248 Board initboard = {
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
249 {WROOK, WKNIGHT, WBISHOP, WQUEEN, WKING, WBISHOP, WKNIGHT, WROOK},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
250 {WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
251 {0, 0, 0, 0, 0, 0, 0, 0},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
252 {0, 0, 0, 0, 0, 0, 0, 0},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
253 {0, 0, 0, 0, 0, 0, 0, 0},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
254 {0, 0, 0, 0, 0, 0, 0, 0},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
255 {BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN},
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
256 {BROOK, BKNIGHT, BBISHOP, BQUEEN, BKING, BBISHOP, BKNIGHT, BROOK}
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
257 };
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
258 memcpy(gamestate.board, initboard, sizeof(Board));
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
259 gamestate.mycolor = myturn ? WHITE:BLACK;
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
260 gamestate.movelist = gamestate.lastmove = NULL;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
261
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
262 _Bool running;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
263 do {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
264 clear();
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
265 draw_board(&gamestate);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
266 if (myturn) {
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
267 running = !sendmove(&gamestate, opponent);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
268 } else {
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
269 running = !recvmove(&gamestate, opponent);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
270 flushinp(); // flush any input the user hacked in while waiting
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
271 }
11
08d7a6e3ec31 added network messages for check and checkmate
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
272 myturn ^= TRUE;
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
273 } while (running);
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
274
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
275 gamestate_cleanup(&gamestate);
18
6008840b859e fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
276
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
277 mvaddstr(getmaxy(stdscr)-1, 0,
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
278 "Game has ended. Press any key to leave...");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 6
diff changeset
279 getch();
6
daaf6e5b3501 structured code
Mike Becker <universe@uap-core.de>
parents:
diff changeset
280 }

mercurial