From 20d514efac0c727bc81158e584a13f1dcd87f3f7 Mon Sep 17 00:00:00 2001 From: Ken Date: Sun, 9 Jul 2023 22:37:07 +0800 Subject: [PATCH 1/2] feat(Landmark): Change CardSide attribute to flipped (boolean) 1. Change CardSide attribute to flipped (boolean) 2. Rename from ownedEstablishment to establishments 3. Rename from ownedLandmark to landmarks --- src/main/java/domain/Game.java | 2 +- src/main/java/domain/HandCard.java | 18 +++++++-------- src/main/java/domain/Player.java | 22 +++++++++---------- .../card/establishment/CheeseFactory.java | 2 +- .../FruitAndVegetableMarket.java | 2 +- .../card/establishment/FurnitureFactory.java | 2 +- .../java/domain/card/landmark/Landmark.java | 12 +++++----- src/test/java/domain/GameTest.java | 10 ++++----- src/test/java/domain/PlayerTest.java | 14 ++++++------ .../establishment/FurnitureFactoryTest.java | 4 ++-- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/main/java/domain/Game.java b/src/main/java/domain/Game.java index 5de7ab0..d6f87a4 100644 --- a/src/main/java/domain/Game.java +++ b/src/main/java/domain/Game.java @@ -23,7 +23,7 @@ public Game(Bank bank, List players, List dices, Marketplace marke public void distributeResources(int dicePoint) { this.setCurrentDicePoint(dicePoint); - this.getPlayers().forEach(player -> player.ownedEstablishmentTakeEffect(this)); + this.getPlayers().forEach(player -> player.establishmentTakeEffect(this)); } public int getCurrentDicePoint() { diff --git a/src/main/java/domain/HandCard.java b/src/main/java/domain/HandCard.java index ac6f45e..d1f0f01 100644 --- a/src/main/java/domain/HandCard.java +++ b/src/main/java/domain/HandCard.java @@ -10,24 +10,24 @@ public class HandCard { private Player player; - private final List ownedEstablishment = new ArrayList<>(); - private final List ownedLandmark = Arrays.asList(new TrainStation(), new ShoppingMall(), new AmusementPark(), new RadioTower()); + private final List establishments = new ArrayList<>(); + private final List landmarks = Arrays.asList(new TrainStation(), new ShoppingMall(), new AmusementPark(), new RadioTower()); public void addCardToHandCard(Establishment establishment) { - ownedEstablishment.add(establishment); + establishments.add(establishment); } public Card getHandCard(int index){ - if (index < 0 || index >= getOwnedLandmark().size()) { + if (index < 0 || index >= getLandmarks().size()) { throw new IllegalArgumentException(); } - return ownedEstablishment.get(index); + return establishments.get(index); } - public List getOwnedEstablishment() { - return ownedEstablishment; + public List getEstablishments() { + return establishments; } - public List getOwnedLandmark() { - return ownedLandmark; + public List getLandmarks() { + return landmarks; } public void setPlayer(Player player) { this.player = player; diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 9cda846..41033a4 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -26,12 +26,12 @@ public int getTotalCoin() { return coins; } - public List getOwnedEstablishment() { - return handCard.getOwnedEstablishment(); + public List getEstablishments() { + return handCard.getEstablishments(); } - public List getOwnedLandmark() { - return handCard.getOwnedLandmark(); + public List getLandmarks() { + return handCard.getLandmarks(); } public void buyCard(Establishment card) { @@ -54,12 +54,12 @@ public void flipLandMark(Landmark card) { if (!isBalanceEnough(cost)) return; // FIXME: 2022/12/8 throw Exception or other way to handle this condition. - handCard.getOwnedLandmark() + handCard.getLandmarks() .stream() - .filter(l -> l.equals(card) && l.getCardSide().equals(Landmark.CardSide.BACK)) + .filter(l -> l.equals(card) && l.isFlipped() == false) .findFirst() .map(targetlandmark -> { - targetlandmark.setCardSide(Landmark.CardSide.FRONT); + targetlandmark.setFlipped(true); this.payCoin(cost); return targetlandmark; }) @@ -86,9 +86,9 @@ public void gainCoin(int coin) { this.coins += coin; } - public void ownedEstablishmentTakeEffect(Game game) { - handCard.getOwnedEstablishment().sort(Comparator.comparing(establishment -> establishment.getIndustryColor().getOrder())); - handCard.getOwnedEstablishment().forEach(establishment -> establishment.takeEffect(game)); + public void establishmentTakeEffect(Game game) { + handCard.getEstablishments().sort(Comparator.comparing(establishment -> establishment.getIndustryColor().getOrder())); + handCard.getEstablishments().forEach(establishment -> establishment.takeEffect(game)); } private boolean isBalanceEnough(int cost) { @@ -106,6 +106,6 @@ public Card getHandCard(int index) { //購買紫色建築物時,判斷玩家手上是否已有相同建築物 private boolean hasTheSamePurpleCard(Establishment toBuyCard) { - return handCard.getOwnedEstablishment().contains(toBuyCard); + return handCard.getEstablishments().contains(toBuyCard); } } diff --git a/src/main/java/domain/card/establishment/CheeseFactory.java b/src/main/java/domain/card/establishment/CheeseFactory.java index 475c889..ee9de6d 100644 --- a/src/main/java/domain/card/establishment/CheeseFactory.java +++ b/src/main/java/domain/card/establishment/CheeseFactory.java @@ -17,7 +17,7 @@ protected void doTakeEffect(Game game) { // 當你自己骰出這個數字時,每擁有一張[CardType.ANIMAL_HUSBANDRY]符號的建築,就可以從銀行獲得3元。 if (game.isTurnPlayer(getOwner())) { int animalHusbandryCardsCount = - (int) getOwner().getOwnedEstablishment().stream().filter(establishment -> establishment.getCardType().equals(ANIMAL_HUSBANDRY)).count(); + (int) getOwner().getEstablishments().stream().filter(establishment -> establishment.getCardType().equals(ANIMAL_HUSBANDRY)).count(); //如果玩家自己沒有擁有牧場卡牌,就得不到任何收入? if (animalHusbandryCardsCount > 0) { game.getBank().payCoin(animalHusbandryCardsCount * 3); diff --git a/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java b/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java index e9d663d..608e2cc 100644 --- a/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java +++ b/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java @@ -15,7 +15,7 @@ public FruitAndVegetableMarket() { protected void doTakeEffect(Game game) { // 當你自己骰出這個數字時,每擁有一張[CardType.CROP]的建築,就可以從銀行獲得2元。 if (isTurnPlayer(game, getOwner())) { - var cropCardCount = (int) getOwner().getOwnedEstablishment().stream() + var cropCardCount = (int) getOwner().getEstablishments().stream() .filter(establishment -> establishment.getCardType().equals(CardType.CROP)) .count(); game.getBank().payCoin(cropCardCount * 2); diff --git a/src/main/java/domain/card/establishment/FurnitureFactory.java b/src/main/java/domain/card/establishment/FurnitureFactory.java index 237f001..07110da 100644 --- a/src/main/java/domain/card/establishment/FurnitureFactory.java +++ b/src/main/java/domain/card/establishment/FurnitureFactory.java @@ -16,7 +16,7 @@ protected void doTakeEffect(Game game) { // 當你自己骰出這個數字時,每擁有一張[CardType.NATURE_RESOURCES]符號的建築,就可以從銀行獲得3元。 if (game.isTurnPlayer(getOwner())) { var natureResourcesCardCount = - (int) getOwner().getOwnedEstablishment() + (int) getOwner().getEstablishments() .stream() .filter(card -> card.getCardType().equals(CardType.NATURE_RESOURCES)) .count(); diff --git a/src/main/java/domain/card/landmark/Landmark.java b/src/main/java/domain/card/landmark/Landmark.java index 0657fba..d0143ac 100644 --- a/src/main/java/domain/card/landmark/Landmark.java +++ b/src/main/java/domain/card/landmark/Landmark.java @@ -5,14 +5,13 @@ import domain.card.CardType; public class Landmark extends Card { - private CardSide cardSide = CardSide.BACK; + private boolean flipped; public Landmark(String name, int constructionCost, CardType cardType) { super(name, constructionCost, cardType); } @Override - public void takeEffect(Game game) { } @@ -20,11 +19,12 @@ public enum CardSide { FRONT, BACK } - public CardSide getCardSide() { - return cardSide; + public boolean isFlipped() { + return flipped; } - public void setCardSide(CardSide cardSide) { - this.cardSide = cardSide; + public void setFlipped(boolean flipped) { + this.flipped = flipped; } + } diff --git a/src/test/java/domain/GameTest.java b/src/test/java/domain/GameTest.java index e518d5f..6b42bc8 100644 --- a/src/test/java/domain/GameTest.java +++ b/src/test/java/domain/GameTest.java @@ -52,18 +52,18 @@ private void assertOneBakeryAndOneWheatFieldAndFourLandmarkAndThreeCoins(Player assertEquals(1, getEstablishmentCount(player, new WheatField())); - List ownedLandmark = player.getOwnedLandmark(); + List landmarks = player.getLandmarks(); - assertEquals(4, ownedLandmark.size()); + assertEquals(4, landmarks.size()); - ownedLandmark.forEach(landmark -> assertEquals(Landmark.CardSide.BACK, landmark.getCardSide())); + landmarks.forEach(landmark -> assertEquals(false, landmark.isFlipped())); assertEquals(3, player.getTotalCoin()); } private long getEstablishmentCount(Player player, Establishment establishment) { - return player.getOwnedEstablishment() + return player.getEstablishments() .stream() .filter(card -> card.equals(establishment)).count(); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index 26e19a7..c49256d 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -56,7 +56,7 @@ void flipBackLandMark() { //then assertThat(player.getTotalCoin()).isEqualTo(originalBalanceOfPlayer - 16); - assertThat(player.getOwnedLandmark().get(2).getCardSide()).isEqualTo(Landmark.CardSide.FRONT); + assertThat(player.getLandmarks().get(2).isFlipped()).isTrue(); } @Test @@ -64,7 +64,7 @@ void flipFrontLandMark() { //given 玩家有正面的主題樂園 var originalBalanceOfPlayer = player.getTotalCoin(); var amusementPark = new AmusementPark(); - player.getOwnedLandmark().get(2).setCardSide(Landmark.CardSide.FRONT); + player.getLandmarks().get(2).setFlipped(true); //when NoSuchElementException actualException = Assertions.assertThrows(NoSuchElementException.class, @@ -80,7 +80,7 @@ void flipFrontLandMark() { void givenPlayerNoHaveBusinessCenterWhenBuyTheSameCardThenSuccess() { var businessCenter = new BusinessCenter(); //given 玩家沒有商業中心建築 - List playerOriginalOwnedEstablishment = player.getOwnedEstablishment(); + List playerOriginalOwnedEstablishment = player.getEstablishments(); Assertions.assertFalse(playerOriginalOwnedEstablishment.contains(businessCenter)); @@ -88,7 +88,7 @@ void givenPlayerNoHaveBusinessCenterWhenBuyTheSameCardThenSuccess() { player.buyCard(businessCenter); //then 購買成功 - List playerOwnedEstablishment = player.getOwnedEstablishment(); + List playerOwnedEstablishment = player.getEstablishments(); Assertions.assertTrue(playerOwnedEstablishment.contains(businessCenter)); } @@ -103,7 +103,7 @@ void givenPlayerHaveBusinessCenterWhenBuyTheSameCardThenReject() { var businessCenter = new BusinessCenter(); //given 玩家有商業中心建築 player.addCardToHandCard(businessCenter); - List playerOriginalOwnedEstablishment = player.getOwnedEstablishment(); + List playerOriginalOwnedEstablishment = player.getEstablishments(); Assertions.assertTrue(playerOriginalOwnedEstablishment.contains(businessCenter)); @@ -111,11 +111,11 @@ void givenPlayerHaveBusinessCenterWhenBuyTheSameCardThenReject() { player.buyCard(businessCenter); //then 購買失敗,只能擁有一座商業中心 - List playerOwnedEstablishment = player.getOwnedEstablishment(); + List playerOwnedEstablishment = player.getEstablishments(); long businessCenterCount = playerOwnedEstablishment .stream() .filter(card -> card.equals(businessCenter)) .count(); Assertions.assertEquals(businessCenterCount, 1); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/card/establishment/FurnitureFactoryTest.java b/src/test/java/domain/card/establishment/FurnitureFactoryTest.java index 3974aa0..513b76c 100644 --- a/src/test/java/domain/card/establishment/FurnitureFactoryTest.java +++ b/src/test/java/domain/card/establishment/FurnitureFactoryTest.java @@ -25,7 +25,7 @@ void setUp() { @Test void takeEffect() { - player.getOwnedEstablishment().addAll(List.of(new Forest(), new Mine())); + player.getEstablishments().addAll(List.of(new Forest(), new Mine())); int originalBalanceOfBank = game.getBank().getTotalCoin(); int originalBalanceOfPlayer = player.getTotalCoin(); player.addCardToHandCard(furnitureFactory); @@ -55,4 +55,4 @@ void takeEffectWithoutNatureResources() { assertThat(balanceOfBank).isEqualTo(originalBalanceOfBank); assertThat(balanceOfPlayer).isEqualTo(originalBalanceOfPlayer); } -} \ No newline at end of file +} From 9bcd6f25176faa8cf40e2f3ad946c44672e070e2 Mon Sep 17 00:00:00 2001 From: Ken Date: Tue, 11 Jul 2023 17:34:31 +0800 Subject: [PATCH 2/2] refactor(methods): Encapsulate some methods --- src/main/java/domain/Player.java | 18 ++++++++++++++++-- .../establishment/FruitAndVegetableMarket.java | 4 +--- src/test/java/domain/PlayerTest.java | 9 +++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 41033a4..cbebb8f 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -1,11 +1,15 @@ package domain; import domain.card.Card; +import domain.card.CardType; import domain.card.establishment.Establishment; import domain.card.establishment.IndustryColor; -import domain.card.landmark.*; +import domain.card.landmark.Landmark; -import java.util.*; +import java.util.Comparator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; public class Player { private final String name; @@ -30,10 +34,20 @@ public List getEstablishments() { return handCard.getEstablishments(); } + public List getEstablishments(CardType cardType) { + return handCard.getEstablishments().stream() + .filter(establishment -> establishment.getCardType().equals(CardType.CROP)) + .collect(Collectors.toList()); + } + public List getLandmarks() { return handCard.getLandmarks(); } + public Landmark getLandmark(int index) { + return handCard.getLandmarks().get(index); + } + public void buyCard(Establishment card) { int cost = card.getConstructionCost(); if (!isBalanceEnough(cost)) diff --git a/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java b/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java index 608e2cc..8c056d5 100644 --- a/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java +++ b/src/main/java/domain/card/establishment/FruitAndVegetableMarket.java @@ -15,9 +15,7 @@ public FruitAndVegetableMarket() { protected void doTakeEffect(Game game) { // 當你自己骰出這個數字時,每擁有一張[CardType.CROP]的建築,就可以從銀行獲得2元。 if (isTurnPlayer(game, getOwner())) { - var cropCardCount = (int) getOwner().getEstablishments().stream() - .filter(establishment -> establishment.getCardType().equals(CardType.CROP)) - .count(); + var cropCardCount = getOwner().getEstablishments(CardType.CROP).size(); game.getBank().payCoin(cropCardCount * 2); getOwner().gainCoin(cropCardCount * 2); } diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index c49256d..2bf5cd7 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -14,6 +14,7 @@ import java.util.NoSuchElementException; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; class PlayerTest { @@ -56,7 +57,7 @@ void flipBackLandMark() { //then assertThat(player.getTotalCoin()).isEqualTo(originalBalanceOfPlayer - 16); - assertThat(player.getLandmarks().get(2).isFlipped()).isTrue(); + assertTrue(player.getLandmark(2).isFlipped()); } @Test @@ -64,7 +65,7 @@ void flipFrontLandMark() { //given 玩家有正面的主題樂園 var originalBalanceOfPlayer = player.getTotalCoin(); var amusementPark = new AmusementPark(); - player.getLandmarks().get(2).setFlipped(true); + player.getLandmark(2).setFlipped(true); //when NoSuchElementException actualException = Assertions.assertThrows(NoSuchElementException.class, @@ -90,7 +91,7 @@ void givenPlayerNoHaveBusinessCenterWhenBuyTheSameCardThenSuccess() { //then 購買成功 List playerOwnedEstablishment = player.getEstablishments(); - Assertions.assertTrue(playerOwnedEstablishment.contains(businessCenter)); + assertTrue(playerOwnedEstablishment.contains(businessCenter)); } /* @@ -105,7 +106,7 @@ void givenPlayerHaveBusinessCenterWhenBuyTheSameCardThenReject() { player.addCardToHandCard(businessCenter); List playerOriginalOwnedEstablishment = player.getEstablishments(); - Assertions.assertTrue(playerOriginalOwnedEstablishment.contains(businessCenter)); + assertTrue(playerOriginalOwnedEstablishment.contains(businessCenter)); //when 玩家買下商業中心 player.buyCard(businessCenter);