import java.io.*; import java.util.*; public class Table { private static final boolean DEBUG=true; public static class Waste extends Pile { public String toString() { String s = ""; for (int i=0; i<3 && i 0) return "Stock available"; else return "Stock is empty"; } public Stock(List l) { super(l); } } public static class Foundation extends Pile { char suit; public Foundation(char suit) { super(); this.suit = suit; } public void addTop(Card c) { if (c.suitToChar() == suit) super.addTop(c); else throw new RuntimeException("Cannot place "+c+" on "+suit+" foundation"); } } public static class Tableau extends Pile { int visibleTo; public Tableau(List l) { super(l); visibleTo = 1; } public String toString() { String s = ""; for (int i=l.size()-1; i>-1; i--) if (i < visibleTo) s += l.get(i) + " "; else s += "## "; return s.trim(); } } public static void move(Tableau src, Tableau dest, int n) { if (DEBUG) System.out.println("Taking "+n+" cards from "+src+" to "+dest); if (n > src.visibleTo || n < 1) return; if (dest.size() == 0 && !src.viewCard(n-1).isKing()) return; if (dest.size() > 0 && !src.viewCard(n-1).goesUnder(dest.viewCard(0))) return; dest.addTop(src.removeTop(n)); src.visibleTo -= n; if (src.visibleTo < 1 && src.size() > 0) src.visibleTo = 1; dest.visibleTo += n; } public static void move(Tableau src, Foundation dest) { if (src.size() < 1) return; if (dest.size() == 0 && !src.viewCard(0).isAce() ) return; if (dest.size() > 0 && !src.viewCard(0).goesOn(dest.viewCard(0))) return; dest.addTop(src.removeTop()); src.visibleTo -= 1; if (src.visibleTo < 1 && src.size() > 0) src.visibleTo = 1; } public static void move(Waste src, Tableau dest) { if (src.size() < 1) return; if (dest.size() == 0 && !src.viewCard(0).isKing()) return; if (dest.size() > 0 && !src.viewCard(0).goesUnder(dest.viewCard(0))) return; dest.addTop(src.removeTop()); dest.visibleTo += 1; } public static void move(Waste src, Foundation dest) { if (src.size() < 1) return; if (dest.size() == 0 && !src.viewCard(0).isAce() ) return; if (dest.size() > 0 && !src.viewCard(0).goesOn(dest.viewCard(0))) return; dest.addTop(src.removeTop()); } public static void open(Stock src, Waste dest) { if (src.size() == 0) src.addTop(dest.removeTop(dest.size())); for (int i=0; i<3 && i [move from waste to tableau pile n (1-7)]"); System.out.println("\tw f [move from waste to foundation"); System.out.println("\t f [move from tableau pile n (1-7) to foundation]"); System.out.println("\t [move c cards from tableau pile n (1-7) to pile m (1-7)]"); System.out.println("\tquit [end game]"); continue; } StringTokenizer st = new StringTokenizer(s); String tok = st.nextToken(); int spile,dpile,ncards; if (tok == null) { System.out.println("Unrecognized command, see help"); continue; } if (tok.equals("o")) { open(stock,waste); continue; } if (tok.equals("w")) { tok = st.nextToken(); if (tok.equals("f") && waste.size() > 0) { move(waste,foundation[waste.viewCard(0).suit()]); continue; } try { dpile = Integer.parseInt(tok)-1; } catch (Exception e) {continue;} move(waste,tableau[dpile]); System.out.println("Moved from waste to tableau pile #"+(dpile+1)); continue; } try { spile = Integer.parseInt(tok)-1; tok = st.nextToken();} catch (Exception e) {continue;} if (tok.equals("f") && tableau[spile].size() > 0) { move(tableau[spile],foundation[tableau[spile].viewCard(0).suit()]); continue; } try { dpile = Integer.parseInt(tok)-1; tok = st.nextToken(); } catch (Exception e) {continue;} try { ncards = Integer.parseInt(tok); } catch (Exception e) {continue;} move(tableau[spile],tableau[dpile],ncards); } } public static void main(String[] args) { Deck deck = new Deck(); deck.shuffle(12); for (int i=0; i