Sat, 22 Mar 2014 16:04:02 +0100
implemented simple pawn movement
6 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * | |
4 | * Copyright 2014 Mike Becker. All rights reserved. | |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions are met: | |
8 | * | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * | |
12 | * 2. Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in the | |
14 | * documentation and/or other materials provided with the distribution. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
26 | * POSSIBILITY OF SUCH DAMAGE. | |
27 | * | |
28 | */ | |
29 | ||
30 | #include "game.h" | |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
31 | #include "input.h" |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
32 | #include <ncurses.h> |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
33 | #include <string.h> |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
34 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
35 | 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
|
36 | |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
37 | static void draw_board(Board board, uint8_t mycolor) { |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
38 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
39 | 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
|
40 | for (uint8_t x = 0 ; x < 8 ; x++) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
41 | uint8_t col = board[y][x] & COLOR_MASK; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
42 | uint8_t piece = board[y][x] & PIECE_MASK; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
43 | char piecec = ' '; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
44 | switch (piece) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
45 | case PAWN: piecec = 'P'; break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
46 | case ROOK: piecec = 'R'; break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
47 | case KNIGHT: piecec = 'N'; break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
48 | case BISHOP: piecec = 'B'; break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
49 | case QUEEN: piecec = 'Q'; break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
50 | case KING: piecec = 'K'; break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
51 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
52 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
53 | 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
|
54 | 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
|
55 | |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
56 | int cy = mycolor == WHITE ? boardy-y : boardy-7+y; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
57 | int cx = mycolor == WHITE ? boardx+x*3 : boardx+21-x*3; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
58 | mvaddch(cy, cx, ' '); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
59 | mvaddch(cy, cx+1, piecec); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
60 | mvaddch(cy, cx+2, ' '); |
7
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 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
63 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
64 | attrset(A_NORMAL); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
65 | for (uint8_t i = 0 ; i < 8 ; i++) { |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
66 | int x = mycolor == WHITE ? boardx+i*3+1 : boardx+22-i*3; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
67 | int y = mycolor == WHITE ? boardy-i : boardy-7+i; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
68 | mvaddch(boardy+1, x, 'a'+i); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
69 | 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
|
70 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
71 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
72 | |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
73 | static void apply_move(Board board, Move *move) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
74 | board[move->fromrow][move->fromfile] = 0; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
75 | // TODO: care for en passant capture |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
76 | board[move->torow][move->tofile] = move->piece; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
77 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
78 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
79 | static _Bool validate_move(Board board, uint8_t mycolor, Move *move) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
80 | _Bool result = TRUE; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
81 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
82 | /* does piece exist */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
83 | result &= board[move->fromrow][move->fromfile] == move->piece; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
84 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
85 | /* is move rule conform */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
86 | // TODO: make it so |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
87 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
88 | /* is piece blocked */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
89 | // TODO: make it so |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
90 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
91 | /* is piece pinned */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
92 | // TODO: make it so |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
93 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
94 | return result; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
95 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
96 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
97 | static _Bool eval_move(Board board, uint8_t mycolor, char *movestr, Move *move) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
98 | memset(move, 0, sizeof(Move)); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
99 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
100 | size_t len = strlen(movestr); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
101 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
102 | /* remove check */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
103 | if (movestr[len-1] == '+') { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
104 | len--; movestr[len] = '\0'; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
105 | move->check = TRUE; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
106 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
107 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
108 | if (len == 2) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
109 | /* pawn move (e.g. "e4") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
110 | if (isfile(movestr[0]) && isrow(movestr[1])) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
111 | move->piece = PAWN; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
112 | move->fromfile = move->tofile = fileidx(movestr[0]); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
113 | move->torow = rowidx(movestr[1]); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
114 | move->fromrow = rowidx(movestr[1]) + (mycolor == WHITE ? -1 : 1); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
115 | if (move->fromrow > 6) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
116 | move->piece = 0; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
117 | } else { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
118 | /* advanced first move */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
119 | if (move->fromrow == (mycolor == WHITE ? 2 : 5) && |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
120 | board[move->fromrow][move->fromfile] != (mycolor|PAWN)) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
121 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
122 | move->fromrow += (mycolor == WHITE ? -1 : 1); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
123 | if (move->fromrow > 6) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
124 | move->piece = 0; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
125 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
126 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
127 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
128 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
129 | } else if (len == 3) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
130 | if (strcmp(movestr, "0-0") == 0) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
131 | /* king side castling */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
132 | move->piece = KING; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
133 | move->fromfile = fileidx('e'); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
134 | move->fromfile = fileidx('g'); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
135 | move->fromrow = move->torow = mycolor == WHITE ? 0 : 7; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
136 | } else { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
137 | /* unambiguous move (e.g. "Nf3") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
138 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
139 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
140 | } else if (len == 4) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
141 | /* ambiguous move (e.g. "Ndf3") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
142 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
143 | /* unambiguous capture (e.g. "Nxf3", "dxe5") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
144 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
145 | } else if (len == 5) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
146 | /* queen side castling "O-O-O" */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
147 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
148 | /* ambiguous capture (e.g. "Ndxf3") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
149 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
150 | /* long notation move (e.g. "Nc5a4") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
151 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
152 | /* long notation capture (e.g. "e5xf6") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
153 | } else if (len == 6) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
154 | /* long notation capture (e.g. "Nc5xf3") */ |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
155 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
156 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
157 | if (move->piece) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
158 | move->piece |= mycolor; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
159 | return TRUE; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
160 | } else { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
161 | return FALSE; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
162 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
163 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
164 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
165 | static int sendmove(Board board, uint8_t mycolor, int opponent) { |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
166 | const size_t buflen = 8; |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
167 | char movestr[buflen]; |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
168 | _Bool remisrejected = FALSE; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
169 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
170 | while (1) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
171 | move(boardy+3, 0); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
172 | if (remisrejected) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
173 | printw( |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
174 | "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
|
175 | "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
|
176 | "Type your move: "); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
177 | } else { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
178 | printw( |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
179 | "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
|
180 | "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
|
181 | "Type your move: "); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
182 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
183 | clrtoeol(); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
184 | refresh(); |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
185 | getnstr(movestr, buflen); |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
186 | |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
187 | 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
|
188 | printw("You surrendered!"); |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
189 | refresh(); |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
190 | net_send_code(opponent, NETCODE_SURRENDER); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
191 | return 1; |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
192 | } 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
|
193 | if (!remisrejected) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
194 | net_send_code(opponent, NETCODE_REMIS); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
195 | 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
|
196 | refresh(); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
197 | 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
|
198 | printw("\rRemis accepted!"); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
199 | clrtoeol(); |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
200 | refresh(); |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
201 | return 1; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
202 | } else { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
203 | remisrejected = TRUE; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
204 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
205 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
206 | } else { |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
207 | Move move; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
208 | if (eval_move(board, mycolor, movestr, &move)) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
209 | net_send_code(opponent, NETCODE_MOVE); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
210 | net_send_data(opponent, &move, sizeof(Move)); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
211 | if (net_recieve_code(opponent) == NETCODE_ACCEPT) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
212 | apply_move(board, &move); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
213 | return 0; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
214 | } else { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
215 | printw("Invalid move."); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
216 | clrtoeol(); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
217 | } |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
218 | } else { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
219 | printw("Can't interpret move - please use algebraic notation."); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
220 | } |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
221 | } |
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 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
224 | |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
225 | static int recvmove(Board board, uint8_t mycolor, int opponent) { |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
226 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
227 | while (1) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
228 | move(boardy+3, 0); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
229 | printw("Awaiting opponent move..."); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
230 | clrtoeol(); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
231 | refresh(); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
232 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
233 | // TODO: nonblocking |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
234 | uint32_t code = net_recieve_code(opponent); |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
235 | |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
236 | Move move; |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
237 | switch (code) { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
238 | case NETCODE_SURRENDER: |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
239 | printw("\rYour opponent surrendered!"); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
240 | clrtoeol(); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
241 | return 1; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
242 | case NETCODE_REMIS: |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
243 | if (prompt_yesno( |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
244 | "\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
|
245 | printw("\rRemis accepted!"); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
246 | clrtoeol(); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
247 | net_send_code(opponent, NETCODE_ACCEPT); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
248 | return 1; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
249 | } else { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
250 | net_send_code(opponent, NETCODE_DECLINE); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
251 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
252 | break; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
253 | case NETCODE_MOVE: |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
254 | net_recieve_data(opponent, &move, sizeof(Move)); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
255 | if (validate_move(board, mycolor, &move)) { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
256 | apply_move(board, &move); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
257 | net_send_code(opponent, NETCODE_ACCEPT); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
258 | return 0; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
259 | } else { |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
260 | net_send_code(opponent, NETCODE_DECLINE); |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
261 | } |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
262 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
263 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
264 | } |
6 | 265 | |
266 | 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
|
267 | _Bool myturn = is_server(settings) == |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
268 | (settings->gameinfo.servercolor == WHITE); |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
269 | uint8_t mycolor = myturn ? WHITE:BLACK; |
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
270 | |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
271 | _Bool running; |
6 | 272 | |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
273 | Board board = { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
274 | {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
|
275 | {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
|
276 | {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
|
277 | {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
|
278 | {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
|
279 | {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
|
280 | {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
|
281 | {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
|
282 | }; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
283 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
284 | do { |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
285 | clear(); |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
286 | draw_board(board, mycolor); |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
287 | if (myturn) { |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
288 | running = !sendmove(board, mycolor, opponent); |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
289 | } else { |
8
52d742aee695
implemented simple pawn movement
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
290 | running = !recvmove(board, mycolor, opponent); |
7
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
291 | 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
|
292 | } |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
293 | myturn ^= 1; |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
294 | } while (running); |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
295 | |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
296 | mvaddstr(getmaxy(tchess_window)-1, 0, |
41468077b5bb
implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
297 | "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
|
298 | getch(); |
6 | 299 | } |