Source code: org/dma/ihm/game/match/Match.java
1 package org.dma.ihm.game.match;
2
3 import java.io.*;
4
5 import java.util.*;
6 import org.dma.ihm.controller.data.*;
7 import org.dma.ihm.game.league.*;
8 import org.dma.ihm.game.league.helper.*;
9 import org.dma.ihm.game.league.std.*;
10 import org.dma.ihm.game.player.*;
11
12 import org.dma.ihm.game.team.*;
13
14 /**
15 * Match class that plays a good game of ice hockey. Contains: - Results - Play
16 * method called by event or controller <p>
17 *
18 * -- UNDER CONSTRUCTION --
19 *
20 * @author Bernhard von Gunten & Arik Dasen
21 * @created December 29, 2001
22 */
23 public class Match implements Serializable {
24 private Team teamHome;
25 private Team teamAway;
26 private ScoreSheet scoreSheet = null;
27
28 private LeagueElement leagueElement;
29 private boolean played = false;
30
31 private Rules rules = null;
32
33 private static Random r = new Random();
34
35 private boolean overtimePlayed = false;
36
37
38 /**
39 * Constructor for the Match object
40 *
41 * @param leagueElement LeagueElement of this match
42 * @param teamHome Home team of this match
43 * @param teamAway Away team of this match
44 * @param rules Rules of this match
45 */
46 public Match(LeagueElement leagueElement, Team teamHome, Team teamAway, Rules rules) {
47 this.leagueElement = leagueElement;
48 this.teamHome = teamHome;
49 this.teamAway = teamAway;
50 this.rules = rules;
51 this.scoreSheet = new ScoreSheet(this);
52 }
53
54
55 /**
56 * Returns boolean if user passed by is involved in this match
57 *
58 * @param user User looking for
59 * @return The userInvolved value
60 */
61 public boolean isUserInvolved(User user) {
62 if (teamHome.equals(user.getTeam())) {
63 return true;
64 } else if (teamAway.equals(user.getTeam())) {
65 return true;
66 }
67 return false;
68 }
69
70
71 /**
72 * Returns if teamHome is winner of this match.
73 *
74 * @return Boolean if teamHome is winner
75 */
76 public boolean _isTeamHomeWinner() {
77 return scoreSheet.isHomeTeamWinner();
78 }
79
80
81 /**
82 * Gets the teamWinner attribute of the Match object
83 *
84 * @param team Team to look if it's the winner of this match.
85 * @return The teamWinner value
86 */
87 public boolean isTeamWinner(Team team) {
88 Team winner = null;
89 if (_isTeamHomeWinner()) {
90 winner = teamHome;
91 } else {
92 winner = teamAway;
93 }
94 if (team.equals(winner)) {
95 return true;
96 } else {
97 return false;
98 }
99 }
100
101
102 /**
103 * Gets the gameTied attribute of the Match object
104 *
105 * @return The gameTied value
106 */
107 public boolean isGameTied() {
108 return scoreSheet.isGameTied();
109 }
110
111
112 /**
113 * Gets the leagueElement attribute of the Match object
114 *
115 * @return The leagueElement value
116 */
117 public LeagueElement getLeagueElement() {
118 return leagueElement;
119 }
120
121 public Team getTeamForPlayer( Player oPlayer )
122 {
123 if( this.teamAway.isPlayerInTeam( oPlayer ) )
124 {
125 return this.teamAway;
126 }
127 else
128 {
129 return this.teamHome;
130 }
131 }
132
133 /**
134 * Gets the teamHome attribute of the Match object
135 *
136 * @return The teamHome value
137 */
138 public Team getTeamHome() {
139 return teamHome;
140 }
141
142
143 /**
144 * Gets the teamAway attribute of the Match object
145 *
146 * @return The teamAway value
147 */
148 public Team getTeamAway() {
149 return teamAway;
150 }
151
152
153 /**
154 * Gets the scoreSheet attribute of the Match object
155 *
156 * @return The scoreSheet value
157 */
158 public ScoreSheet getScoreSheet() {
159 return scoreSheet;
160 }
161
162
163 /**
164 * Who gets how many points ...
165 *
166 * @param team Description of the Parameter
167 * @return The points value
168 */
169 public int getPoints(Team team) {
170 if (isGameTied()) {
171 return rules.pointsForTied();
172 } else {
173 if (overtimePlayed) {
174 if (this.isTeamWinner(team)) {
175 return rules.pointsForOvertimeWin();
176 } else {
177 return rules.pointsForOvertimeLoss();
178 }
179 } else {
180 if (this.isTeamWinner(team)) {
181 return rules.pointsForWin();
182 } else {
183 return rules.pointsForLoss();
184 }
185 }
186 }
187 }
188
189
190 /** The kick azz play method */
191 public void play() {
192
193 // --------------- VERY UNDER CONSTRUCTION -------------
194 // Now we play according to rules!
195
196 // play regular game
197 int period = 0;
198 for (period = 1; period <= rules.numberOfPeriods(); period++) {
199 // play period
200 for (int minute = 1; minute <= rules.minutesPerPeriod(); minute++) {
201 playMinute(period, minute, false);
202 }
203 }
204 // play overtime
205 if (rules.playOvertime() && scoreSheet.isGameTied()) {
206 overtimePlayed = true;
207 do {
208 // play period
209 period++;
210 for (int minute = 1; minute <= rules.minutesPerOvertime(); minute++) {
211 playMinute(period, minute, rules.suddenDeath());
212 }
213 } while (rules.contignousOvertime() && scoreSheet.isGameTied());
214 }
215 // play shootout
216 if (rules.playShootout() && scoreSheet.isGameTied()) {
217 // werfe eine Muenze ;-)))
218 while (scoreSheet.isGameTied()) {
219 playMinute(0, 0, true);
220 }
221 }
222
223 // -------------------- END KICK AZZ GAME --------------
224
225 scoreSheet.finish();
226 this.played = true;
227 }
228
229
230 /**
231 * Play a minute (EXTREM UNDER CONSTRUCTION)
232 *
233 * @param period Match periode
234 * @param minute Minute to play
235 * @param suddenDeath SuddenDeath boolean
236 */
237 private void playMinute(int period, int minute, boolean suddenDeath) {
238
239 // Some crazy A.I. ;))))
240 // Sorry Rik ... musste ich doch einfach tun ;-))))
241
242 if (r.nextInt(10) == 5) {
243
244 // goal
245 Goal goal = null;
246
247 double homeAdv = (teamHome.getTeamAttributes().getOverall() - teamAway.getTeamAttributes().getOverall());
248 // + 5 For homeTeam
249 homeAdv += 5;
250
251 if (r.nextInt(100) <= 50 + homeAdv) {
252 // hometeam
253 Player[] homePlayers = teamHome.getPlayers();
254 Player player = (Player) homePlayers[r.nextInt(20)];
255 Player assist1 = (Player) homePlayers[r.nextInt(20)];
256 Player assist2 = (Player) homePlayers[r.nextInt(20)];
257 goal = new Goal(String.valueOf(((period - 1) * 20) + minute), teamHome, teamAway, player, assist1, assist2);
258 } else {
259 // awayteam
260 Player[] awayPlayers = teamAway.getPlayers();
261 Player player = (Player) awayPlayers[r.nextInt(20)];
262 Player assist1 = (Player) awayPlayers[r.nextInt(20)];
263 Player assist2 = (Player) awayPlayers[r.nextInt(20)];
264 goal = new Goal(String.valueOf(((period - 1) * 20) + minute), teamAway, teamHome, player, assist1, assist2);
265 }
266 scoreSheet.addGoal(goal);
267 }
268
269 if (r.nextInt(10) == 5) {
270
271 // goal
272 Penalty penalty = null;
273
274 if (r.nextBoolean()) {
275 // hometeam
276 Player[] homePlayers = teamHome.getPlayers();
277 Player player = (Player) homePlayers[r.nextInt(20)];
278 penalty = new Penalty (String.valueOf(((period - 1) * 20) + minute), teamHome, player, 2);
279 } else {
280 // awayteam
281 Player[] awayPlayers = teamAway.getPlayers();
282 Player player = (Player) awayPlayers[r.nextInt(20)];
283 penalty = new Penalty (String.valueOf(((period - 1) * 20) + minute), teamAway, player, 2);
284 }
285 scoreSheet.addPenalty(penalty);
286 }
287
288
289
290
291 }
292
293
294 /**
295 * Gets the played attribute of the Match object
296 *
297 * @return The played value
298 */
299 public boolean isPlayed() {
300 return played;
301 }
302
303
304 /**
305 * Gets the description attribute of the Match object
306 *
307 * @return The description value
308 */
309 public String getDescription() {
310 if (this.isPlayed()) {
311 return teamHome.getTeamInfo().getTeamName() + " vs. " + teamAway.getTeamInfo().getTeamName() + " Result : " + scoreSheet.getGoalsHome() + ":" + scoreSheet.getGoalsAway();
312 } else {
313 return teamHome.getTeamInfo().getTeamName() + " vs. " + teamAway.getTeamInfo().getTeamName();
314 }
315 }
316
317 }