From 6bec5c588f928d58d1910301b71bcab42443f45c Mon Sep 17 00:00:00 2001 From: Tomasz Fijalkowski Date: Tue, 4 Sep 2018 11:09:11 +0200 Subject: [PATCH 01/16] Added suits enumerator --- src/com/codecool/klondike/Card.java | 12 ++++++------ src/com/codecool/klondike/Suits.java | 8 ++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 src/com/codecool/klondike/Suits.java diff --git a/src/com/codecool/klondike/Card.java b/src/com/codecool/klondike/Card.java index 896f1fb..d535036 100644 --- a/src/com/codecool/klondike/Card.java +++ b/src/com/codecool/klondike/Card.java @@ -98,24 +98,24 @@ public static List createNewDeck() { public static void loadCardImages() { cardBackImage = new Image("card_images/card_back.png"); - String suitName = ""; + Suits suitName = null; for (int suit = 1; suit < 5; suit++) { switch (suit) { case 1: - suitName = "hearts"; + suitName = Suits.HEARTS; break; case 2: - suitName = "diamonds"; + suitName = Suits.DIAMONDS; break; case 3: - suitName = "spades"; + suitName = Suits.SPADES; break; case 4: - suitName = "clubs"; + suitName = Suits.CLUBS; break; } for (int rank = 1; rank < 14; rank++) { - String cardName = suitName + rank; + String cardName = suitName.name() + rank; String cardId = "S" + suit + "R" + rank; String imageFileName = "card_images/" + cardName + ".png"; cardFaceImages.put(cardId, new Image(imageFileName)); diff --git a/src/com/codecool/klondike/Suits.java b/src/com/codecool/klondike/Suits.java new file mode 100644 index 0000000..0fb0cf4 --- /dev/null +++ b/src/com/codecool/klondike/Suits.java @@ -0,0 +1,8 @@ +package com.codecool.klondike; + +public enum Suits { + HEARTS, + DIAMONDS, + SPADES, + CLUBS +} From 2360b734f0320b5b6d7b3a5b36aff6f0413cf172 Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Tue, 4 Sep 2018 11:17:06 +0200 Subject: [PATCH 02/16] shuffling cards --- src/com/codecool/klondike/Card.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/codecool/klondike/Card.java b/src/com/codecool/klondike/Card.java index 896f1fb..5a96003 100644 --- a/src/com/codecool/klondike/Card.java +++ b/src/com/codecool/klondike/Card.java @@ -93,9 +93,12 @@ public static List createNewDeck() { result.add(new Card(suit, rank, true)); } } + + Collections.shuffle(result); return result; } + public static void loadCardImages() { cardBackImage = new Image("card_images/card_back.png"); String suitName = ""; From af391899d9f9d5286ef04ffd8fe1554e79ae3e6e Mon Sep 17 00:00:00 2001 From: Ewelina Kijanowska Date: Tue, 4 Sep 2018 13:41:08 +0200 Subject: [PATCH 03/16] dealing cards on tableau --- src/com/codecool/klondike/Game.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 32963d7..327a8db 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -21,6 +21,8 @@ public class Game extends Pane { private List deck = new ArrayList<>(); + private final int PILES_NUM = 7; + private Pile stockPile; private Pile discardPile; private List foundationPiles = FXCollections.observableArrayList(); @@ -114,6 +116,7 @@ public boolean isMoveValid(Card card, Pile destPile) { //TODO return true; } + private Pile getValidIntersectingPile(Card card, List piles) { Pile result = null; for (Pile pile : piles) { @@ -170,7 +173,7 @@ private void initPiles() { foundationPiles.add(foundationPile); getChildren().add(foundationPile); } - for (int i = 0; i < 7; i++) { + for (int i = 0; i < PILES_NUM; i++) { Pile tableauPile = new Pile(Pile.PileType.TABLEAU, "Tableau " + i, TABLEAU_GAP); tableauPile.setBlurredBackground(); tableauPile.setLayoutX(95 + i * 180); @@ -181,14 +184,24 @@ private void initPiles() { } public void dealCards() { + Iterator deckIterator = deck.iterator(); - //TODO + Iterator deckIterator1 = deck.iterator(); + deckIterator.forEachRemaining(card -> { - stockPile.addCard(card); addMouseEventHandlers(card); getChildren().add(card); }); + for (int i = 0; i < PILES_NUM; i++) { + for (int j = 0; j < i + 1; j++) { + tableauPiles.get(i).addCard(deckIterator1.next()); + } + tableauPiles.get(i).getTopCard().flip(); + } + + deckIterator1.forEachRemaining(card -> stockPile.addCard(card)); + } public void setTableBackground(Image tableBackground) { From e422609e75ab6db55ff82bf7bffc326e85615701 Mon Sep 17 00:00:00 2001 From: Tomasz Fijalkowski Date: Tue, 4 Sep 2018 14:29:50 +0200 Subject: [PATCH 04/16] Converted card ranks and suits to enumerators --- src/com/codecool/klondike/Card.java | 37 +++++++++------------------- src/com/codecool/klondike/Game.java | 10 ++++++++ src/com/codecool/klondike/Ranks.java | 27 ++++++++++++++++++++ src/com/codecool/klondike/Suits.java | 18 +++++++++++--- 4 files changed, 63 insertions(+), 29 deletions(-) create mode 100644 src/com/codecool/klondike/Ranks.java diff --git a/src/com/codecool/klondike/Card.java b/src/com/codecool/klondike/Card.java index d535036..f24b709 100644 --- a/src/com/codecool/klondike/Card.java +++ b/src/com/codecool/klondike/Card.java @@ -9,8 +9,8 @@ public class Card extends ImageView { - private int suit; - private int rank; + private Suits suit; + private Ranks rank; private boolean faceDown; private Image backFace; @@ -23,7 +23,7 @@ public class Card extends ImageView { public static final int WIDTH = 150; public static final int HEIGHT = 215; - public Card(int suit, int rank, boolean faceDown) { + public Card(Suits suit, Ranks rank, boolean faceDown) { this.suit = suit; this.rank = rank; this.faceDown = faceDown; @@ -34,11 +34,11 @@ public Card(int suit, int rank, boolean faceDown) { setEffect(dropShadow); } - public int getSuit() { + public Suits getSuit() { return suit; } - public int getRank() { + public Ranks getRank() { return rank; } @@ -88,8 +88,8 @@ public static boolean isSameSuit(Card card1, Card card2) { public static List createNewDeck() { List result = new ArrayList<>(); - for (int suit = 1; suit < 5; suit++) { - for (int rank = 1; rank < 14; rank++) { + for (Suits suit : Suits.values()) { + for (Ranks rank : Ranks.values()) { result.add(new Card(suit, rank, true)); } } @@ -98,24 +98,11 @@ public static List createNewDeck() { public static void loadCardImages() { cardBackImage = new Image("card_images/card_back.png"); - Suits suitName = null; - for (int suit = 1; suit < 5; suit++) { - switch (suit) { - case 1: - suitName = Suits.HEARTS; - break; - case 2: - suitName = Suits.DIAMONDS; - break; - case 3: - suitName = Suits.SPADES; - break; - case 4: - suitName = Suits.CLUBS; - break; - } - for (int rank = 1; rank < 14; rank++) { - String cardName = suitName.name() + rank; + for (Suits suit : Suits.values()) { + String suitName = suit.getName(); + for (Ranks rank : Ranks.values()) { + String rankNumber = rank.getNumber(); + String cardName = suitName + rankNumber; String cardId = "S" + suit + "R" + rank; String imageFileName = "card_images/" + cardName + ".png"; cardFaceImages.put(cardId, new Image(imageFileName)); diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 32963d7..d2c140f 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -112,6 +112,16 @@ public void refillStockFromDiscard() { public boolean isMoveValid(Card card, Pile destPile) { //TODO + if (destPile.getPileType().equals(Pile.PileType.TABLEAU)){ + System.out.println("TABLEAU"); + return true; + + } + + if (destPile.getPileType().equals(Pile.PileType.FOUNDATION)){ + System.out.println("FOUNDATION"); + return true; + } return true; } private Pile getValidIntersectingPile(Card card, List piles) { diff --git a/src/com/codecool/klondike/Ranks.java b/src/com/codecool/klondike/Ranks.java new file mode 100644 index 0000000..6a593b9 --- /dev/null +++ b/src/com/codecool/klondike/Ranks.java @@ -0,0 +1,27 @@ +package com.codecool.klondike; + +public enum Ranks { + ACE ("1"), + TWO ("2"), + THREE ("3"), + FOUR ("4"), + FIVE ("5"), + SIX ("6"), + SEVEN ("7"), + EIGHT ("8"), + NINE ("9"), + TEN ("10"), + JACK ("11"), + QUEEN ("12"), + KING ("13"); + + private final String number; + + Ranks(String text) { + this.number = text; + } + + public String getNumber() { + return this.number; + } +} diff --git a/src/com/codecool/klondike/Suits.java b/src/com/codecool/klondike/Suits.java index 0fb0cf4..28f7715 100644 --- a/src/com/codecool/klondike/Suits.java +++ b/src/com/codecool/klondike/Suits.java @@ -1,8 +1,18 @@ package com.codecool.klondike; public enum Suits { - HEARTS, - DIAMONDS, - SPADES, - CLUBS + HEARTS ("hearts"), + DIAMONDS ("diamonds"), + SPADES ("spades"), + CLUBS ("clubs"); + + private final String name; + + Suits(String text) { + this.name = text; + } + + public String getName() { + return this.name; + } } From e41817da37f482a39834432f57b44e347d16ef73 Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Tue, 4 Sep 2018 18:17:05 +0200 Subject: [PATCH 05/16] covered cards unundraggable --- src/com/codecool/klondike/Game.java | 34 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 327a8db..7334e5e 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -57,22 +57,25 @@ public class Game extends Pane { private EventHandler onMouseDraggedHandler = e -> { Card card = (Card) e.getSource(); - Pile activePile = card.getContainingPile(); - if (activePile.getPileType() == Pile.PileType.STOCK) - return; - double offsetX = e.getSceneX() - dragStartX; - double offsetY = e.getSceneY() - dragStartY; + if (isCardDraggable(card)) { - draggedCards.clear(); - draggedCards.add(card); + Pile activePile = card.getContainingPile(); + if (activePile.getPileType() == Pile.PileType.STOCK) + return; + double offsetX = e.getSceneX() - dragStartX; + double offsetY = e.getSceneY() - dragStartY; - card.getDropShadow().setRadius(20); - card.getDropShadow().setOffsetX(10); - card.getDropShadow().setOffsetY(10); + draggedCards.clear(); + draggedCards.add(card); - card.toFront(); - card.setTranslateX(offsetX); - card.setTranslateY(offsetY); + card.getDropShadow().setRadius(20); + card.getDropShadow().setOffsetX(10); + card.getDropShadow().setOffsetY(10); + + card.toFront(); + card.setTranslateX(offsetX); + card.setTranslateY(offsetY); + } }; private EventHandler onMouseReleasedHandler = e -> { @@ -112,6 +115,11 @@ public void refillStockFromDiscard() { System.out.println("Stock refilled from discard pile."); } + public boolean isCardDraggable(Card card) { + return !card.isFaceDown(); + } + + public boolean isMoveValid(Card card, Pile destPile) { //TODO return true; From f4db56e4942d4b9f4b49ca3e5d0cbc1e6208df4b Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Tue, 4 Sep 2018 20:31:20 +0200 Subject: [PATCH 06/16] cards at the top of tableau piles flip automatically --- src/com/codecool/klondike/Game.java | 5 ++++- src/com/codecool/klondike/Pile.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 7334e5e..2bccf0b 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -25,6 +25,7 @@ public class Game extends Pane { private Pile stockPile; private Pile discardPile; + private Pile activePile; private List foundationPiles = FXCollections.observableArrayList(); private List tableauPiles = FXCollections.observableArrayList(); @@ -59,7 +60,7 @@ public class Game extends Pane { Card card = (Card) e.getSource(); if (isCardDraggable(card)) { - Pile activePile = card.getContainingPile(); + activePile = card.getContainingPile(); if (activePile.getPileType() == Pile.PileType.STOCK) return; double offsetX = e.getSceneX() - dragStartX; @@ -83,9 +84,11 @@ public class Game extends Pane { return; Card card = (Card) e.getSource(); Pile pile = getValidIntersectingPile(card, tableauPiles); + Card cardToUncover = activePile.getSecondCard(); //TODO if (pile != null) { handleValidMove(card, pile); + cardToUncover.flip(); } else { draggedCards.forEach(MouseUtil::slideBack); draggedCards = null; diff --git a/src/com/codecool/klondike/Pile.java b/src/com/codecool/klondike/Pile.java index 46ea20f..7135f23 100644 --- a/src/com/codecool/klondike/Pile.java +++ b/src/com/codecool/klondike/Pile.java @@ -74,6 +74,13 @@ public Card getTopCard() { return cards.get(cards.size() - 1); } + public Card getSecondCard() { + if (cards.isEmpty()) + return null; + else + return cards.get(cards.size() - 2); + } + public void setBlurredBackground() { setPrefSize(Card.WIDTH, Card.HEIGHT); BackgroundFill backgroundFill = new BackgroundFill(Color.gray(0.0, 0.2), null, null); From 6d2e132861810384c314a9bd366f2e2d85d2fc7f Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Tue, 4 Sep 2018 21:03:14 +0200 Subject: [PATCH 07/16] cards flipping properly --- src/com/codecool/klondike/Game.java | 11 ++++++++--- src/com/codecool/klondike/Pile.java | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 2bccf0b..b126737 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -59,7 +59,6 @@ public class Game extends Pane { private EventHandler onMouseDraggedHandler = e -> { Card card = (Card) e.getSource(); if (isCardDraggable(card)) { - activePile = card.getContainingPile(); if (activePile.getPileType() == Pile.PileType.STOCK) return; @@ -83,12 +82,18 @@ public class Game extends Pane { if (draggedCards.isEmpty()) return; Card card = (Card) e.getSource(); + Pile pile = getValidIntersectingPile(card, tableauPiles); - Card cardToUncover = activePile.getSecondCard(); + //TODO if (pile != null) { + if (activePile.cards.size()>1){ + Card cardToUncover = activePile.getSecondCard(); + if (cardToUncover.isFaceDown()) { + cardToUncover.flip(); + } + } handleValidMove(card, pile); - cardToUncover.flip(); } else { draggedCards.forEach(MouseUtil::slideBack); draggedCards = null; diff --git a/src/com/codecool/klondike/Pile.java b/src/com/codecool/klondike/Pile.java index 7135f23..b797b1c 100644 --- a/src/com/codecool/klondike/Pile.java +++ b/src/com/codecool/klondike/Pile.java @@ -16,7 +16,7 @@ public class Pile extends Pane { private PileType pileType; private String name; private double cardGap; - private ObservableList cards = FXCollections.observableArrayList(); + protected ObservableList cards = FXCollections.observableArrayList(); public Pile(PileType pileType, String name, double cardGap) { this.pileType = pileType; From 729569b0bea340c3dcde52aafdfe14ad8f85697c Mon Sep 17 00:00:00 2001 From: Ewelina Kijanowska Date: Tue, 4 Sep 2018 21:58:38 +0200 Subject: [PATCH 08/16] code refactor and card drop bugfix --- src/com/codecool/klondike/Game.java | 44 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 327a8db..8c2fecd 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -19,7 +19,7 @@ public class Game extends Pane { - private List deck = new ArrayList<>(); + private List deck; private final int PILES_NUM = 7; @@ -76,16 +76,16 @@ public class Game extends Pane { }; private EventHandler onMouseReleasedHandler = e -> { - if (draggedCards.isEmpty()) - return; - Card card = (Card) e.getSource(); - Pile pile = getValidIntersectingPile(card, tableauPiles); - //TODO - if (pile != null) { - handleValidMove(card, pile); - } else { - draggedCards.forEach(MouseUtil::slideBack); - draggedCards = null; + if (!draggedCards.isEmpty()) { + Card card = (Card) e.getSource(); + Pile pile = getValidIntersectingPile(card, tableauPiles); + //TODO + if (pile != null) { + handleValidMove(card, pile); + } else { + draggedCards.forEach(c -> MouseUtil.slideBack(c)); + draggedCards.clear(); + } } }; @@ -97,9 +97,17 @@ public boolean isGameWon() { public Game() { deck = Card.createNewDeck(); initPiles(); + setupCards(); dealCards(); } + private void setupCards() { + deck.forEach(card -> { + addMouseEventHandlers(card); + getChildren().add(card); + }); + } + public void addMouseEventHandlers(Card card) { card.setOnMousePressed(onMousePressedHandler); card.setOnMouseDragged(onMouseDraggedHandler); @@ -184,24 +192,14 @@ private void initPiles() { } public void dealCards() { - Iterator deckIterator = deck.iterator(); - Iterator deckIterator1 = deck.iterator(); - - deckIterator.forEachRemaining(card -> { - addMouseEventHandlers(card); - getChildren().add(card); - }); - for (int i = 0; i < PILES_NUM; i++) { for (int j = 0; j < i + 1; j++) { - tableauPiles.get(i).addCard(deckIterator1.next()); + tableauPiles.get(i).addCard(deckIterator.next()); } tableauPiles.get(i).getTopCard().flip(); } - - deckIterator1.forEachRemaining(card -> stockPile.addCard(card)); - + deckIterator.forEachRemaining(card -> stockPile.addCard(card)); } public void setTableBackground(Image tableBackground) { From 69287bc4907f07976f47e0f817e0ca63f6109dcd Mon Sep 17 00:00:00 2001 From: Tomasz Fijalkowski Date: Wed, 5 Sep 2018 02:09:47 +0200 Subject: [PATCH 09/16] Added getColour() to Suits --- src/com/codecool/klondike/Suits.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/codecool/klondike/Suits.java b/src/com/codecool/klondike/Suits.java index 28f7715..d12d203 100644 --- a/src/com/codecool/klondike/Suits.java +++ b/src/com/codecool/klondike/Suits.java @@ -15,4 +15,12 @@ public enum Suits { public String getName() { return this.name; } + + public String getColour() { + if (this.name == "hearts" || this.name == "diamonds"){ + return "red"; + } else { + return "black"; + } + } } From f15351fd3c4d70c8f7b496d0e07612c10226d01e Mon Sep 17 00:00:00 2001 From: Tomasz Fijalkowski Date: Wed, 5 Sep 2018 02:10:12 +0200 Subject: [PATCH 10/16] Added Tableau placing validation --- src/com/codecool/klondike/Card.java | 4 ++++ src/com/codecool/klondike/Game.java | 10 ++++++---- src/com/codecool/klondike/Pile.java | 3 +-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/com/codecool/klondike/Card.java b/src/com/codecool/klondike/Card.java index 9ece310..103a187 100644 --- a/src/com/codecool/klondike/Card.java +++ b/src/com/codecool/klondike/Card.java @@ -42,6 +42,10 @@ public Ranks getRank() { return rank; } + public int getRankNumber() { + return Integer.parseInt(rank.getNumber()); + } + public boolean isFaceDown() { return faceDown; } diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 5b5378f..4d8caf4 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -123,16 +123,18 @@ public void refillStockFromDiscard() { public boolean isMoveValid(Card card, Pile destPile) { //TODO if (destPile.getPileType().equals(Pile.PileType.TABLEAU)){ - System.out.println("TABLEAU"); - return true; - + boolean rankOneHigher = (card.getRankNumber() == destPile.getTopCard().getRankNumber()-1); + boolean oppositeColour = (!card.getSuit().getColour().equals(destPile.getTopCard().getSuit().getColour())); + boolean firstCase = (rankOneHigher && oppositeColour); + boolean secondCase = (destPile.isEmpty() && card.getRank().equals(Ranks.KING)); + return firstCase || secondCase; } if (destPile.getPileType().equals(Pile.PileType.FOUNDATION)){ System.out.println("FOUNDATION"); return true; } - return true; + return false; } private Pile getValidIntersectingPile(Card card, List piles) { diff --git a/src/com/codecool/klondike/Pile.java b/src/com/codecool/klondike/Pile.java index 46ea20f..64552b1 100644 --- a/src/com/codecool/klondike/Pile.java +++ b/src/com/codecool/klondike/Pile.java @@ -40,8 +40,7 @@ public ObservableList getCards() { } public int numOfCards() { - //TODO - return 1; + return cards.size(); } public boolean isEmpty() { From 39451c93110301b4300814ad0a510ef949eb1a8a Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Wed, 5 Sep 2018 09:58:12 +0200 Subject: [PATCH 11/16] flipping cards once again --- src/com/codecool/klondike/Game.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 29ff194..552d1b5 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -84,6 +84,12 @@ public class Game extends Pane { Pile pile = getValidIntersectingPile(card, tableauPiles); //TODO if (pile != null) { + if (activePile.cards.size()>1){ + Card cardToUncover = activePile.getSecondCard(); + if (cardToUncover.isFaceDown()) { + cardToUncover.flip(); + } + } handleValidMove(card, pile); } else { draggedCards.forEach(c -> MouseUtil.slideBack(c)); From 1d3a397a99863108f54586539e79c0814e158e4e Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Wed, 5 Sep 2018 10:13:49 +0200 Subject: [PATCH 12/16] a bit of refactoring --- src/com/codecool/klondike/Game.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 552d1b5..a4824ec 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -84,7 +84,7 @@ public class Game extends Pane { Pile pile = getValidIntersectingPile(card, tableauPiles); //TODO if (pile != null) { - if (activePile.cards.size()>1){ + if (isMoreThanOneCard()) { Card cardToUncover = activePile.getSecondCard(); if (cardToUncover.isFaceDown()) { cardToUncover.flip(); @@ -98,6 +98,11 @@ public class Game extends Pane { } }; + private boolean isMoreThanOneCard() { + return activePile.cards.size()>1; + } + + public boolean isGameWon() { //TODO return false; From 48e2e8f6d5f672653d71d196f31b3668eb796960 Mon Sep 17 00:00:00 2001 From: Ewelina Kijanowska Date: Wed, 5 Sep 2018 12:21:33 +0200 Subject: [PATCH 13/16] regulate placing cards on foundation piles --- src/com/codecool/klondike/Card.java | 2 +- src/com/codecool/klondike/Game.java | 46 +++++++++++++++++++---------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/com/codecool/klondike/Card.java b/src/com/codecool/klondike/Card.java index 103a187..d1ea5e7 100644 --- a/src/com/codecool/klondike/Card.java +++ b/src/com/codecool/klondike/Card.java @@ -116,5 +116,5 @@ public static void loadCardImages() { } } } - + } diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 552d1b5..6d37eac 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -81,11 +81,11 @@ public class Game extends Pane { private EventHandler onMouseReleasedHandler = e -> { if (!draggedCards.isEmpty()) { Card card = (Card) e.getSource(); - Pile pile = getValidIntersectingPile(card, tableauPiles); + Pile pile = getValidIntersectingPile(card, tableauPiles, foundationPiles); //TODO if (pile != null) { - if (activePile.cards.size()>1){ - Card cardToUncover = activePile.getSecondCard(); + if (activePile.cards.size() > 1) { + Card cardToUncover = activePile.getSecondCard(); if (cardToUncover.isFaceDown()) { cardToUncover.flip(); } @@ -133,27 +133,40 @@ public boolean isCardDraggable(Card card) { return !card.isFaceDown(); } - public boolean isMoveValid(Card card, Pile destPile) { - //TODO - if (destPile.getPileType().equals(Pile.PileType.TABLEAU)){ - boolean rankOneHigher = (card.getRankNumber() == destPile.getTopCard().getRankNumber()-1); + + //wyrzucic calosc do logiki START + if (destPile.getPileType().equals(Pile.PileType.TABLEAU)) { + boolean rankOneHigher = (!destPile.isEmpty() && card.getRankNumber() == destPile.getTopCard().getRankNumber() - 1); boolean oppositeColour = (!card.getSuit().getColour().equals(destPile.getTopCard().getSuit().getColour())); boolean firstCase = (rankOneHigher && oppositeColour); - boolean secondCase = (destPile.isEmpty() && card.getRank().equals(Ranks.KING)); + boolean secondCase = canPutOnEmptyPlace(card, Ranks.KING, destPile); + return firstCase || secondCase; } - if (destPile.getPileType().equals(Pile.PileType.FOUNDATION)){ - System.out.println("FOUNDATION"); - return true; + if (destPile.getPileType().equals(Pile.PileType.FOUNDATION)) { + return canPutOnEmptyPlace(card, Ranks.ACE, destPile) && hasSameSuitAndIsHigher(card, destPile); + } return false; } - private Pile getValidIntersectingPile(Card card, List piles) { + private boolean hasSameSuitAndIsHigher(Card card, Pile destPile) { + return !destPile.isEmpty() && destPile.getTopCard().getSuit().equals(card.getSuit()) + && destPile.getTopCard().getRankNumber() + 1 == card.getRankNumber(); + } + + private boolean canPutOnEmptyPlace(Card card, Ranks cardRank, Pile destPile) { + return destPile.isEmpty() && card.getRank().equals(cardRank); + } + + private Pile getValidIntersectingPile(Card card, List tableauPiles, List foundationPiles) { Pile result = null; - for (Pile pile : piles) { + List allPiles = new ArrayList<>(tableauPiles); + allPiles.addAll(foundationPiles); + + for (Pile pile : allPiles) { if (!pile.equals(card.getContainingPile()) && isOverPile(card, pile) && isMoveValid(card, pile)) @@ -163,10 +176,12 @@ private Pile getValidIntersectingPile(Card card, List piles) { } private boolean isOverPile(Card card, Pile pile) { - if (pile.isEmpty()) + if (pile.isEmpty()) { return card.getBoundsInParent().intersects(pile.getBoundsInParent()); - else + } else { return card.getBoundsInParent().intersects(pile.getTopCard().getBoundsInParent()); + + } } private void handleValidMove(Card card, Pile destPile) { @@ -184,7 +199,6 @@ private void handleValidMove(Card card, Pile destPile) { draggedCards.clear(); } - private void initPiles() { stockPile = new Pile(Pile.PileType.STOCK, "Stock", STOCK_GAP); stockPile.setBlurredBackground(); From 78011aa1d6f490f24d48f8f4d58c521174a1e2ed Mon Sep 17 00:00:00 2001 From: EwelinaKi <36279088+EwelinaKi@users.noreply.github.com> Date: Wed, 5 Sep 2018 13:20:01 +0200 Subject: [PATCH 14/16] Update Game.java bug fix --- src/com/codecool/klondike/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index 6d37eac..c1dce3b 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -146,7 +146,7 @@ public boolean isMoveValid(Card card, Pile destPile) { } if (destPile.getPileType().equals(Pile.PileType.FOUNDATION)) { - return canPutOnEmptyPlace(card, Ranks.ACE, destPile) && hasSameSuitAndIsHigher(card, destPile); + return canPutOnEmptyPlace(card, Ranks.ACE, destPile) || hasSameSuitAndIsHigher(card, destPile); } return false; From 99eae4b1953ca7c0f8f1a9793d232f6800caecd0 Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Wed, 5 Sep 2018 15:20:53 +0200 Subject: [PATCH 15/16] flipping cards extracted to separate method --- src/com/codecool/klondike/Game.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index a4824ec..50225b2 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -84,6 +84,7 @@ public class Game extends Pane { Pile pile = getValidIntersectingPile(card, tableauPiles); //TODO if (pile != null) { + flipTopCard(); if (isMoreThanOneCard()) { Card cardToUncover = activePile.getSecondCard(); if (cardToUncover.isFaceDown()) { @@ -98,6 +99,15 @@ public class Game extends Pane { } }; + private void flipTopCard(){ + if (isMoreThanOneCard()) { + Card cardToUncover = activePile.getSecondCard(); + if (cardToUncover.isFaceDown()) { + cardToUncover.flip(); + } + } + } + private boolean isMoreThanOneCard() { return activePile.cards.size()>1; } From 24ce203ba285ca15b5d8efc9af9b36ec55e14e17 Mon Sep 17 00:00:00 2001 From: WeronikaDebowska Date: Thu, 6 Sep 2018 00:51:54 +0200 Subject: [PATCH 16/16] probably working gamelogic --- src/com/codecool/klondike/Game.java | 60 ++++++++++++++++++----------- src/com/codecool/klondike/Pile.java | 2 +- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/com/codecool/klondike/Game.java b/src/com/codecool/klondike/Game.java index d4e4f2f..efeab52 100644 --- a/src/com/codecool/klondike/Game.java +++ b/src/com/codecool/klondike/Game.java @@ -43,28 +43,30 @@ public class Game extends Pane { private EventHandler onMouseClickedHandler = e -> { Card card = (Card) e.getSource(); activePile = card.getContainingPile(); - if (firstClickedTarget == card) { - System.out.println("double click"); - for (Pile pile : foundationPiles) { - if (isMoveValid(card, pile)) { + if (isCardDraggable(card)){ + if (firstClickedTarget == card) { + System.out.println("double click"); + for (Pile pile : foundationPiles) { + if (isMoveValid(card, pile)) { - card.moveToPile(pile); + card.moveToPile(pile); + } + } + if (activePile.getTopCard().isFaceDown()){ + activePile.getTopCard().flip(); } + firstClickedTarget = null; } - if (activePile.getTopCard().isFaceDown()){ - activePile.getTopCard().flip(); + // else { + firstClickedTarget = card; + System.out.println("one click"); + if (card.getContainingPile().getPileType() == Pile.PileType.STOCK) { + card.moveToPile(discardPile); + card.flip(); + card.setMouseTransparent(false); + System.out.println("Placed " + card + " to the waste."); + // } } - firstClickedTarget = null; - } -// else { - firstClickedTarget = card; - System.out.println("one click"); - if (card.getContainingPile().getPileType() == Pile.PileType.STOCK) { - card.moveToPile(discardPile); - card.flip(); - card.setMouseTransparent(false); - System.out.println("Placed " + card + " to the waste."); -// } } }; @@ -126,7 +128,9 @@ private void addToDraggedCards (double offsetX, double offsetY, Card card){ // if (isOnTableau() && (activePile.cards.size() > draggedCards.size())) { Card cardToUncover = activePile.cards.get(activePile.cards.size() - draggedCards.size() - 1); - cardToUncover.flip(); + if (cardToUncover.isFaceDown()) { + cardToUncover.flip(); + } } handleValidMove(card, pile); } else { @@ -176,9 +180,8 @@ public void refillStockFromDiscard() { Collections.reverse(cardsToInverse); stockPile.clear(); - for (int i = 0; i < cardsToInverse.size(); i++) { + for (Card card : cardsToInverse) { - Card card = cardsToInverse.get(i); card.flip(); stockPile.addCard(card); @@ -190,8 +193,19 @@ public void refillStockFromDiscard() { System.out.println("Stock refilled from discard pile."); } - public boolean isCardDraggable(Card card) { - return !card.isFaceDown(); + private boolean isCardDraggable(Card card) { + + boolean topStockCard = card == stockPile.getTopCard(); + boolean topDiscardCard = card == discardPile.getTopCard(); + boolean topCard = card == card.getContainingPile().getTopCard(); + boolean foundationCard = card.getContainingPile().getPileType().equals(Pile.PileType.FOUNDATION); + boolean tableauCard = card.getContainingPile().getPileType().equals(Pile.PileType.TABLEAU); + boolean uncoveredCard = !card.isFaceDown(); + System.out.println(topStockCard); + System.out.println(); + System.out.println(tableauCard); + System.out.println(uncoveredCard); + return tableauCard && uncoveredCard || foundationCard && topCard || topStockCard || topDiscardCard; } public boolean isMoveValid(Card card, Pile destPile) { diff --git a/src/com/codecool/klondike/Pile.java b/src/com/codecool/klondike/Pile.java index fd72b82..7d9ed11 100644 --- a/src/com/codecool/klondike/Pile.java +++ b/src/com/codecool/klondike/Pile.java @@ -48,7 +48,7 @@ public boolean isEmpty() { } public void clear() { - //TODO + cards.clear(); } public void addCard(Card card) {