|
1 % !TEX program = xelatex |
|
2 \documentclass{article} |
|
3 \usepackage{chessboard} |
|
4 \usepackage[LSBC4,T1]{fontenc} |
|
5 \let\clipbox\relax |
|
6 \usepackage{../styles/style} |
|
7 \usepackage{../styles/langs} |
|
8 \usepackage{disclaimer} |
|
9 \usepackage{ulem} |
|
10 %\usepackage{tipauni} |
|
11 |
|
12 |
|
13 |
|
14 \tikzset |
|
15 {% |
|
16 pics/piece/.style n args={1}{ |
|
17 code={% |
|
18 \fill[rounded corners] (-0.1,-0.1) rectangle (-0.9, -0.9); |
|
19 \fill[left color=white,rounded corners, |
|
20 right color=gray, |
|
21 opacity=0.7] (-0.1,-0.1) rectangle (-0.9, -0.9); |
|
22 \draw[line width=0.4mm,rounded corners] (-0.1,-0.1) rectangle (-0.9, -0.9); |
|
23 \draw[line width=0.2mm,rounded corners] (-0.2,-0.2) rectangle (-0.8, -0.8); |
|
24 \draw[anchor=mid] (-0.5,-0.6) node {#1}; |
|
25 }}, |
|
26 pics/king/.style n args={1}{ |
|
27 code={% |
|
28 \fill[rounded corners] (-0.1,-0.1) rectangle (-0.9, -0.9); |
|
29 \fill[left color=white,rounded corners, |
|
30 right color=gray, |
|
31 opacity=0.7] (-0.1,-0.1) rectangle (-0.9, -0.9); |
|
32 \draw[line width=0.4mm,rounded corners] (-0.1,-0.1) rectangle (-0.9, -0.9); |
|
33 \draw[line width=0.2mm,rounded corners] (-0.2,-0.2) rectangle (-0.8, -0.8); |
|
34 \draw[anchor=mid] (-0.5,-0.6) node {#1}; |
|
35 \draw[anchor=center] (-0.5,-0.25) node {\includegraphics[scale=0.015]{crown.png}}; |
|
36 }} |
|
37 } |
|
38 |
|
39 |
|
40 \begin{document} |
|
41 |
|
42 \setchessboard{smallboard, |
|
43 zero, |
|
44 showmover=false, |
|
45 boardfontencoding=LSBC4, |
|
46 hlabelformat=\arabic{ranklabel}, |
|
47 vlabelformat=\arabic{filelabel}} |
|
48 |
|
49 \mbox{}\\[-18mm]\mbox{} |
|
50 |
|
51 \section*{Resit:\\ Implementing the Shogun Board Game\\ (Scala, 8 Marks)} |
|
52 |
|
53 \noindent |
|
54 You are asked to implement a Scala program for playing the Shogun |
|
55 board game. The deadline for your submission is on XXX at |
|
56 16:00. Make sure you use \texttt{scala-cli} and Scala version \textbf{3.XX} |
|
57 for the resit---the same version as during the lectures. \medskip |
|
58 |
|
59 \IMPORTANTNONE{} |
|
60 |
|
61 \noindent |
|
62 Also note that the running time of each task will be restricted to a |
|
63 maximum of 30 seconds on my laptop: If you calculate a result once, |
|
64 try to avoid to calculate the result again. |
|
65 |
|
66 \DISCLAIMER{} |
|
67 |
|
68 \subsection*{Background} |
|
69 |
|
70 Shogun |
|
71 (\faVolumeUp\,[shÅgoon]) is a game played by two players on a chess board and is somewhat |
|
72 similar to chess and checkers. A real Shogun board looks |
|
73 like in the pictures on the left. |
|
74 |
|
75 |
|
76 \begin{center} |
|
77 \begin{tabular}{@{}ccc@{}} |
|
78 \raisebox{2mm}{\includegraphics[scale=0.1]{shogun2.jpeg}} |
|
79 & |
|
80 \raisebox{2mm}{\includegraphics[scale=0.14]{shogun.jpeg}} |
|
81 & |
|
82 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
83 % chessboard |
|
84 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
85 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
86 { |
|
87 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
88 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
89 } |
|
90 % black pieces |
|
91 \foreach\x/\y/\e in {1/1/1,2/1/3,3/1/2,4/1/3,6/1/3,7/1/1,8/1/2} |
|
92 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
93 % white pieces |
|
94 \foreach\x/\y/\e in {1/8/4,2/8/2,3/8/4,5/8/4,6/8/2,7/8/3,8/8/1} |
|
95 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
96 \pic[fill=white] at (5.0,1.0) {king={1}}; |
|
97 \pic[fill=red] at (4.0,8.0) {king={2}}; |
|
98 % numbers |
|
99 \foreach\x in {1,...,8} |
|
100 {\draw (\x - 0.5, -0.4) node {\x}; |
|
101 } |
|
102 \foreach\y in {1,...,8} |
|
103 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
104 } |
|
105 \end{tikzpicture} |
|
106 \end{tabular} |
|
107 \end{center} |
|
108 |
|
109 |
|
110 \noindent |
|
111 In what follows we shall use board illustrations as shown on the right. As |
|
112 can be seen there are two colours in Shogun for the pieces, red and white. Each |
|
113 player has 8 pieces, one of which is a king (the piece with the crown) |
|
114 and seven are pawns. At the beginning the pieces are lined up as shown |
|
115 above. What sets Shogun apart from chess and checkers is that each |
|
116 piece has, what I call, a kind of \textit{energy}---which for pawns is |
|
117 a number between 1 and 4, and for kings between 1 and 2. The energy |
|
118 determines how far a piece has to move. In the physical version of |
|
119 Shogun, the pieces and the board have magnets that can change the |
|
120 energy of a piece from move to move---so a piece on one field can have |
|
121 energy 2 and on a different field the same piece might have energy |
|
122 3. There are some further constraints on legal moves, which are |
|
123 explained below. The point of the resit is to implement functions |
|
124 about moving pieces on the Shogun board.\medskip\medskip |
|
125 |
|
126 %and testing for when a |
|
127 %checkmate occurs---i.e.~the king is attacked and cannot move |
|
128 %anymore to an ``unattacked'' field (to simplify matters for |
|
129 %the resit we leave out the case where the checkmate can be averted by capturing |
|
130 %the attacking piece).\medskip |
|
131 |
|
132 \noindent |
|
133 Like in chess, in Shogun the players take turns of moving and |
|
134 possibly capturing opposing pieces. |
|
135 There are the following rules on how pieces can move: |
|
136 |
|
137 \begin{itemize} |
|
138 \item The energy of a piece determines how far, that is how many |
|
139 fields, a piece has to move (remember pawns have an energy between 1 -- |
|
140 4, kings have an energy of only 1 -- 2). The energy of a piece might |
|
141 change when the piece moves to new field. |
|
142 \item Pieces can move in straight lines (up, down, left, right), or in |
|
143 L-shape moves, meaning a move can make a single |
|
144 90$^{\circ}$-turn. S-shape moves with more than one turn are not |
|
145 allowed. Also in a single move a piece cannot go forward and then |
|
146 go backward---for example with energy 3 you cannot move 2 fields up and |
|
147 then 1 field down. A piece can never move diagonally. |
|
148 \item A piece cannot jump over another piece and cannot stack up on top of your own pieces. |
|
149 But you can capture an opponent's piece if you move to an occupied field. A captured |
|
150 piece is removed from the board. |
|
151 \end{itemize} |
|
152 |
|
153 \noindent |
|
154 Like in chess, checkmate is determined when the king of a player cannot |
|
155 move anymore to a field that is not attacked, or a player cannot |
|
156 capture or block the attacking piece, or the king is the only |
|
157 piece left for a player. A non-trivial board that is checkmate is the following: |
|
158 |
|
159 \begin{center} |
|
160 \begin{tikzpicture}[scale=0.5,every node/.style={scale=0.5}] |
|
161 % chessboard |
|
162 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
163 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
164 { |
|
165 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
166 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
167 } |
|
168 % redpieces |
|
169 \pic[fill=red] at (4,2) {king={2}}; |
|
170 \pic[fill=red] at (6,1) {piece={3}}; |
|
171 \pic[fill=red] at (4,4) {piece={4}}; |
|
172 \pic[fill=red] at (5,3) {piece={4}}; |
|
173 % white pieces |
|
174 \pic[fill=white] at (7,1) {king={2}}; |
|
175 \pic[fill=white] at (8,5) {piece={2}}; |
|
176 \pic[fill=white] at (4,1) {piece={2}}; |
|
177 % numbers |
|
178 \foreach\x in {1,...,8} |
|
179 {\draw (\x - 0.5, -0.4) node {\x}; |
|
180 } |
|
181 \foreach\y in {1,...,8} |
|
182 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
183 } |
|
184 \end{tikzpicture} |
|
185 \end{center} |
|
186 |
|
187 \noindent |
|
188 The reason for the checkmate is that the white king on field (7, 1) is |
|
189 attacked by the red pawn on \mbox{(5, 3)}. There is nowhere for the |
|
190 white king to go, and no white pawn can be moved into the way of this |
|
191 red pawn and white can also not capture it. When determining a possible |
|
192 move, you need to be careful with pieces that might be in the |
|
193 way. Consider the following position: |
|
194 |
|
195 \begin{equation}\label{moves} |
|
196 \begin{tikzpicture}[scale=0.5,every node/.style={scale=0.5}] |
|
197 % chessboard |
|
198 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
199 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
200 { |
|
201 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
202 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
203 } |
|
204 % redpieces |
|
205 \fill[blue!50] (0,2) rectangle ++ (1,1); |
|
206 \fill[blue!50] (1,1) rectangle ++ (1,1); |
|
207 \fill[blue!50] (0,4) rectangle ++ (1,1); |
|
208 \fill[blue!50] (1,5) rectangle ++ (1,1); |
|
209 \fill[blue!50] (2,6) rectangle ++ (1,1); |
|
210 %%\fill[blue!50] (3,7) rectangle ++ (1,1); |
|
211 \fill[blue!50] (4,6) rectangle ++ (1,1); |
|
212 \fill[blue!50] (5,5) rectangle ++ (1,1); |
|
213 \fill[blue!50] (6,4) rectangle ++ (1,1); |
|
214 \fill[blue!50] (6,2) rectangle ++ (1,1); |
|
215 \fill[blue!50] (7,3) rectangle ++ (1,1); |
|
216 \fill[blue!50] (4,0) rectangle ++ (1,1); |
|
217 \fill[blue!50] (2,0) rectangle ++ (1,1); |
|
218 \pic[fill=red] at (4,4) {piece={4}}; |
|
219 \pic[fill=red] at (4,8) {piece={4}}; |
|
220 \pic[fill=white] at (2,5) {piece={3}}; |
|
221 \pic[fill=white] at (4,3) {piece={2}}; |
|
222 \pic[fill=white] at (6,3) {piece={1}}; |
|
223 \pic[fill=white] at (8,4) {piece={1}}; |
|
224 % numbers |
|
225 \foreach\x in {1,...,8} |
|
226 {\draw (\x - 0.5, -0.4) node {\x}; |
|
227 } |
|
228 \foreach\y in {1,...,8} |
|
229 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
230 } |
|
231 \end{tikzpicture} |
|
232 \end{equation} |
|
233 |
|
234 \noindent |
|
235 The red piece in the centre on field (4, 4) can move to all the blue fields. |
|
236 In particular it can move to (2, 6), because it can move 2 fields up |
|
237 and 2 fields to the left---it cannot reach this field by moving two |
|
238 fields to the left and then two up, because jumping over the white |
|
239 piece at (2, 5) is not allowed. Similarly, the field at (6, 2) is |
|
240 unreachable for the red piece because of the two white pieces at (4, |
|
241 3) and (6, 3) are in the way and no S-shape move is allowed in |
|
242 Shogun. The red piece on (4, 4) cannot move to the field (4, 8) at the |
|
243 top, because a red piece is already there; but it can move to (8, 4) |
|
244 and capture the white piece there. The moral is we always have to |
|
245 explore all possible ways in order to determine whether a piece can be |
|
246 moved to a field or not: in general there might be several ways and some of |
|
247 them might be blocked. |
|
248 |
|
249 |
|
250 \subsection*{Hints} |
|
251 |
|
252 Useful functions about pieces and boards are defined at the beginning |
|
253 of the template file. The function \texttt{.map} applies a function to |
|
254 each element of a list or set; \texttt{.flatMap} works like |
|
255 \texttt{map} followed by a \texttt{.flatten}---this is useful if a |
|
256 function returns a set of sets, which need to be ``unioned up''. Sets |
|
257 can be partitioned according to a predicate with the function |
|
258 \texttt{.partition}. For example |
|
259 |
|
260 \begin{lstlisting} |
|
261 val (even, odd) = Set(1,2,3,4,5).partition(_ % 2 == 0) |
|
262 // --> even = Set(2,4) |
|
263 // odd = Set(1,3,5) |
|
264 \end{lstlisting} |
|
265 |
|
266 \noindent |
|
267 The function \texttt{.toList} transforms a set into a list. The function |
|
268 \texttt{.count} counts elements according to a predicate. For example |
|
269 |
|
270 \begin{lstlisting} |
|
271 Set(1,2,3,4,5).count(_ % 2 == 0) |
|
272 // --> 2 |
|
273 \end{lstlisting} |
|
274 |
|
275 %% \newpage |
|
276 |
|
277 \subsection*{Tasks} |
|
278 |
|
279 You are asked to implement how pieces can move on a Shogun board. Let |
|
280 us first fix the basic datastructures for the implementation. A |
|
281 \emph{position} (or field) is a pair of integers, like $(3, 2)$. The |
|
282 board's dimension is always 8 $\times$ 8. A \emph{colour} is either |
|
283 red (\texttt{Red}) or white (\texttt{Wht}). A \emph{piece} is either |
|
284 a pawn or a king, and has a position, a colour and an energy (an |
|
285 integer). In the template file there are functions \texttt{incx}, |
|
286 \texttt{decx}, \texttt{incy} and \texttt{decy} for incrementing and |
|
287 decrementing the x- and y-coordinates of positions of pieces. |
|
288 |
|
289 A \emph{board} consists of a set of pieces. We always assume that we |
|
290 start with a consistent board and every move only generates another |
|
291 consistent board. In this way we do not need to check, for example, |
|
292 whether pieces are stacked on top of each other or located outside the |
|
293 board, or have an energy outside the permitted range. There are |
|
294 functions \texttt{-} and \texttt{+} for removing, respectively adding, |
|
295 single pieces to a board. The function \texttt{occupied} takes a |
|
296 position and a board as arguments, and returns an \texttt{Option} of a |
|
297 piece when this position is occupied, otherwise \texttt{None}. The |
|
298 function \texttt{occupied\_by} returns the colour of a potential piece |
|
299 on that position. The function \texttt{is\_occupied} returns a boolean |
|
300 for whether a position is occupied or not; \texttt{print\_board} is a |
|
301 rough function that prints out a board on the console. This function |
|
302 is meant for testing purposes. |
|
303 |
|
304 |
|
305 |
|
306 \begin{itemize} |
|
307 \item[(1)] You need to calculate all possible moves for a piece on a Shogun board. In order to |
|
308 make sure no piece moves forwards and backwards at the same time, |
|
309 and also exclude all S-shape moves, the data-structure \texttt{Move} |
|
310 is introduced. A \texttt{Move} encodes all simple moves (up, down, left, |
|
311 right) and L-shape moves (first right, then up and so on). This is defined |
|
312 as follows: |
|
313 |
|
314 {\small\begin{lstlisting} |
|
315 abstract class Move |
|
316 case object U extends Move // up |
|
317 case object D extends Move // down |
|
318 case object R extends Move // right |
|
319 case object L extends Move // left |
|
320 case object RU extends Move // ... |
|
321 case object LU extends Move |
|
322 case object RD extends Move |
|
323 case object LD extends Move |
|
324 case object UR extends Move |
|
325 case object UL extends Move |
|
326 case object DR extends Move |
|
327 case object DL extends Move |
|
328 \end{lstlisting}} |
|
329 |
|
330 You need to implement an \texttt{eval} function that takes a piece |
|
331 \texttt{pc}, a move \texttt{m}, an energy \texttt{en} and a board |
|
332 \texttt{b} as arguments. The idea is to recursively calculate all |
|
333 fields that can be reached by the move \texttt{m} (there might be more than |
|
334 one). The energy acts as a counter and decreases in each recursive |
|
335 call until 0 is reached (the final field). The function \texttt{eval} for a piece \texttt{pc} |
|
336 should behave as follows: |
|
337 |
|
338 \begin{itemize} |
|
339 \item If the position of a piece is outside the board, then no field can be reached (represented by |
|
340 the empty set \texttt{Set()}). |
|
341 \item If the energy is 0 and the position of the piece is \textit{not} occupied, then the field can be reached |
|
342 and the set \texttt{Set(pc)} is returned whereby \texttt{pc} is the piece given as argument. |
|
343 \item If the energy is 0 and the position of the piece \textit{is} occupied, but occupied by a piece |
|
344 of the opposite colour, then also the set \texttt{Set(pc)} is returned. Otherwise the empty set |
|
345 \texttt{Set()} is returned. |
|
346 \item In case the energy is > 0 and the position of the piece |
|
347 \texttt{pc} is occupied, then this move is blocked and the set |
|
348 \texttt{Set()} is returned. |
|
349 \item In all other cases we have to analyse the move |
|
350 \texttt{m}. First, the simple moves (that is \texttt{U}, \texttt{D}, |
|
351 \texttt{L} and \texttt{R}) we only have to increment / decrement the |
|
352 x- or y-position of the piece, decrease the energy and call eval |
|
353 recursively with the updated arguments. For example for \texttt{U} (up) |
|
354 you need to increase the y-coordinate: |
|
355 |
|
356 \begin{center} |
|
357 \texttt{U} $\quad\Rightarrow\quad$ new arguments: \texttt{incy(pc)}, \texttt{U}, energy - 1, same board |
|
358 \end{center} |
|
359 |
|
360 The move \texttt{U} here acts like a ``mode'', meaning if you move |
|
361 up, you can only move up; the mode never changes for simple moves. Similarly for the other simple moves: if |
|
362 you move right, you can only move right and so on. In this way it is |
|
363 prevented to go first to the right, and then change direction in order to go |
|
364 left (same with up and down). |
|
365 |
|
366 For the L-shape moves (\texttt{RU}, \texttt{LU}, \texttt{RD} and so on) you need to calculate two |
|
367 sets of reachable fields. Say we analyse \texttt{RU}, then we first have to calculate all fields |
|
368 reachable by moving to the right; then we have to calculate all moves by changing the mode to \texttt{U}. |
|
369 That means there are two recursive calls to \texttt{eval}: |
|
370 |
|
371 \begin{center} |
|
372 \begin{tabular}{@{}lll@{}} |
|
373 \texttt{RU} & $\Rightarrow$ & new args for call 1: \texttt{incx(pc)}, \texttt{RU}, energy - 1, same board\\ |
|
374 & & new args for call 2: \texttt{pc}, \texttt{U}, same energy, same board |
|
375 \end{tabular} |
|
376 \end{center} |
|
377 |
|
378 In each case we receive some new piece(s) on reachable fields and therefore we return the set |
|
379 containing all these fields. Similarly in the other cases. |
|
380 \end{itemize} |
|
381 |
|
382 For example in the left board below, \texttt{eval} is called with the white |
|
383 piece in the centre and the move \texttt{RU} generates then a set of |
|
384 new pieces corresponding to the blue fields. The difference with the |
|
385 right board is that \texttt{eval} is called with a red piece and therefore the |
|
386 field (4, 8) is not reachable anymore because it is already occupied by |
|
387 another red piece. But (7, 5) becomes reachable because it is occupied |
|
388 by a piece of the opposite colour. |
|
389 |
|
390 \begin{center} |
|
391 \begin{tabular}{cc} |
|
392 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
393 % chessboard |
|
394 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
395 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
396 { |
|
397 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
398 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
399 } |
|
400 \fill[blue!50] (5,5) rectangle ++ (1,1); |
|
401 \fill[blue!50] (3,7) rectangle ++ (1,1); |
|
402 \fill[blue!50] (4,6) rectangle ++ (1,1); |
|
403 %\fill[blue!50] (6,4) rectangle ++ (1,1); |
|
404 \fill[blue!50] (7,3) rectangle ++ (1,1); |
|
405 |
|
406 % black pieces |
|
407 \foreach\x/\y/\e in {2/1/3,3/1/2,4/1/3,6/1/3,7/1/1,7/5/2} |
|
408 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
409 % white pieces |
|
410 \foreach\x/\y/\e in {1/8/4,2/8/2,3/8/4,5/8/4,6/8/2,7/8/3,8/8/1} |
|
411 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
412 \pic[fill=white] at (5.0,1.0) {king={1}}; |
|
413 \pic[fill=red] at (4.0,8.0) {king={2}}; |
|
414 |
|
415 \pic[fill=white] at (4,4) {piece={4}}; |
|
416 % numbers |
|
417 \foreach\x in {1,...,8} |
|
418 {\draw (\x - 0.5, -0.4) node {\x}; |
|
419 } |
|
420 \foreach\y in {1,...,8} |
|
421 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
422 } |
|
423 \end{tikzpicture} |
|
424 & |
|
425 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
426 % chessboard |
|
427 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
428 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
429 { |
|
430 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
431 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
432 } |
|
433 \fill[blue!50] (5,5) rectangle ++ (1,1); |
|
434 \fill[blue!50] (4,6) rectangle ++ (1,1); |
|
435 \fill[blue!50] (6,4) rectangle ++ (1,1); |
|
436 \fill[blue!50] (7,3) rectangle ++ (1,1); |
|
437 |
|
438 |
|
439 % black pieces |
|
440 \foreach\x/\y/\e in {1/1/1,2/1/3,3/1/2,4/1/3,6/1/3,7/1/1,7/5/2} |
|
441 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
442 % white pieces |
|
443 \foreach\x/\y/\e in {1/8/4,2/8/2,3/8/4,5/8/4,6/8/2,7/8/3} |
|
444 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
445 \pic[fill=white] at (5.0,1.0) {king={1}}; |
|
446 \pic[fill=red] at (4.0,8.0) {king={2}}; |
|
447 |
|
448 \pic[fill=red] at (4,4) {piece={4}}; |
|
449 % numbers |
|
450 \foreach\x in {1,...,8} |
|
451 {\draw (\x - 0.5, -0.4) node {\x}; |
|
452 } |
|
453 \foreach\y in {1,...,8} |
|
454 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
455 } |
|
456 \end{tikzpicture} |
|
457 \\[-5mm] |
|
458 \end{tabular} |
|
459 \end{center}\hfill[3 Marks] |
|
460 |
|
461 \item[(2)] Implement an \texttt{all\_moves} function that calculates for a |
|
462 piece and a board, \textit{all} possible onward positions. For this |
|
463 you have to call \texttt{eval} for all possible moves \texttt{m} (that is \texttt{U}, |
|
464 \texttt{D}, \ldots, \texttt{DL}). An example for all moves for the red piece on (4, 4) is |
|
465 shown in \eqref{moves} on page \pageref{moves}. Be careful about possible modifications |
|
466 you need to apply to the board before you call the \texttt{eval} function. |
|
467 Also for this task, ignore the fact that a king cannot move onto an attacked field.\\ |
|
468 \mbox{}\hfill[1 Mark] |
|
469 |
|
470 \item[(3)] Implement a function \texttt{attacked} that takes a colour and a board |
|
471 and calculates all pieces of the opposite side that are attacked. For example |
|
472 below in the left board are all the attacked pieces by red, and on the right all for white: |
|
473 |
|
474 |
|
475 \begin{center} |
|
476 \begin{tabular}{cc} |
|
477 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
478 % chessboard |
|
479 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
480 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
481 { |
|
482 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
483 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
484 } |
|
485 \fill[blue!50] (7,3) rectangle ++ (1,1); |
|
486 \fill[blue!50] (6,0) rectangle ++ (1,1); |
|
487 |
|
488 |
|
489 % red pieces |
|
490 \foreach\x/\y/\e in {6/1/3,4/4/4,5/3/4,6/5/3} |
|
491 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
492 % white pieces |
|
493 \foreach\x/\y/\e in {8/4/1,4/1/2,8/7/3,6/7/2} |
|
494 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
495 |
|
496 \pic[fill=red] at (4,2) {king={2}}; |
|
497 \pic[fill=white] at (7,1) {king={2}}; |
|
498 |
|
499 % numbers |
|
500 \foreach\x in {1,...,8} |
|
501 {\draw (\x - 0.5, -0.4) node {\x}; |
|
502 } |
|
503 \foreach\y in {1,...,8} |
|
504 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
505 } |
|
506 \end{tikzpicture} |
|
507 & |
|
508 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
509 % chessboard |
|
510 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
511 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
512 { |
|
513 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
514 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
515 } |
|
516 \fill[blue!50] (5,0) rectangle ++ (1,1); |
|
517 \fill[blue!50] (5,4) rectangle ++ (1,1); |
|
518 |
|
519 % red pieces |
|
520 \foreach\x/\y/\e in {6/1/3,4/4/4,5/3/4,6/5/3} |
|
521 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
522 % white pieces |
|
523 \foreach\x/\y/\e in {8/4/1,4/1/2,8/7/3,6/7/2} |
|
524 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
525 |
|
526 \pic[fill=red] at (4,2) {king={2}}; |
|
527 \pic[fill=white] at (7,1) {king={2}}; |
|
528 |
|
529 % numbers |
|
530 \foreach\x in {1,...,8} |
|
531 {\draw (\x - 0.5, -0.4) node {\x}; |
|
532 } |
|
533 \foreach\y in {1,...,8} |
|
534 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
535 } |
|
536 \end{tikzpicture} |
|
537 \\[-5mm] |
|
538 \end{tabular} |
|
539 \end{center}\mbox{}\hfill[1 Mark] |
|
540 |
|
541 \item[(4)] Implement a function \texttt{attackedN} that takes a piece and a board |
|
542 and calculates the number of times this pieces is attacked by pieces of the opposite colour. |
|
543 For example the piece on field (8, 4) above is attacked by 3 red pieces, and |
|
544 the piece on (6, 1) by 1 white piece. In this number also include kings even |
|
545 if they cannot move to this field because the would be in ``check''. |
|
546 \mbox{}\hfill[1 Mark] |
|
547 |
|
548 \item[(5)] Implement a function \texttt{protectedN} that takes a piece and a board |
|
549 and calculates the number of times this pieces is protected by pieces of the same colour. |
|
550 For example the piece on field (8, 4) above is protected by 1 white pieces (the one on (8, 7)), |
|
551 and the piece on (5, 3) is protected by three red pieces ((6, 1), (4, 2), and (6, 5)). |
|
552 Similarly to \texttt{attackedN}, include in the calculated number here also the king provided it |
|
553 can reach the given piece. |
|
554 \\ |
|
555 \mbox{}\hfill[1 Mark] |
|
556 |
|
557 \item[(6)] Implement a function \texttt{legal\_moves} that behaves like \texttt{all\_moves} from (2) for |
|
558 pawns, but for kings, in addition, makes sure that they do not move to an attacked field. |
|
559 For example in the board below on the left, there are three possible fields the white king can |
|
560 reach, but all of them are attacked by red pieces. In the board on the right where the |
|
561 white king has an energy of 1, there is only one legal move, namely to move to field (8, 1). |
|
562 The field (7, 2) is reachable, but is attacked; similarly capturing the red piece on field (6, 1) is |
|
563 not possible because it is protected by at least another red piece. |
|
564 % |
|
565 \begin{center} |
|
566 \begin{tabular}{cc} |
|
567 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
568 % chessboard |
|
569 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
570 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
571 { |
|
572 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
573 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
574 } |
|
575 \fill[blue!50] (5,1) rectangle ++ (1,1); |
|
576 \fill[blue!50] (6,2) rectangle ++ (1,1); |
|
577 \fill[blue!50] (7,1) rectangle ++ (1,1); |
|
578 |
|
579 |
|
580 % red pieces |
|
581 \foreach\x/\y/\e in {6/1/3,4/4/4,5/3/4,6/5/3} |
|
582 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
583 % white pieces |
|
584 \foreach\x/\y/\e in {8/4/1,4/1/2,8/7/3,6/7/2} |
|
585 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
586 |
|
587 \pic[fill=red] at (4,2) {king={2}}; |
|
588 \pic[fill=white] at (7,1) {king={2}}; |
|
589 |
|
590 % numbers |
|
591 \foreach\x in {1,...,8} |
|
592 {\draw (\x - 0.5, -0.4) node {\x}; |
|
593 } |
|
594 \foreach\y in {1,...,8} |
|
595 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
596 } |
|
597 \end{tikzpicture} & |
|
598 \begin{tikzpicture}[scale=0.45,every node/.style={scale=0.45}] |
|
599 % chessboard |
|
600 \draw[very thick,gray] (0,0) rectangle (8,8); |
|
601 \foreach\x in {0,...,7}\foreach\y in {7,...,0} |
|
602 { |
|
603 \pgfmathsetmacro\blend{Mod(\x+\y,2)==0?75:25} |
|
604 \fill[gray!\blend] (\x,\y) rectangle ++ (1,1); |
|
605 } |
|
606 \fill[blue!50] (5,0) rectangle ++ (1,1); |
|
607 \fill[blue!50] (6,1) rectangle ++ (1,1); |
|
608 \fill[blue!50] (7,0) rectangle ++ (1,1); |
|
609 |
|
610 |
|
611 % red pieces |
|
612 \foreach\x/\y/\e in {6/1/3,4/4/4,5/3/3,6/5/3} |
|
613 \pic[fill=red] at (\x,\y) {piece={\e}}; |
|
614 % white pieces |
|
615 \foreach\x/\y/\e in {8/4/1,4/1/2,8/7/3,6/7/2} |
|
616 \pic[fill=white] at (\x,\y) {piece={\e}}; |
|
617 |
|
618 \pic[fill=red] at (4,2) {king={2}}; |
|
619 \pic[fill=white] at (7,1) {king={1}}; |
|
620 |
|
621 % numbers |
|
622 \foreach\x in {1,...,8} |
|
623 {\draw (\x - 0.5, -0.4) node {\x}; |
|
624 } |
|
625 \foreach\y in {1,...,8} |
|
626 {\draw (-0.4, \y - 0.6, -0.4) node {\y}; |
|
627 } |
|
628 \end{tikzpicture} |
|
629 \end{tabular} |
|
630 \end{center} |
|
631 \mbox{}\hfill[1 Mark] |
|
632 |
|
633 \end{itemize} |
|
634 |
|
635 \end{document} |
|
636 |
|
637 %%% Local Variables: |
|
638 %%% mode: latex |
|
639 %%% TeX-master: t |
|
640 %%% End: |