Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Landmark): Change CardSide attribute to flipped (boolean) #84

Merged
merged 2 commits into from
Aug 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/domain/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public Game(Bank bank, List<Player> players, List<Dice> 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() {
Expand Down
18 changes: 9 additions & 9 deletions src/main/java/domain/HandCard.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,24 @@

public class HandCard {
private Player player;
private final List<Establishment> ownedEstablishment = new ArrayList<>();
private final List<Landmark> ownedLandmark = Arrays.asList(new TrainStation(), new ShoppingMall(), new AmusementPark(), new RadioTower());
private final List<Establishment> establishments = new ArrayList<>();
private final List<Landmark> 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<Establishment> getOwnedEstablishment() {
return ownedEstablishment;
public List<Establishment> getEstablishments() {
return establishments;
}
public List<Landmark> getOwnedLandmark() {
return ownedLandmark;
public List<Landmark> getLandmarks() {
return landmarks;
}
public void setPlayer(Player player) {
this.player = player;
Expand Down
40 changes: 27 additions & 13 deletions src/main/java/domain/Player.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -26,12 +30,22 @@ public int getTotalCoin() {
return coins;
}

public List<Establishment> getOwnedEstablishment() {
return handCard.getOwnedEstablishment();
public List<Establishment> getEstablishments() {
return handCard.getEstablishments();
}

public List<Landmark> getOwnedLandmark() {
return handCard.getOwnedLandmark();
public List<Establishment> getEstablishments(CardType cardType) {
return handCard.getEstablishments().stream()
.filter(establishment -> establishment.getCardType().equals(CardType.CROP))
.collect(Collectors.toList());
}

public List<Landmark> getLandmarks() {
return handCard.getLandmarks();
}

public Landmark getLandmark(int index) {
return handCard.getLandmarks().get(index);
}

public void buyCard(Establishment card) {
Expand All @@ -54,12 +68,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;
})
Expand All @@ -86,9 +100,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) {
Expand All @@ -106,6 +120,6 @@ public Card getHandCard(int index) {

//購買紫色建築物時,判斷玩家手上是否已有相同建築物
private boolean hasTheSamePurpleCard(Establishment toBuyCard) {
return handCard.getOwnedEstablishment().contains(toBuyCard);
return handCard.getEstablishments().contains(toBuyCard);
}
}
2 changes: 1 addition & 1 deletion src/main/java/domain/card/establishment/CheeseFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ public FruitAndVegetableMarket() {
protected void doTakeEffect(Game game) {
// 當你自己骰出這個數字時,每擁有一張[CardType.CROP]的建築,就可以從銀行獲得2元。
if (isTurnPlayer(game, getOwner())) {
var cropCardCount = (int) getOwner().getOwnedEstablishment().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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
12 changes: 6 additions & 6 deletions src/main/java/domain/card/landmark/Landmark.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,26 @@
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) {

}
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;
}

}
10 changes: 5 additions & 5 deletions src/test/java/domain/GameTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,18 @@ private void assertOneBakeryAndOneWheatFieldAndFourLandmarkAndThreeCoins(Player

assertEquals(1, getEstablishmentCount(player, new WheatField()));

List<Landmark> ownedLandmark = player.getOwnedLandmark();
List<Landmark> 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();
}
}
}
19 changes: 10 additions & 9 deletions src/test/java/domain/PlayerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -56,15 +57,15 @@ void flipBackLandMark() {

//then
assertThat(player.getTotalCoin()).isEqualTo(originalBalanceOfPlayer - 16);
assertThat(player.getOwnedLandmark().get(2).getCardSide()).isEqualTo(Landmark.CardSide.FRONT);
assertTrue(player.getLandmark(2).isFlipped());
}

@Test
void flipFrontLandMark() {
//given 玩家有正面的主題樂園
var originalBalanceOfPlayer = player.getTotalCoin();
var amusementPark = new AmusementPark();
player.getOwnedLandmark().get(2).setCardSide(Landmark.CardSide.FRONT);
player.getLandmark(2).setFlipped(true);

//when
NoSuchElementException actualException = Assertions.assertThrows(NoSuchElementException.class,
Expand All @@ -80,17 +81,17 @@ void flipFrontLandMark() {
void givenPlayerNoHaveBusinessCenterWhenBuyTheSameCardThenSuccess() {
var businessCenter = new BusinessCenter();
//given 玩家沒有商業中心建築
List<Establishment> playerOriginalOwnedEstablishment = player.getOwnedEstablishment();
List<Establishment> playerOriginalOwnedEstablishment = player.getEstablishments();

Assertions.assertFalse(playerOriginalOwnedEstablishment.contains(businessCenter));

//when 玩家買下商業中心
player.buyCard(businessCenter);

//then 購買成功
List<Establishment> playerOwnedEstablishment = player.getOwnedEstablishment();
List<Establishment> playerOwnedEstablishment = player.getEstablishments();

Assertions.assertTrue(playerOwnedEstablishment.contains(businessCenter));
assertTrue(playerOwnedEstablishment.contains(businessCenter));
}

/*
Expand All @@ -103,19 +104,19 @@ void givenPlayerHaveBusinessCenterWhenBuyTheSameCardThenReject() {
var businessCenter = new BusinessCenter();
//given 玩家有商業中心建築
player.addCardToHandCard(businessCenter);
List<Establishment> playerOriginalOwnedEstablishment = player.getOwnedEstablishment();
List<Establishment> playerOriginalOwnedEstablishment = player.getEstablishments();

Assertions.assertTrue(playerOriginalOwnedEstablishment.contains(businessCenter));
assertTrue(playerOriginalOwnedEstablishment.contains(businessCenter));

//when 玩家買下商業中心
player.buyCard(businessCenter);

//then 購買失敗,只能擁有一座商業中心
List<Establishment> playerOwnedEstablishment = player.getOwnedEstablishment();
List<Establishment> playerOwnedEstablishment = player.getEstablishments();
long businessCenterCount = playerOwnedEstablishment
.stream()
.filter(card -> card.equals(businessCenter))
.count();
Assertions.assertEquals(businessCenterCount, 1);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -55,4 +55,4 @@ void takeEffectWithoutNatureResources() {
assertThat(balanceOfBank).isEqualTo(originalBalanceOfBank);
assertThat(balanceOfPlayer).isEqualTo(originalBalanceOfPlayer);
}
}
}