Calculate accumulated score in game state
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@297 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
89e59b2f2c
commit
eea456991c
2 changed files with 135 additions and 1 deletions
|
@ -1,13 +1,19 @@
|
|||
package jrummikub.model;
|
||||
|
||||
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 {
|
||||
private int firstRoundFirstPlayer;
|
||||
private List<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() {
|
||||
|
@ -16,9 +22,90 @@ public class GameState {
|
|||
|
||||
/**
|
||||
* Sets the number of the first player of the first round
|
||||
* @param firstRoundFirstPlayer 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;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
|
47
test/jrummikub/model/GameStateTest.java
Normal file
47
test/jrummikub/model/GameStateTest.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
package jrummikub.model;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class GameStateTest {
|
||||
GameState gameState = new GameState();
|
||||
|
||||
@Test
|
||||
public void testAccumulatedScore() {
|
||||
Score score1 = new Score(Arrays.asList(true, false, false), Arrays.asList(
|
||||
30, -20, -10));
|
||||
Score score2 = new Score(Arrays.asList(true, true, false), Arrays.asList(
|
||||
-10, -10, -50));
|
||||
Score score3 = new Score(Arrays.asList(false, false, true), Arrays.asList(
|
||||
-30, -20, 50));
|
||||
Score score4 = new Score(Arrays.asList(false, true, false), Arrays.asList(
|
||||
-20, -10, -30));
|
||||
|
||||
gameState.getScores().addAll(Arrays.asList(score1, score2, score3, score4));
|
||||
|
||||
Score accum = gameState.getAccumulatedScore();
|
||||
assertEquals(Arrays.asList(true, false, false), accum.getWinners());
|
||||
assertEquals(Arrays.asList(-30, -60, -40), accum.getPoints());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAccumulatedScoreDraw() {
|
||||
Score score1 = new Score(Arrays.asList(true, false, false), Arrays.asList(
|
||||
10, -10, -5));
|
||||
Score score2 = new Score(Arrays.asList(true, true, false), Arrays.asList(
|
||||
-10, -10, -50));
|
||||
Score score3 = new Score(Arrays.asList(false, false, true), Arrays.asList(
|
||||
-20, -10, 30));
|
||||
Score score4 = new Score(Arrays.asList(false, true, false), Arrays.asList(
|
||||
-20, -10, -30));
|
||||
|
||||
gameState.getScores().addAll(Arrays.asList(score1, score2, score3, score4));
|
||||
|
||||
Score accum = gameState.getAccumulatedScore();
|
||||
assertEquals(Arrays.asList(true, true, false), accum.getWinners());
|
||||
assertEquals(Arrays.asList(-40, -40, -55), accum.getPoints());
|
||||
}
|
||||
}
|
Reference in a new issue