KVA working

This commit is contained in:
Johannes Schmelz 2024-06-19 01:58:53 +02:00
parent 4b574c50e8
commit 094c17d16a
24 changed files with 105 additions and 31 deletions

Binary file not shown.

Binary file not shown.

View File

@ -2,12 +2,13 @@ package cards.maumau.model;
import cards.Card; import cards.Card;
import cards.Rank;
import cards.Suit; import cards.Suit;
/** /**
* Manages the actions and state transitions within a MauMau game. * Manages the actions and state transitions within a MauMau game.
*/ */
class ActionHandler { public class ActionHandler {
private final MauMau game; private final MauMau game;
private Suit chosenSuit; private Suit chosenSuit;
private int ctr7 = 0; private int ctr7 = 0;
@ -32,6 +33,10 @@ class ActionHandler {
this.handlerState = handlerState; this.handlerState = handlerState;
} }
public HandlerState getHandlerState() {
return handlerState;
}
/** /**
* Adds the specified player to the game. * Adds the specified player to the game.
* *
@ -45,21 +50,23 @@ class ActionHandler {
* Starts the game. * Starts the game.
*/ */
void startGame() { void startGame() {
//TODO implement handlerState.startGame();
} }
/** /**
* Transitions the game state to GAME_OVER. * Transitions the game state to GAME_OVER.
*/ */
void finishGame() { void finishGame() {
//TODO implement // handlerState.finishGame();
gameState = GameState.GAME_OVER;
handlerState = new Finished(this);
} }
/** /**
* Transitions the game state to GAME_CANCELED. * Transitions the game state to GAME_CANCELED.
*/ */
void cancelGame() { void cancelGame() {
//TODO implement handlerState.cancelGame();
} }
/** /**
@ -68,7 +75,7 @@ class ActionHandler {
* @param c The card chosen by the player. * @param c The card chosen by the player.
*/ */
void chooseCard(Card c) { void chooseCard(Card c) {
//TODO implement handlerState.chooseCard(c);
} }
/** /**
@ -77,21 +84,21 @@ class ActionHandler {
* @param suit The suit chosen by the player. * @param suit The suit chosen by the player.
*/ */
void chooseSuit(Suit suit) { void chooseSuit(Suit suit) {
//TODO implement handlerState.chooseSuit(suit);
} }
/** /**
* Lets the player skip a round. * Lets the player skip a round.
**/ **/
void skip() { void skip() {
//TODO implement handlerState.skip();
} }
/** /**
* Handles the player saying "no 7" in the current state. * Handles the player saying "no 7" in the current state.
*/ */
void no7() { void no7() {
//TODO implement handlerState.no7();
} }
/** /**
@ -157,8 +164,23 @@ class ActionHandler {
* @param c The card being played. * @param c The card being played.
* @return True if the card can be played, false otherwise. * @return True if the card can be played, false otherwise.
*/ */
boolean canPlay(Card c) { public boolean canPlay(Card c) {
//TODO implement if (chosenSuit == null) {
if (c.rank() == Rank.JACK) {
return true;
} else if (c.rank() == game.getCardHandler().getDiscardPile().getFirst().rank()) {
return true;
} else if (c.suit() == game.getCardHandler().getDiscardPile().getFirst().suit()) {
return true;
}
}
if (c.suit() == chosenSuit) {
return true;
}
else {
return false; return false;
} }
}
} }

View File

