blob: ee5c2d356cb5898f5a635673561afa804b1ae338 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
package jrummikub.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Class that stores information for a game of multiple rounds
*/
public class GameState implements Serializable {
private static final long serialVersionUID = -5787975403310108391L;
private int firstRoundFirstPlayer;
private ArrayList<Score> scores = new ArrayList<Score>();
/**
* Gets the number of the first player of the first round
*
* @return the number of the first player of the first round
*/
public int getFirstRoundFirstPlayer() {
return firstRoundFirstPlayer;
}
/**
* Sets the number of the first player of the first round
*
* @param firstRoundFirstPlayer
* the number of the first player of the first round
*/
public void setFirstRoundFirstPlayer(int firstRoundFirstPlayer) {
this.firstRoundFirstPlayer = firstRoundFirstPlayer;
}
/**
* Returns the list of players' scores in the rounds played before
*
* @return the list of scores
*/
public List<Score> getScores() {
return scores;
}
/**
* Returns whether players have won
*
* @param points the player's points
* @param wins the number of wins per player
* @return whether a player has won
*/
private Boolean[] getWinners(Integer[] points, int[] wins) {
int playerCount = scores.get(0).getPoints().size();
int maxWins = 0, maxPoints = 0;
Boolean[] winners = new Boolean[playerCount];
for (int i = 0; i < playerCount; ++i) {
winners[i] = false;
}
for (int i = 0; i < playerCount; ++i) {
if (wins[i] > maxWins) {
maxWins = wins[i];
maxPoints = points[i];
for (int j = 0; j < i; ++j) {
winners[j] = false;
}
winners[i] = true;
} else if (wins[i] == maxWins) {
if (points[i] > maxPoints) {
maxWins = wins[i];
maxPoints = points[i];
for (int j = 0; j < i; ++j) {
winners[j] = false;
}
winners[i] = true;
} else if (points[i] == maxPoints) {
winners[i] = true;
}
}
}
return winners;
}
/**
* Calculated the accumulated score over the played rounds
*
* @return the accumulated score
*/
public Score getAccumulatedScore() {
if (scores.isEmpty()) {
return null;
}
int playerCount = scores.get(0).getPoints().size();
Integer[] points = new Integer[playerCount];
int[] wins = new int[playerCount];
for (int i = 0; i < playerCount; ++i) {
points[i] = 0;
}
for (Score roundScore : scores) {
for (int i = 0; i < playerCount; ++i) {
points[i] += roundScore.getPoints().get(i);
if (roundScore.getWinners().get(i)) {
wins[i]++;
}
}
}
Boolean[] winners = getWinners(points, wins);
return new Score(Arrays.asList(winners), Arrays.asList(points));
}
}
|