Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
a93ae99
Add travis.yml
Sep 24, 2018
87bdb3e
Add badge
Sep 24, 2018
683ca55
add isOppositeColor method in Card and add comment to Game TODO isOpp…
Svetlanasyo Sep 26, 2018
c3a882b
Implement refill of stock from discard
declnix Sep 26, 2018
f5a24da
isMoveValid method
Svetlanasyo Sep 26, 2018
af2b5fd
Merge pull request #4 from AJuszczakiewicz/task-2/refill-stock-from-d…
Svetlanasyo Sep 26, 2018
f629a5d
Implement method which return count of card on pile
declnix Sep 26, 2018
91fb5cd
add methods clear
Svetlanasyo Sep 26, 2018
42a8d0b
Merge pull request #5 from AJuszczakiewicz/task-4/num-of-cards
Svetlanasyo Sep 26, 2018
5c38c62
Implement function to drag multiple cards at once
declnix Sep 26, 2018
4a769b4
Empty dragged container from left cards
declnix Sep 26, 2018
e9dc5e2
Merge branch 'features/fill-todos' into task-5/clearCards
declnix Sep 26, 2018
a8c0621
Merge pull request #2 from AJuszczakiewicz/task-1/isOppositeColor
declnix Sep 26, 2018
8ffa652
Merge branch 'features/fill-todos' into task-3/isMoveValid
declnix Sep 26, 2018
8066e82
Merge pull request #3 from AJuszczakiewicz/task-3/isMoveValid
declnix Sep 26, 2018
36694ec
Merge pull request #6 from AJuszczakiewicz/task-5/clearCards
declnix Sep 26, 2018
9ef0155
Fix missing return statement in isMoveValid
declnix Sep 26, 2018
a3ac030
Fix foudation piles blocking
declnix Sep 26, 2018
410e89e
Add travis.yml
Sep 24, 2018
954878b
Add travis.yml
Sep 24, 2018
63c55a7
Add travis.yml
Sep 24, 2018
f3c32b0
Merge branch 'features/fill-todos' into task-6/drag-multiple-cards-at…
declnix Sep 27, 2018
17b8a52
Merge pull request #7 from AJuszczakiewicz/task-6/drag-multiple-cards…
declnix Sep 27, 2018
a8c37cf
Implement undo mechanism to game
declnix Sep 27, 2018
4e777c9
add enum class Suit and change it in methods
Svetlanasyo Sep 27, 2018
996e694
Merge pull request #8 from AJuszczakiewicz/task-7/enumSuit
Svetlanasyo Sep 27, 2018
1a70b83
Implement mechanism which every move
declnix Sep 27, 2018
0251c07
Add invocation for which save move
declnix Sep 27, 2018
fed3948
Add dummy button for test
declnix Sep 27, 2018
3be6dae
Improve style add few blank lines
declnix Sep 27, 2018
2fd967b
Changed rank from int to enum type
Maretzky85 Sep 27, 2018
8fb80dd
Merge remote-tracking branch 'remotes/origin/features/enum' into task…
Maretzky85 Sep 27, 2018
afd202b
Merge pull request #9 from AJuszczakiewicz/features/fill-todos into d…
declnix Sep 27, 2018
b1b3e32
Merge remote-tracking branch 'remotes/origin/features/enum' into task…
Maretzky85 Sep 27, 2018
eeadbae
update
Maretzky85 Sep 27, 2018
c3d073b
Merge pull request #10 from AJuszczakiewicz/task-8/enum-rank
declnix Sep 27, 2018
c33c052
Add restart button
Sep 27, 2018
0d04cc4
Add clear Pane method, deletes elements from Pane/Scene
Sep 27, 2018
7cb0c20
Add restart method that clears Pane and initiate the game.
Sep 27, 2018
2aaaf02
Add mouse event handler for restart button
Sep 27, 2018
93be566
Shuffle the deck while creating new one (in createNewDeck method)
Sep 27, 2018
d62baed
Add beginning card distribution
Sep 27, 2018
2a00da5
Flip last card in pile during game start
Sep 27, 2018
9daa3c0
Fix last pile card flip
declnix Sep 27, 2018
cf9e061
Merge branch 'develop' into features/undo
declnix Sep 27, 2018
6fb9a6b
Merge pull request #11 from AJuszczakiewicz/features/undo into develop
declnix Sep 27, 2018
d679f81
Integrate branch features/enum with develop
declnix Sep 27, 2018
e77dc93
Merge branch 'develop' into features/enum
declnix Sep 27, 2018
80d6407
Merge pull request #13 from AJuszczakiewicz/features/enum into develop
declnix Sep 27, 2018
a12bda3
Merge pull request #15 from AJuszczakiewicz/shuffle-deck into develop
declnix Sep 27, 2018
13bea97
Merge branch 'develop' into deal-cards
declnix Sep 27, 2018
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
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
language: java
script:
- javac src/com/codecool/klondike/*.java
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Klondike Solitaire

[![Build Status](https://travis-ci.org/AJuszczakiewicz/javase-klondike-solitaire-kosteczki.svg?branch=master)](https://travis-ci.org/AJuszczakiewicz/javase-klondike-solitaire-kosteczki)

A Klondike Solitaire game written in Java using JavaFX as a GUI.

### Rules of the game
Expand Down
57 changes: 25 additions & 32 deletions src/com/codecool/klondike/Card.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@

import java.util.*;

import static java.util.Collections.*;

public class Card extends ImageView {

private int suit;
private int rank;
private Suit suit;
private Rank rank;
private boolean faceDown;

private Image backFace;
Expand All @@ -23,7 +25,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(Suit suit, Rank rank, boolean faceDown) {
this.suit = suit;
this.rank = rank;
this.faceDown = faceDown;
Expand All @@ -34,11 +36,11 @@ public Card(int suit, int rank, boolean faceDown) {
setEffect(dropShadow);
}

public int getSuit() {
public Suit getSuit() {
return suit;
}

public int getRank() {
public Rank getRank() {
return rank;
}

Expand All @@ -47,7 +49,7 @@ public boolean isFaceDown() {
}

public String getShortName() {
return "S" + suit + "R" + rank;
return "S" + suit.getValue() + "R" + rank.getValue();
}

public DropShadow getDropShadow() {
Expand Down Expand Up @@ -78,8 +80,10 @@ public String toString() {
}

public static boolean isOppositeColor(Card card1, Card card2) {
//TODO
return true;
if (card1.suit.getValue() <= 2 && card2.suit.getValue() > 2)
return true;

return false;
}

public static boolean isSameSuit(Card card1, Card card2) {
Expand All @@ -88,39 +92,28 @@ public static boolean isSameSuit(Card card1, Card card2) {

public static List<Card> createNewDeck() {
List<Card> result = new ArrayList<>();
for (int suit = 1; suit < 5; suit++) {
for (int rank = 1; rank < 14; rank++) {
result.add(new Card(suit, rank, true));

//Zamienic for na for generyczny
for (Suit suit : Suit.values()) {
for (Rank cardRank: Rank.values()){
result.add(new Card(suit, cardRank, true));
}
}
Collections.shuffle(result);
return result;
}


public static void loadCardImages() {
cardBackImage = new Image("card_images/card_back.png");
String suitName = "";
for (int suit = 1; suit < 5; suit++) {
switch (suit) {
case 1:
suitName = "hearts";
break;
case 2:
suitName = "diamonds";
break;
case 3:
suitName = "spades";
break;
case 4:
suitName = "clubs";
break;
}
for (int rank = 1; rank < 14; rank++) {
String cardName = suitName + rank;
String cardId = "S" + suit + "R" + rank;
for (Suit suit : Suit.values()) {
for (Rank cardRank: Rank.values()){
String cardName = suit.getTextName() + cardRank.getValue();
String cardId = "S" + suit.getValue() + "R" + cardRank.getValue();
String imageFileName = "card_images/" + cardName + ".png";
System.out.println(imageFileName);
cardFaceImages.put(cardId, new Image(imageFileName));
}
}
}

}
}
141 changes: 126 additions & 15 deletions src/com/codecool/klondike/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import javafx.collections.ListChangeListener;
import javafx.event.EventHandler;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Background;
Expand All @@ -12,10 +13,10 @@
import javafx.scene.layout.BackgroundRepeat;
import javafx.scene.layout.BackgroundSize;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.TextAlignment;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.*;

public class Game extends Pane {

Expand All @@ -37,6 +38,8 @@ public class Game extends Pane {
private EventHandler<MouseEvent> onMouseClickedHandler = e -> {
Card card = (Card) e.getSource();
if (card.getContainingPile().getPileType() == Pile.PileType.STOCK) {
saveMove(card);

card.moveToPile(discardPile);
card.flip();
card.setMouseTransparent(false);
Expand All @@ -62,28 +65,39 @@ public class Game extends Pane {
double offsetY = e.getSceneY() - dragStartY;

draggedCards.clear();
draggedCards.add(card);
int draggedCardIndex = activePile.getCards().indexOf(card);

activePile.getCards().listIterator(draggedCardIndex)
.forEachRemaining(draggedCards::add);

card.getDropShadow().setRadius(20);
card.getDropShadow().setOffsetX(10);
card.getDropShadow().setOffsetY(10);
draggedCards.forEach(draggedCard -> {
draggedCard.getDropShadow().setRadius(20);
draggedCard.getDropShadow().setOffsetX(10);
draggedCard.getDropShadow().setOffsetY(10);

card.toFront();
card.setTranslateX(offsetX);
card.setTranslateY(offsetY);
draggedCard.toFront();
draggedCard.setTranslateX(offsetX);
draggedCard.setTranslateY(offsetY);
});
};

private EventHandler<MouseEvent> onMouseReleasedHandler = e -> {
if (draggedCards.isEmpty())
return;
Card card = (Card) e.getSource();
Pile pile = getValidIntersectingPile(card, tableauPiles);
if(pile == null) {
pile = getValidIntersectingPile(card, foundationPiles);
}
//TODO
if (pile != null) {
saveMove(card);

//TODO isOpositeColor
handleValidMove(card, pile);
} else {
draggedCards.forEach(MouseUtil::slideBack);
draggedCards = null;
draggedCards.removeAll(draggedCards);
}
};

Expand All @@ -96,6 +110,21 @@ public Game() {
deck = Card.createNewDeck();
initPiles();
dealCards();

addRestartBtn();

// ======= Added dummy for test ===============
Button button = new Button();
button.setText("Undo");
button.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Undoer.getInstance().undoAction();
}
});
// ============================================

getChildren().add(button);
}

public void addMouseEventHandlers(Card card) {
Expand All @@ -106,13 +135,23 @@ public void addMouseEventHandlers(Card card) {
}

public void refillStockFromDiscard() {
//TODO
Collections.reverse(discardPile.getCards());
discardPile.getCards().forEach(card -> card.flip());

MouseUtil.slideToDest(discardPile.getCards(), stockPile);

System.out.println("Stock refilled from discard pile.");
}

public boolean isMoveValid(Card card, Pile destPile) {
//TODO
return true;
if (foundationPiles.contains(destPile)) {
System.out.println("asdasd");
return true;
}
else if (tableauPiles.contains(destPile))
return true;

return false;
}
private Pile getValidIntersectingPile(Card card, List<Pile> piles) {
Pile result = null;
Expand Down Expand Up @@ -143,10 +182,38 @@ private void handleValidMove(Card card, Pile destPile) {
msg = String.format("Placed %s to %s.", card, destPile.getTopCard());
}
System.out.println(msg);

MouseUtil.slideToDest(draggedCards, destPile);

draggedCards.clear();
}

private void saveMove(Card card) {
List<Card> copyOfDraggedList = FXCollections.observableArrayList(draggedCards);
Pile sourcePile = card.getContainingPile();
Runnable move;

if (card.getContainingPile().getPileType() == Pile.PileType.STOCK) {
move = () -> {
card.moveToPile(sourcePile);
card.flip();
};
}
else {
Boolean isLastCardFaceDown = sourcePile.getTopCard().isFaceDown();
Card saveLastCardFromPile = sourcePile.getTopCard();
move = () -> {
if(isLastCardFaceDown) {
saveLastCardFromPile.flip();
}

MouseUtil.slideToDest(copyOfDraggedList, sourcePile);
};
}

Undoer.getInstance().addAction(Undoer.ActionOwner.USER, move);
}


private void initPiles() {
stockPile = new Pile(Pile.PileType.STOCK, "Stock", STOCK_GAP);
Expand Down Expand Up @@ -180,9 +247,53 @@ private void initPiles() {
}
}

private void addRestartBtn(){
Button restartBtn = new Button("Restart");
restartBtn.setTextAlignment(TextAlignment.CENTER);
restartBtn.relocate(1300,840);
restartBtn.setStyle("-fx-font: 18 times-new-roman; -fx-base: #c26573;");
getChildren().add(restartBtn);

restartBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
restart();
}
});
}
private void clearPane() {
stockPile.clear();
discardPile.clear();
foundationPiles.clear();
tableauPiles.clear();
this.getChildren().clear();
}

private void restart() {
clearPane();
deck = Card.createNewDeck();
initPiles();
dealCards();
addRestartBtn();
}

public void dealCards() {
Iterator<Card> deckIterator = deck.iterator();
//TODO

for (Pile pile: tableauPiles) {
int index = tableauPiles.indexOf(pile);

for(int i = 0; i < index+1; i++){
Card card = deckIterator.next();
pile.addCard(card);
addMouseEventHandlers(card);
getChildren().add(card);
if(i==index){
card.flip();
}
}
}

deckIterator.forEachRemaining(card -> {
stockPile.addCard(card);
addMouseEventHandlers(card);
Expand Down
5 changes: 2 additions & 3 deletions src/com/codecool/klondike/Pile.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,15 @@ public ObservableList<Card> getCards() {
}

public int numOfCards() {
//TODO
return 1;
return cards.size();
}

public boolean isEmpty() {
return cards.isEmpty();
}

public void clear() {
//TODO
cards.removeAll(cards);
}

public void addCard(Card card) {
Expand Down
Loading