@ -19,12 +19,12 @@ public class Initialized implements HandlerState {
public void startGame() { public void startGame() {
try { try {
handler.getGame().getCardHandler().dealCards(); handler.getGame().getCardHandler().dealCards();
handler.setHandlerState(new Normal(handler));
handler.setGameState(GameState.PLAY); handler.setGameState(GameState.PLAY);
handler.setHandlerState(new Normal(handler));
} catch (Exception e) { } catch (Exception e) {
System.err.println("Not enough Cards!"); System.err.println("Not enough Cards!");
handler.setHandlerState(new Canceled(handler));
handler.setGameState(GameState.GAME_CANCELED); handler.setGameState(GameState.GAME_CANCELED);
handler.setHandlerState(new Canceled(handler));
} }
} }

View File

@ -14,8 +14,9 @@ public class JackChosen implements HandlerState{
public void chooseSuit(Suit suit){ public void chooseSuit(Suit suit){
handler.setChosenSuit(suit); handler.setChosenSuit(suit);
handler.getGame().getPlayerHandler().nextTurn(1);
handler.setGameState(GameState.PLAY);
handler.setHandlerState(new SuitChosen(handler)); handler.setHandlerState(new SuitChosen(handler));
//handler.setGameState(PLAY);
} }
public void startGame(){} public void startGame(){}

View File

@ -78,7 +78,7 @@ public class MauMau {
* *
* @return The action handler. * @return The action handler.
*/ */
ActionHandler getActionHandler() { public ActionHandler getActionHandler() {
return actionHandler; return actionHandler;
} }

View File

@ -13,7 +13,10 @@ public class Normal implements HandlerState {
public void addPlayer(Player player){} public void addPlayer(Player player){}
public void startGame(){} public void startGame(){}
public void finishGame(){} public void finishGame(){
handler.setGameState(GameState.GAME_OVER);
handler.setHandlerState(new Finished(handler));
}
public void cancelGame(){} public void cancelGame(){}
public void chooseCard(Card c){ public void chooseCard(Card c){
@ -24,6 +27,7 @@ public class Normal implements HandlerState {
handler.getGame().getPlayerHandler().nextTurn(1); handler.getGame().getPlayerHandler().nextTurn(1);
handler.setHandlerState(new SevenChosen(handler)); handler.setHandlerState(new SevenChosen(handler));
} else if (c.rank() == Rank.JACK) { } else if (c.rank() == Rank.JACK) {
handler.setGameState(GameState.CHOOSE_SUIT);
handler.setHandlerState(new JackChosen(handler)); handler.setHandlerState(new JackChosen(handler));
} else if (c.rank() == Rank.EIGHT) { } else if (c.rank() == Rank.EIGHT) {
handler.getGame().getPlayerHandler().nextTurn(2); handler.getGame().getPlayerHandler().nextTurn(2);

View File

@ -56,12 +56,13 @@ public class PlayerHandler {
public void localNextTurn(int n) { public void localNextTurn(int n) {
for(int i = 0; i < n; i++){ for(int i = 0; i < n; i++){
players.addLast(players.getFirst()); players.addLast(players.removeFirst());
// players.removeFirst();
} }
} }
public void finishPlayer(Player p) { public void finishPlayer(Player p) {
ranking.addLast(players.removeFirst()); ranking.addLast(players.removeLast());
} }
public Player getCurrentPlayer() { public Player getCurrentPlayer() {
@ -97,6 +98,6 @@ public class PlayerHandler {
} }
public void finishGame() { public void finishGame() {
finishPlayer(players.getFirst()); game.getActionHandler().finishGame();
} }
} }

View File

@ -20,16 +20,21 @@ public class SevenChosen implements HandlerState{
handler.getGame().getPlayerHandler().getCurrentPlayer().playCard(c); handler.getGame().getPlayerHandler().getCurrentPlayer().playCard(c);
handler.increment7Counter(); handler.increment7Counter();
handler.getGame().getPlayerHandler().nextTurn(1); handler.getGame().getPlayerHandler().nextTurn(1);
} else {
} }
} }
public void chooseSuit(Suit suit){} public void chooseSuit(Suit suit){}
public void skip(){} public void skip(){}
public void no7(){ public void no7(){
if (handler.get7Counter() * 2 > handler.getGame().getCardHandler().getDrawPile().size()) {
handler.setGameState(GameState.GAME_CANCELED);
handler.setHandlerState(new Canceled(handler));
} else {
handler.getGame().getPlayerHandler().getCurrentPlayer().drawCards(2 * handler.get7Counter()); handler.getGame().getPlayerHandler().getCurrentPlayer().drawCards(2 * handler.get7Counter());
handler.reset7Counter(); handler.reset7Counter();
handler.setHandlerState(new Normal(handler)); handler.setHandlerState(new Normal(handler));
} }
}
} }

View File

@ -10,10 +10,20 @@ public class WaitForMauMauState implements PlayerState {
@Override @Override
public void nextTurn(int n) { public void nextTurn(int n) {
// Draw a card and proceed to next turn // Draw a card and proceed to next turn
handler.getCurrentPlayer().drawCards(1); handler.getRemember().drawCards(1);
if (handler.getCurrentPlayer().getCards().isEmpty()) {
handler.setRemember(handler.getCurrentPlayer());
handler.localNextTurn(n);
handler.setCurrentState(handler.getWaitForMauMauState());
} else if (handler.getCurrentPlayer().getCards().size() == 1) {
handler.setRemember(handler.getCurrentPlayer());
handler.localNextTurn(n);
handler.setCurrentState(handler.getWaitForMauState());
} else {
handler.localNextTurn(n); handler.localNextTurn(n);
handler.setCurrentState(handler.getWaitForNextTurnState()); handler.setCurrentState(handler.getWaitForNextTurnState());
} }
}
@Override @Override
public void mau(Player p) { public void mau(Player p) {
@ -23,13 +33,20 @@ public class WaitForMauMauState implements PlayerState {
@Override @Override
public void maumau(Player p) { public void maumau(Player p) {
if (p == handler.getRemember()) { if (p == handler.getRemember()) {
handler.finishPlayer(p); handler.finishPlayer(p);
if (handler.getPlayers().size() == 1) { if (handler.getPlayers().size() == 1) {
handler.finishPlayer(handler.getCurrentPlayer());
handler.finishGame(); handler.finishGame();
handler.setCurrentState(handler.getFinishedState()); handler.setCurrentState(handler.getFinishedState());
} else { } else {
handler.setCurrentState(handler.getWaitForNextTurnState()); handler.setCurrentState(handler.getWaitForNextTurnState());
} }
} }
} }
} }

View File

@ -10,15 +10,25 @@ public class WaitForMauState implements PlayerState {
@Override @Override
public void nextTurn(int n) { public void nextTurn(int n) {
// Draw a card and proceed to next turn // Draw a card and proceed to next turn
handler.getCurrentPlayer().drawCards(1); handler.getRemember().drawCards(1);
if (handler.getCurrentPlayer().getCards().isEmpty()) {
handler.setRemember(handler.getCurrentPlayer());
handler.localNextTurn(n);
handler.setCurrentState(handler.getWaitForMauMauState());
} else if (handler.getCurrentPlayer().getCards().size() == 1) {
handler.setRemember(handler.getCurrentPlayer());
handler.localNextTurn(n);
handler.setCurrentState(handler.getWaitForMauState());
} else {
handler.localNextTurn(n); handler.localNextTurn(n);
handler.setCurrentState(handler.getWaitForNextTurnState()); handler.setCurrentState(handler.getWaitForNextTurnState());
} }
}
@Override @Override
public void mau(Player p) { public void mau(Player p) {
if (p == handler.getRemember()) { if (p == handler.getRemember()) {
handler.setCurrentState(handler.getWaitForMauMauState()); handler.setCurrentState(handler.getWaitForNextTurnState());
} }
} }

View File

@ -4,7 +4,9 @@ import cards.Card;
import cards.Rank; import cards.Rank;
import cards.Suit; import cards.Suit;
import cards.maumau.model.MauMau; import cards.maumau.model.MauMau;
import cards.maumau.model.Normal;
import cards.maumau.model.Player; import cards.maumau.model.Player;
import cards.maumau.model.SevenChosen;
import org.junit.Test; import org.junit.Test;
@ -150,8 +152,10 @@ public class MauMau1Test {
assertNull(game.getChosenSuit()); assertNull(game.getChosenSuit());
assertEquals(0, game.get7Counter()); assertEquals(0, game.get7Counter());
assertEquals(Normal.class, game.getActionHandler().getHandlerState().getClass());
chantal.skip(); chantal.skip();
assertEquals(PLAY, game.getGameState()); assertEquals(PLAY, game.getGameState());
assertEquals(Normal.class, game.getActionHandler().getHandlerState().getClass());
assertEquals(List.of(jacqueline, chantal), game.getPlayers()); assertEquals(List.of(jacqueline, chantal), game.getPlayers());
assertEquals(List.of(), game.getRanking()); assertEquals(List.of(), game.getRanking());
assertEquals("[A♦]", jacqueline.getCards().toString()); assertEquals("[A♦]", jacqueline.getCards().toString());

View File

@ -4,6 +4,7 @@ import cards.Card;
import cards.Rank; import cards.Rank;
import cards.Suit; import cards.Suit;
import cards.maumau.model.MauMau; import cards.maumau.model.MauMau;
import cards.maumau.model.Normal;
import cards.maumau.model.Player; import cards.maumau.model.Player;
import org.junit.Test; import org.junit.Test;
@ -26,6 +27,7 @@ import static cards.maumau.model.GameState.GAME_OVER;
import static cards.maumau.model.GameState.PLAY; import static cards.maumau.model.GameState.PLAY;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class MauMau2Test { public class MauMau2Test {
private static Card c(Rank r, Suit s) { private static Card c(Rank r, Suit s) {
@ -186,17 +188,22 @@ public class MauMau2Test {
assertEquals(List.of(jacqueline, chantal), game.getPlayers()); assertEquals(List.of(jacqueline, chantal), game.getPlayers());
assertEquals(List.of(), game.getRanking()); assertEquals(List.of(), game.getRanking());
assertEquals("[Q♠, Q♣]", jacqueline.getCards().toString()); assertEquals("[Q♠, Q♣]", jacqueline.getCards().toString());
// assertEquals("[Q♣]", jacqueline.getCards().toString());
assertEquals("[8♥]", chantal.getCards().toString()); assertEquals("[8♥]", chantal.getCards().toString());
assertEquals("[9♥, K♣, 7♣, J♦, 9♦, A♣, 8♠, 10♦, J♠, J♥, J♣, 10♥, K♥, Q♥, 7♥, 7♦, 8♣, 9♣, 9♠]", game.getDrawPile().toString()); assertEquals("[9♥, K♣, 7♣, J♦, 9♦, A♣, 8♠, 10♦, J♠, J♥, J♣, 10♥, K♥, Q♥, 7♥, 7♦, 8♣, 9♣, 9♠]", game.getDrawPile().toString());
assertEquals("[Q♦, K♦, 8♦, A♦, A♥, A♠, K♠, 7♠, 10♠, 10♣]", game.getDiscardPile().toString()); assertEquals("[Q♦, K♦, 8♦, A♦, A♥, A♠, K♠, 7♠, 10♠, 10♣]", game.getDiscardPile().toString());
assertNull(game.getChosenSuit()); assertNull(game.getChosenSuit());
assertEquals(0, game.get7Counter()); assertEquals(0, game.get7Counter());
// assertEquals("[Q♣]", jacqueline.getCards().toString());
// assertEquals(Normal.class, game.getActionHandler().getHandlerState().getClass());
assertTrue(game.getActionHandler().canPlay(c(QUEEN, SPADES)));
jacqueline.chooseCard(c(QUEEN, SPADES)); jacqueline.chooseCard(c(QUEEN, SPADES));
assertEquals(PLAY, game.getGameState()); assertEquals(PLAY, game.getGameState());
assertEquals(List.of(chantal, jacqueline), game.getPlayers()); assertEquals(List.of(chantal, jacqueline), game.getPlayers());
assertEquals(List.of(), game.getRanking()); assertEquals(List.of(), game.getRanking());
assertEquals("[8♥]", chantal.getCards().toString()); assertEquals("[8♥]", chantal.getCards().toString());
// assertEquals(Normal.class, game.getActionHandler().getHandlerState().getClass());
assertEquals("[Q♣]", jacqueline.getCards().toString()); assertEquals("[Q♣]", jacqueline.getCards().toString());
assertEquals("[9♥, K♣, 7♣, J♦, 9♦, A♣, 8♠, 10♦, J♠, J♥, J♣, 10♥, K♥, Q♥, 7♥, 7♦, 8♣, 9♣, 9♠]", game.getDrawPile().toString()); assertEquals("[9♥, K♣, 7♣, J♦, 9♦, A♣, 8♠, 10♦, J♠, J♥, J♣, 10♥, K♥, Q♥, 7♥, 7♦, 8♣, 9♣, 9♠]", game.getDrawPile().toString());
assertEquals("[Q♠, Q♦, K♦, 8♦, A♦, A♥, A♠, K♠, 7♠, 10♠, 10♣]", game.getDiscardPile().toString()); assertEquals("[Q♠, Q♦, K♦, 8♦, A♦, A♥, A♠, K♠, 7♠, 10♠, 10♣]", game.getDiscardPile().toString());

View File

@ -26,7 +26,9 @@ import static cards.maumau.model.GameState.GAME_INITIALIZED;
import static cards.maumau.model.GameState.GAME_OVER; import static cards.maumau.model.GameState.GAME_OVER;
import static cards.maumau.model.GameState.PLAY; import static cards.maumau.model.GameState.PLAY;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class MauMau4Test { public class MauMau4Test {
private static Card c(Rank r, Suit s) { private static Card c(Rank r, Suit s) {
@ -128,6 +130,7 @@ public class MauMau4Test {
assertEquals(0, game.get7Counter()); assertEquals(0, game.get7Counter());
chantal.chooseCard(c(JACK, SPADES)); chantal.chooseCard(c(JACK, SPADES));
assertFalse(game.getActionHandler().canPlay(c(JACK, SPADES)));
assertEquals(PLAY, game.getGameState()); assertEquals(PLAY, game.getGameState());
assertEquals(List.of(chantal, jacqueline), game.getPlayers()); assertEquals(List.of(chantal, jacqueline), game.getPlayers());
assertEquals(List.of(), game.getRanking()); assertEquals(List.of(), game.getRanking());