]> wirehaze git hosting - solitaire.git/commitdiff

wirehaze git hosting

add Foundation
authorphfr24 <phfr24@inf.ufpr.br>
Sun, 9 Aug 2026 19:33:44 +0000 (16:33 -0300)
committerphfr24 <phfr24@inf.ufpr.br>
Sun, 9 Aug 2026 19:33:44 +0000 (16:33 -0300)
src/solitaire/Card.java
src/solitaire/Foundation.java [new file with mode: 0644]
src/solitaire/Main.java
src/solitaire/Rank.java
src/solitaire/Stock.java
src/solitaire/Waste.java

index ec6efcfad09442b6eb63b897e9a61435270a7232..bace9aeaa2636f0c91301ad82762302eaa011200 100644 (file)
@@ -34,8 +34,8 @@ final class Card {
     @Override
     public String toString() {
        if (isHidden())
     @Override
     public String toString() {
        if (isHidden())
-           return "[ * ]";
+           return " * ";
 
 
-       return String.format("[%s%2s]", suit, rank);
+       return String.format("%s%2s", suit, rank);
     }
 }
     }
 }
diff --git a/src/solitaire/Foundation.java b/src/solitaire/Foundation.java
new file mode 100644 (file)
index 0000000..54d4162
--- /dev/null
@@ -0,0 +1,54 @@
+package solitaire;
+
+import java.util.LinkedList;
+import java.util.List;
+
+final class Foundation {
+    private final List<Card> cards;
+    private final Suit suit;
+
+    Foundation(Suit suit) {
+       this.cards = new LinkedList<>();
+       this.suit = suit;
+    }
+
+    Suit getSuit() {
+       return suit;
+    }
+
+    boolean isFull() {
+       return cards.size() == Rank.RANKS.size();
+    }
+
+    private boolean isValidNextCard(Card card) {
+       Rank cardRank, lastRank;
+
+       if (card.getSuit() != this.suit)
+           return false;
+
+       cardRank = card.getRank();
+
+       if (cards.isEmpty())
+           return cardRank == Rank.ACE;
+
+       lastRank = cards.getLast().getRank();
+
+       return cardRank.isSuccessorOf(lastRank);
+    }
+
+    boolean add(Card card) {
+       if (!isValidNextCard(card))
+           return false;
+
+       cards.add(card);
+       return true;
+    }
+
+    @Override
+    public String toString() {
+       if (cards.isEmpty())
+           return String.format("( %s )", suit);
+
+       return String.format("(%s)", cards.getLast());
+    }
+}
index 75d65d91e811a60512c809fd2c313dc5d003cf1b..18e5629ae26e12f83d83639463d8358877b42fd8 100644 (file)
@@ -3,9 +3,10 @@ package solitaire;
 class Main {
     private static Stock stock = new Stock();
     private static Waste waste = new Waste();
 class Main {
     private static Stock stock = new Stock();
     private static Waste waste = new Waste();
+    private static Foundation foundation = new Foundation(Suit.CLUBS);
 
     private static void printTable() {
 
     private static void printTable() {
-       System.out.printf("%s   %s\n", stock, waste);
+       System.out.printf("%s  %s\n\n%s\n\n", stock, waste, foundation);
     }
 
     public static void main(String[] args) {
     }
 
     public static void main(String[] args) {
@@ -16,7 +17,9 @@ class Main {
 
            c = stock.draw();
            c.reveal();
 
            c = stock.draw();
            c.reveal();
-           waste.add(c);
+
+           if (!foundation.add(c))
+               waste.add(c);
        }
 
        printTable();
        }
 
        printTable();
index 0bd1c2508d9ac77b5c29002b13e82ea4a3f949ee..f85d1d2713d2d6681901721482085d6484faa1c8 100644 (file)
@@ -14,6 +14,10 @@ enum Rank {
        this.symbol = symbol;
     }
 
        this.symbol = symbol;
     }
 
+    boolean isSuccessorOf(Rank rank) {
+       return this.ordinal() == rank.ordinal() + 1;
+    }
+
     @Override
     public String toString() {
        return symbol;
     @Override
     public String toString() {
        return symbol;
index 3f3a951e355e6bf2234d7eb577f871136db79b23..91907fbee4c4a2fe4109de47c040e0271a9112da 100644 (file)
@@ -30,6 +30,6 @@ final class Stock {
        if (isEmpty())
            return "{   }";
 
        if (isEmpty())
            return "{   }";
 
-       return "{ * }";
+       return String.format("{%s}", cards.getLast());
     }
 }
     }
 }
index 763fea9cd6ead3e523be57b4dd71bfa743ada70d..24ee6f5e7c61fbc34fb0077e77510c4c96617805 100644 (file)
@@ -28,6 +28,6 @@ final class Waste {
        if (isEmpty())
            return "{   }";
 
        if (isEmpty())
            return "{   }";
 
-       return cards.stream().map(String::valueOf).collect(Collectors.joining("", "{ ", " }"));
+       return cards.stream().map(String::valueOf).collect(Collectors.joining("|", "[", "]"));
     }
 }
     }
 }