From 3906fcf3d702f13da79c797c91a2dd32d874af49 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Tue, 22 Jun 2021 21:12:52 +0200 Subject: update(MancalaImpl) <- playPit returns stateArray --- domain/src/main/java/mancala/domain/Bowl.java | 2 ++ domain/src/main/java/mancala/domain/Kalaha.java | 12 ++++++++++++ domain/src/main/java/mancala/domain/Mancala.java | 2 +- .../src/main/java/mancala/domain/MancalaImpl.java | 21 ++++++++++++++++++--- domain/src/main/java/mancala/domain/SmallBowl.java | 16 +++++++++++++++- 5 files changed, 48 insertions(+), 5 deletions(-) (limited to 'domain/src/main/java') diff --git a/domain/src/main/java/mancala/domain/Bowl.java b/domain/src/main/java/mancala/domain/Bowl.java index a36c621..07859f7 100644 --- a/domain/src/main/java/mancala/domain/Bowl.java +++ b/domain/src/main/java/mancala/domain/Bowl.java @@ -62,4 +62,6 @@ abstract class Bowl { protected abstract String makeString(String playerBowls, String opponentBowls, String kalahas); + + protected abstract int[] toStateArray(int[] stateArray, int index); } diff --git a/domain/src/main/java/mancala/domain/Kalaha.java b/domain/src/main/java/mancala/domain/Kalaha.java index c85af4a..411a86d 100644 --- a/domain/src/main/java/mancala/domain/Kalaha.java +++ b/domain/src/main/java/mancala/domain/Kalaha.java @@ -73,4 +73,16 @@ class Kalaha extends Bowl { void claimStolenBooty(int booty) { myStones = myStones + booty; } + + @Override + protected int[] toStateArray(int[] stateArray, int index) { + stateArray[index] = getMyStones(); + if (index == stateArray.length - 2) { + stateArray[stateArray.length - 1] = (getMyOwner().hasTheTurn() ? Mancala.PLAYER_TWO : Mancala.PLAYER_ONE); + return stateArray; + } else { + return getNextBowl().toStateArray(stateArray, ++index); + } + } + } diff --git a/domain/src/main/java/mancala/domain/Mancala.java b/domain/src/main/java/mancala/domain/Mancala.java index f8a2621..d80e9e5 100644 --- a/domain/src/main/java/mancala/domain/Mancala.java +++ b/domain/src/main/java/mancala/domain/Mancala.java @@ -24,7 +24,7 @@ public interface Mancala { * @param index Index of the recess to be played. * @return 15 item long Array with the current state of the game. The 15th item indicates which player has the next turn (possible values are 1 or 2). */ - void playPit(int index) throws MancalaException; + int[] playPit(int index) throws MancalaException; /** * Method for returning the amount of stones in de specified pit. Index is as specified below: diff --git a/domain/src/main/java/mancala/domain/MancalaImpl.java b/domain/src/main/java/mancala/domain/MancalaImpl.java index a8e6691..0090f2d 100644 --- a/domain/src/main/java/mancala/domain/MancalaImpl.java +++ b/domain/src/main/java/mancala/domain/MancalaImpl.java @@ -1,5 +1,6 @@ package mancala.domain; +import java.util.Arrays; import java.util.HashSet; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -27,6 +28,19 @@ public class MancalaImpl implements Mancala { domainOpponent = domainPlayer.getOpponent(); } + public MancalaImpl(int[] stonesArray) { + try { + domainReference = new SmallBowl( + Arrays.stream(stonesArray) + .boxed().collect(Collectors.toList()) + ); + } catch (DomainSmallBowlException e) { + e.printStackTrace(); + } + domainPlayer = domainReference.getMyOwner(); + domainOpponent = domainPlayer.getOpponent(); + } + @Override public boolean isPlayersTurn(int player) { switch (player) { @@ -40,7 +54,7 @@ public class MancalaImpl implements Mancala { } @Override - public void playPit(int index) throws MancalaException { + public int[] playPit(int index) throws MancalaException { if (isPlayersTurn(Mancala.PLAYER_ONE) && MancalaImpl.PLAYER_TWO_PITS.contains(index)) { throw new MancalaException("Player one cannot play player two's pits."); } @@ -61,6 +75,7 @@ public class MancalaImpl implements Mancala { domainReference.getNextSmallBowlTimes(skipKalahaIndex).play(); } + return domainReference.toStateArray(new int[15], 0); } @Override @@ -93,9 +108,9 @@ public class MancalaImpl implements Mancala { public int getWinner() { if (!isEndOfGame()) return Mancala.NO_PLAYERS; - if (domainPlayer.won()) return Mancala.PLAYER_ONE; + if (domainPlayer.won() && domainOpponent.won()) return Mancala.BOTH_PLAYERS; + else if (domainPlayer.won()) return Mancala.PLAYER_ONE; else if (domainOpponent.won()) return Mancala.PLAYER_TWO; - else if (domainPlayer.won() && domainOpponent.won()) return Mancala.BOTH_PLAYERS; else return Mancala.NO_PLAYERS; } diff --git a/domain/src/main/java/mancala/domain/SmallBowl.java b/domain/src/main/java/mancala/domain/SmallBowl.java index 216e2ad..b750f61 100644 --- a/domain/src/main/java/mancala/domain/SmallBowl.java +++ b/domain/src/main/java/mancala/domain/SmallBowl.java @@ -17,6 +17,9 @@ public class SmallBowl extends Bowl { if (stonesList.size() % 2 != 0) { throw new DomainSmallBowlException("Stones List should contain even number of elements."); } + if (stonesList.size() < 4) { + throw new DomainSmallBowlException("Stones list should have length greater than or equal to 4."); + } this.myOwner = new Player(); int boardSize = stonesList.size(); @@ -24,7 +27,9 @@ public class SmallBowl extends Bowl { this.myStones = stonesList.remove(0); - this.nextBowl = new SmallBowl(boardSize, bowlsToAdd, stonesList, this, this.getMyOwner()); + if (boardSize == 4) this.nextBowl = new Kalaha(boardSize, bowlsToAdd, stonesList, this, this.getMyOwner()); + else this.nextBowl = new SmallBowl(boardSize, bowlsToAdd, stonesList, this, this.getMyOwner()); + referencePoint = this; } @@ -145,4 +150,13 @@ public class SmallBowl extends Bowl { } } + @Override + protected int[] toStateArray(int[] stateArray, int index) { + stateArray[index] = getMyStones(); + if (index == stateArray.length - 2) { + return stateArray; + } else { + return getNextBowl().toStateArray(stateArray, ++index); + } + } } -- cgit v1.2.3