 # Assignment_7 04 GAME.e

Nov 19th, 2014
1,186
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. class
2.     GAME
3.
4. create
5.     make
6.
7. feature {NONE} -- Initialization
8.
9.     make (n: INTEGER)
10.             -- Create a game with `n' players.
11.         require
12.             n_in_bounds: Min_player_count <= n and n <= Max_player_count
13.         local
14.             i: INTEGER
15.             p: PLAYER
16.         do
17.             create die_1.roll
18.             create die_2.roll
19.             create players.make (1, n)
20.             create winners.make (1, n)
21.             from
22.                 i := 1
23.             until
24.                 i > players.count
25.             loop
26.                 create p.make ("Player" + i.out)
27.                 p.set_position (1)
28.                 p.set_balance (7)
29.                 game_over := false
30.                 players [i] := p
31.                 print (p.name + " joined the game.%N")
32.                 i := i + 1
33.             end
34.             print ("All players receive 7 CHF!%N")
35.             print ("%N")
36.         end
37.
38. feature -- Basic operations
39.
40.     play
41.             -- Start a game.
42.         local
43.             round, i: INTEGER
44.         do
45.             from
46.                 round := 1
47.                 print ("The game begins.%N")
48.                 print_board
49.             until
50.                 game_over = true
51.             loop
52.                 print ("%NRound #" + round.out + "%N%N")
53.                 from
54.                     i := 1
55.                 until
56.                     game_over = true or else i > players.count
57.                 loop
58.                     players [i].play (die_1, die_2)
59.                     if players [i].position > Square_count then
60.                         search_winner
61.                         game_over := true
62.                     end
63.                     i := i + 1
64.                 end
65.                 print_board
66.                 round := round + 1
67.             end
68.         ensure
69.             has_winner: game_over = true
70.         end
71.
72.     search_winner
73.             -- Calculates who won
74.         local
75.             c: INTEGER
76.         do
77.             create final_balances.make (1, players.count)
78.             from
79.                 c := 1
80.             until
81.                 c > players.count
82.             loop
83.                 final_balances [c] := players [c].balance
84.                 c := c + 1
85.             end
86.             set_highest_balance
87.             from
88.                 c := 1
89.             until
90.                 c > players.count
91.             loop
92.                 if
93.                     players [c].balance >= highest_balance
94.                 then
95.                     winners [c] := players [c].name
96.                 end
97.                 c := c+ 1
98.             end
99.         end
100.
101. feature -- Constants
102.
103.     Min_player_count: INTEGER = 2
104.             -- Minimum number of players.
105.
106.     Max_player_count: INTEGER = 6
107.             -- Maximum number of players.
108.
109.     Square_count: INTEGER = 40
110.             -- Number of squares.
111.
112. feature -- Access
113.
114.     players: V_ARRAY [PLAYER]
115.             -- Container for players.
116.
117.     die_1: DIE
118.             -- The first die.
119.
120.     die_2: DIE
121.             -- The second die.
122.
123.     final_balances: V_ARRAY [INTEGER]
124.             -- All end-balances
125.
126.     winners: V_ARRAY [STRING]
127.             -- All winners
128.
129.     game_over: BOOLEAN
130.             -- Game over?
131.
132.     highest_balance: INTEGER
133.             -- The highest balance
134.
135. feature -- Compute
136.
137.     set_highest_balance
138.             -- Sets the highest balance
139.         local
140.             q: INTEGER
141.             temp: INTEGER
142.         do
143.             temp := 0
144.             from
145.                 q := 1
146.             until
147.                 q > players.count
148.             loop
149.                 if
150.                     final_balances [q] > temp
151.                 then
152.                     temp := final_balances [q]
153.                 end
154.                 q := q + 1
155.             end
156.             highest_balance := temp
157.         end
158.
159. feature {NONE} -- Implementation
160.
161.     print_board
162.             -- Output players positions on the board.
163.         local
164.             i, j: INTEGER
165.             board: STRING
166.         do
167.             io.new_line
168.             board := "."
169.             board.multiply (Square_count)
170.             print (board)
171.             io.new_line
172.             from
173.                 i := 1
174.             until
175.                 i > players.count
176.             loop
177.                 from
178.                     j := 1
179.                 until
180.                     j >= players [i].position
181.                 loop
182.                     print (" ")
183.                     j := j + 1
184.                 end
185.                 print (i)
186.                 io.new_line
187.                 i := i + 1
188.             end
189.         end
190.
191. invariant
192.     dice_exist: die_1 /= Void and die_2 /= Void
193.     players_exist: players /= Void
194.     number_of_players_consistent: Min_player_count <= players.count and players.count <= Max_player_count
195. end