Initial commit
[trapthecap.git] / doc / classes / Game.src / M000022.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6 <html>
7 <head>
8 <title>apply_move (Game)</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11 </head>
12 <body class="standalone-code">
13 <pre><span class="ruby-comment cmt"># File lib/libttc.rb, line 341</span>
14 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">apply_move</span>(<span class="ruby-identifier">move</span>, <span class="ruby-identifier">player</span> = <span class="ruby-ivar">@current_player</span>)
15 <span class="ruby-comment cmt"># Check the move is a valid one</span>
16 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">InvalidMoveError</span>, <span class="ruby-node">&quot;Piece #{move.piece} does not exist&quot;</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@pieces</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">name</span>)
17 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">InvalidMoveError</span>, <span class="ruby-node">&quot;Player #{player} moving piece #{move.piece}&quot;</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">colour</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">player</span>
18 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">InvalidMoveError</span>, <span class="ruby-node">&quot;Attempting to move captured piece #{move.piece}&quot;</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">captured</span>
19 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">InvalidMoveError</span>, <span class="ruby-node">&quot;Attempting to move #{move.piece} onto or via base without captured pieces&quot;</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">via_base?</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">contains</span>.<span class="ruby-identifier">empty?</span>
20 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>.<span class="ruby-identifier">safe?</span>
21 <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@pieces</span>.<span class="ruby-identifier">find_all</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>, <span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>.<span class="ruby-identifier">position</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>}).<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">3</span>
22 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">InvalidMoveError</span>, <span class="ruby-node">&quot;Attempting to move #{move.piece} onto safe position #{move.destination} when there are already three or more pieces there&quot;</span>)
23 <span class="ruby-keyword kw">end</span>
24 <span class="ruby-keyword kw">end</span>
25 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">via_base?</span>
26 <span class="ruby-identifier">moved_distance</span> = <span class="ruby-identifier">board</span>.<span class="ruby-identifier">distance_between</span>[<span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">position</span>.<span class="ruby-identifier">place</span>][<span class="ruby-identifier">player</span>] <span class="ruby-operator">+</span>
27 <span class="ruby-identifier">board</span>.<span class="ruby-identifier">distance_between</span>[<span class="ruby-identifier">player</span>][<span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>.<span class="ruby-identifier">place</span>]
28 <span class="ruby-keyword kw">else</span>
29 <span class="ruby-identifier">moved_distance</span> = <span class="ruby-identifier">board</span>.<span class="ruby-identifier">distance_between</span>[<span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">position</span>.<span class="ruby-identifier">place</span>][<span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>.<span class="ruby-identifier">place</span>]
30 <span class="ruby-keyword kw">end</span>
31 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">InvalidMoveError</span>, <span class="ruby-node">&quot;Attempting to move piece #{move.piece} #{moved_distance} places&quot;</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">moved_distance</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">moved_distance</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">6</span>
32
33 <span class="ruby-comment cmt"># Apply this move</span>
34 <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">move_to</span>(<span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>)
35
36 <span class="ruby-comment cmt"># Capture anything already there (unless it's a safe place or a base, or our own colour)</span>
37 <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>.<span class="ruby-identifier">safe?</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span>.<span class="ruby-identifier">base?</span>
38 <span class="ruby-ivar">@pieces</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">name</span>, <span class="ruby-identifier">target_piece</span><span class="ruby-operator">|</span>
39 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">target_piece</span>.<span class="ruby-identifier">position</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">destination</span> <span class="ruby-keyword kw">and</span>
40 <span class="ruby-identifier">target_piece</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span> <span class="ruby-keyword kw">and</span>
41 <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">contains</span>.<span class="ruby-identifier">member?</span>(<span class="ruby-identifier">target_piece</span>) <span class="ruby-keyword kw">and</span>
42 <span class="ruby-identifier">target_piece</span>.<span class="ruby-identifier">colour</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">player</span>
43 <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">capture</span>(<span class="ruby-identifier">target_piece</span>)
44 <span class="ruby-keyword kw">end</span>
45 <span class="ruby-keyword kw">end</span>
46 <span class="ruby-keyword kw">end</span>
47
48 <span class="ruby-comment cmt"># If the move was via our base, drop all captured pieces</span>
49 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">via_base?</span>
50 <span class="ruby-identifier">capturers_base</span> = <span class="ruby-identifier">board</span>.<span class="ruby-identifier">positions</span>[<span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">colour</span>]
51 <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">contains</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">captured_piece</span><span class="ruby-operator">|</span>
52 <span class="ruby-identifier">captured_piece</span>.<span class="ruby-identifier">move_to</span> <span class="ruby-identifier">capturers_base</span>
53 <span class="ruby-identifier">captured_piece</span>.<span class="ruby-identifier">captured</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">captured_piece</span>.<span class="ruby-identifier">colour</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">colour</span>
54 <span class="ruby-keyword kw">end</span>
55 <span class="ruby-identifier">move</span>.<span class="ruby-identifier">piece</span>.<span class="ruby-identifier">contains</span> = []
56 <span class="ruby-keyword kw">end</span>
57
58 <span class="ruby-comment cmt"># Record the new stae</span>
59 <span class="ruby-identifier">this_game_state</span> = <span class="ruby-constant">GameState</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">move</span>, <span class="ruby-identifier">player</span>, <span class="ruby-ivar">@pieces</span>)
60 <span class="ruby-ivar">@history</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">this_game_state</span>
61
62 <span class="ruby-comment cmt"># If there's only one player with uncaptured pieces, declare a win</span>
63 <span class="ruby-identifier">potential_players</span> = []
64 <span class="ruby-ivar">@players</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span>
65 <span class="ruby-identifier">potential_players</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">p</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@pieces</span>.<span class="ruby-identifier">values</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>.<span class="ruby-identifier">colour</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@current_player</span>}).<span class="ruby-identifier">any?</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">p</span>.<span class="ruby-identifier">captured</span>}
66 <span class="ruby-keyword kw">end</span>
67 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">potential_players</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">1</span>
68 <span class="ruby-identifier">raise</span>(<span class="ruby-constant">GameWonNotice</span>, <span class="ruby-node">&quot;Game won by #{potential_players[0]}&quot;</span>)
69 <span class="ruby-keyword kw">end</span>
70 <span class="ruby-keyword kw">end</span></pre>
71 </body>
72 </html>