summaryrefslogtreecommitdiffstats
path: root/src/jrummikub
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub')
-rw-r--r--src/jrummikub/control/GameControl.java29
-rw-r--r--src/jrummikub/model/Score.java4
-rw-r--r--src/jrummikub/view/IScorePanel.java35
-rw-r--r--src/jrummikub/view/IView.java18
-rw-r--r--src/jrummikub/view/impl/ScorePanel.java131
-rw-r--r--src/jrummikub/view/impl/View.java18
6 files changed, 223 insertions, 12 deletions
diff --git a/src/jrummikub/control/GameControl.java b/src/jrummikub/control/GameControl.java
index 0ae05a6..887b80d 100644
--- a/src/jrummikub/control/GameControl.java
+++ b/src/jrummikub/control/GameControl.java
@@ -34,9 +34,10 @@ public class GameControl {
public GameControl(GameSettings gameSettings, IView view) {
this.gameSettings = gameSettings;
this.view = view;
-
+
gameState = new GameState();
- gameState.setFirstRoundFirstPlayer((int)(Math.random() * gameSettings.getPlayerList().size()));
+ gameState.setFirstRoundFirstPlayer((int) (Math.random() * gameSettings
+ .getPlayerList().size()));
connections.add(view.getNewRoundEvent().add(new IListener() {
@Override
@@ -64,20 +65,22 @@ public class GameControl {
return;
}
+ view.showScorePanel(false);
+
IRoundState roundState = new RoundState(gameSettings);
- // TODO: add number of already played rounds
- roundState.setActivePlayerNumber(gameState.getFirstRoundFirstPlayer());
-
+ roundState.setActivePlayerNumber(gameState.getFirstRoundFirstPlayer()
+ + gameState.getScores().size());
+
roundControl = new RoundControl(roundState, view);
roundControl.getEndOfRoundEvent().add(new IListener1<Score>() {
@Override
public void handle(Score roundScore) {
- endOfRound();
+ endOfRound(roundScore);
}
});
-
+
roundControl.getRestartRoundEvent().add(new IListener() {
@Override
@@ -88,15 +91,23 @@ public class GameControl {
roundControl.startRound();
}
-
+
private void restartRound() {
roundControl = null;
startRound();
}
- private void endOfRound() {
+ private void endOfRound(Score roundScore) {
+ gameState.getScores().add(roundScore);
+
roundControl = null;
view.enableWinPanel(true);
+
+ view.getScorePanel().setPlayers(gameSettings.getPlayerList());
+ view.getScorePanel().setScores(gameState.getScores());
+ view.getScorePanel().setAccumulatedScore(gameState.getAccumulatedScore());
+ view.getScorePanel().update();
+ view.showScorePanel(true);
}
private void finalScore() {
diff --git a/src/jrummikub/model/Score.java b/src/jrummikub/model/Score.java
index adc78a7..7020edc 100644
--- a/src/jrummikub/model/Score.java
+++ b/src/jrummikub/model/Score.java
@@ -6,8 +6,8 @@ import java.util.List;
* Score of a single round
*/
public class Score {
- List<Boolean> winners;
- List<Integer> points;
+ private List<Boolean> winners;
+ private List<Integer> points;
/**
* Create a new round score
diff --git a/src/jrummikub/view/IScorePanel.java b/src/jrummikub/view/IScorePanel.java
new file mode 100644
index 0000000..be0b912
--- /dev/null
+++ b/src/jrummikub/view/IScorePanel.java
@@ -0,0 +1,35 @@
+package jrummikub.view;
+
+import jrummikub.model.PlayerSettings;
+import jrummikub.model.Score;
+
+/**
+ * The panel the scores are displayed in
+ */
+public interface IScorePanel {
+ /**
+ * Sets the scores of the played rounds
+ *
+ * @param scores the round scores
+ */
+ public void setScores(Iterable<Score> scores);
+
+ /**
+ * Sets the accumulated scores to display
+ *
+ * @param accumulatedScore the accumulated score
+ */
+ public void setAccumulatedScore(Score accumulatedScore);
+
+ /**
+ * Sets the player list to display
+ *
+ * @param players the player list
+ */
+ void setPlayers(Iterable<PlayerSettings> players);
+
+ /**
+ * Updates the score display
+ */
+ void update();
+}
diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java
index 6a96213..3e33e44 100644
--- a/src/jrummikub/view/IView.java
+++ b/src/jrummikub/view/IView.java
@@ -17,6 +17,13 @@ public interface IView {
public ISettingsPanel getSettingsPanel();
/**
+ * Returns the score panel
+ *
+ * @return the score panel
+ */
+ public IScorePanel getScorePanel();
+
+ /**
* Returns the table
*
* @return the table
@@ -91,7 +98,16 @@ public interface IView {
/**
* Shows or hides the game settings panel
*
- * @param show specifies if the panel shall be shown or hidden
+ * @param show
+ * specifies if the panel shall be shown or hidden
*/
void showSettingsPanel(boolean show);
+
+ /**
+ * Shows or hides the score panel
+ *
+ * @param show
+ * specifies if the panel shall be shown or hidden
+ */
+ void showScorePanel(boolean show);
}
diff --git a/src/jrummikub/view/impl/ScorePanel.java b/src/jrummikub/view/impl/ScorePanel.java
new file mode 100644
index 0000000..e926294
--- /dev/null
+++ b/src/jrummikub/view/impl/ScorePanel.java
@@ -0,0 +1,131 @@
+package jrummikub.view.impl;
+
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.util.Iterator;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSeparator;
+import javax.swing.border.LineBorder;
+
+import jrummikub.model.PlayerSettings;
+import jrummikub.model.Score;
+import jrummikub.view.IScorePanel;
+
+@SuppressWarnings("serial")
+class ScorePanel extends JPanel implements IScorePanel {
+ private Iterable<PlayerSettings> players;
+ private Iterable<Score> scores;
+ private Score accumulatedScore;
+
+ public ScorePanel() {
+ setLayout(new GridBagLayout());
+ setBorder(new LineBorder(Color.BLACK));
+ }
+
+ @Override
+ public void setPlayers(Iterable<PlayerSettings> players) {
+ this.players = players;
+ }
+
+ @Override
+ public void setScores(Iterable<Score> scores) {
+ this.scores = scores;
+ }
+
+ @Override
+ public void setAccumulatedScore(Score accumulatedScore) {
+ this.accumulatedScore = accumulatedScore;
+ }
+
+ @Override
+ public void update() {
+ this.removeAll();
+
+ GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.BOTH;
+ c.weightx = 1.0;
+ c.gridwidth = GridBagConstraints.REMAINDER;
+
+ addPlayerNames();
+
+ add(new JSeparator(), c);
+
+ int n = 0;
+ for (Iterator<Score> it = scores.iterator(); it.hasNext();) {
+ addScoreRow(it.next(), ++n);
+ }
+
+ add(new JSeparator(), c);
+
+ addAccumulatedScore();
+ }
+
+ private void addPlayerNames() {
+ GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.BOTH;
+ c.weightx = 1.0;
+
+ JLabel roundHead = new JLabel("Runde");
+ roundHead.setHorizontalAlignment(JLabel.CENTER);
+ add(roundHead, c);
+
+ for (Iterator<PlayerSettings> it = players.iterator(); it.hasNext();) {
+ PlayerSettings player = it.next();
+
+ if (!it.hasNext()) {
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ }
+
+ JLabel playerNameLabel = new JLabel(player.getName());
+ playerNameLabel.setIcon(ImageUtil.createColorIcon(player.getColor(), 12,
+ 1));
+ playerNameLabel.setHorizontalAlignment(JLabel.CENTER);
+
+ add(playerNameLabel, c);
+ }
+ }
+
+ private void addScoreRow(Score score, int n) {
+ GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.BOTH;
+ c.weightx = 1.0;
+ c.gridwidth = 1;
+
+ JLabel roundLabel = new JLabel(Integer.toString(n));
+ roundLabel.setHorizontalAlignment(JLabel.CENTER);
+ add(roundLabel, c);
+
+ for (int i = 0; i < score.getPoints().size(); ++i) {
+ if (i == score.getPoints().size()-1) {
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ }
+
+ JLabel scoreLabel = new JLabel(Integer.toString(score.getPoints().get(i)));
+ scoreLabel.setHorizontalAlignment(JLabel.CENTER);
+ add(scoreLabel, c);
+ }
+ }
+
+ private void addAccumulatedScore() {
+ GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.BOTH;
+ c.weightx = 1.0;
+
+ JLabel accumLabel = new JLabel("Gesamt");
+ accumLabel.setHorizontalAlignment(JLabel.CENTER);
+ add(accumLabel, c);
+
+ for (int i = 0; i < accumulatedScore.getPoints().size(); ++i) {
+ if (i == accumulatedScore.getPoints().size()-1) {
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ }
+
+ JLabel scoreLabel = new JLabel(Integer.toString(accumulatedScore.getPoints().get(i)));
+ scoreLabel.setHorizontalAlignment(JLabel.CENTER);
+ add(scoreLabel, c);
+ }
+ }
+}
diff --git a/src/jrummikub/view/impl/View.java b/src/jrummikub/view/impl/View.java
index 0bc2e23..7381175 100644
--- a/src/jrummikub/view/impl/View.java
+++ b/src/jrummikub/view/impl/View.java
@@ -15,6 +15,7 @@ import jrummikub.model.Stone;
import jrummikub.util.IEvent;
import jrummikub.view.IHandPanel;
import jrummikub.view.IPlayerPanel;
+import jrummikub.view.IScorePanel;
import jrummikub.view.ISettingsPanel;
import jrummikub.view.ITablePanel;
import jrummikub.view.IView;
@@ -32,6 +33,7 @@ public class View extends JFrame implements IView {
private StartTurnPanel startTurnPanel;
private WinPanel winPanel;
private SettingsPanel settingsPanel;
+ private ScorePanel scorePanel;
private final static float PLAYER_PANEL_RATIO = 0.14f;
private final static int PLAYER_PANEL_BORDER_WIDTH = 1;
@@ -47,6 +49,11 @@ public class View extends JFrame implements IView {
}
@Override
+ public IScorePanel getScorePanel() {
+ return scorePanel;
+ }
+
+ @Override
public ITablePanel getTablePanel() {
return table;
}
@@ -100,6 +107,11 @@ public class View extends JFrame implements IView {
layeredPane.setLayer(settingsPanel, JLayeredPane.POPUP_LAYER);
layeredPane.add(settingsPanel);
+ scorePanel = new ScorePanel();
+ scorePanel.setVisible(false);
+ layeredPane.setLayer(scorePanel, JLayeredPane.POPUP_LAYER);
+ layeredPane.add(scorePanel);
+
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
@@ -132,6 +144,7 @@ public class View extends JFrame implements IView {
startTurnPanel.setBounds(0, tableHeight, width, playerPanelHeight);
winPanel.setBounds(0, tableHeight, width, playerPanelHeight);
settingsPanel.setBounds(width / 4, height / 4, width / 2, height / 2);
+ scorePanel.setBounds(width / 8, height / 4, width * 3 / 4, height / 2);
}
@Override
@@ -160,6 +173,11 @@ public class View extends JFrame implements IView {
}
@Override
+ public void showScorePanel(boolean show) {
+ scorePanel.setVisible(show);
+ }
+
+ @Override
public void setCurrentPlayerName(String playerName) {
playerPanel.setCurrentPlayerName(playerName);
startTurnPanel.setCurrentPlayerName(playerName);