import java.awt.*; public class spiderSolitareColumn extends spiderSolitarePack { private final Color clrSlotHolder = new Color(149, 146, 140); private Image imgCardBack = null; private spiderSolitarePaintInstruction paintInstruction = new spiderSolitarePaintInstruction(0,0); public spiderSolitareColumn (int startX, int startY) { this.startX = startX; this.startY = startY; } protected int getStartX () { return startX; } protected void setCardBackImage (Image imgCardBack) { this.imgCardBack = imgCardBack; } protected boolean isMouseOverColumn (int x, int y) { int colHeight = startY + 96; if (size() != 0) { colHeight = getHeight() + 30; } if ((x >= startX && x <= (startX + 71)) && (y >= startY && y <= colHeight)) //Check if mouse is in this column's card area { return true; } return false; } protected int cardMouseIsOver (int y) { int gap = startY; spiderSolitareCard currentCard = null; for (int card = 0; card < size(); card++) //Checks each card for which one the mouse was clicked/pressed { currentCard = (spiderSolitareCard)getCard(card); if (card == (size() - 1)) { if (y >= gap && y <= (gap + 96)) { return card; } } else if (currentCard.isFaceDown()) { if (y >= gap && y <= (gap + gapFaceDown)) { return card; } else { gap += gapFaceDown; } } else { if (y >= gap && y <= (gap + gapFaceUp)) { return card; } else { gap += gapFaceUp; } } } return -1; } protected boolean canFlipCard (int mouseOverCard) { if (mouseOverCard == -1) //Should never get this, but just in case { return false; } else if (mouseOverCard == (size() - 1)) //Check if it is the last card { spiderSolitareCard card = (spiderSolitareCard)getCard(mouseOverCard); //Gets a copy of the card if (card.isFaceDown()) //Checks if it is currently face down { card.setFaceDown(false); //Face up paintInstruction.setRect(startX, getHeight(mouseOverCard), 71, 96); return true; } } return false; } protected spiderSolitarePaintInstruction getPaintInstruction () { return paintInstruction; } public spiderSolitarePaintInstruction getDragStartInstruction (int dragCard) { return new spiderSolitarePaintInstruction(startX, getHeight(dragCard - 1), 71, getStackHeight(dragCard)); } protected boolean canBeDragged (int startCard) { if (startCard != -1) { spiderSolitareCard firstCard = (spiderSolitareCard)getCard(startCard); if (firstCard.isFaceDown()) { return false; } for (int card = (startCard + 1); card < size(); card++) //Checks any cards ahead of it { if (!ruleCanBeDragged((spiderSolitareCard)getCard(card - 1), (spiderSolitareCard)getCard(card))) { return false; } } return true; } return false; } protected boolean canBeDropped (spiderSolitareCard dragCard) { if (ruleCanBeDropped(dragCard, (spiderSolitareCard)getLastCard())) { return true; } return false; } protected void drawExtra (Graphics grpOffScreen) { if (size() == 0) //If the column is empty { grpOffScreen.setColor(clrSlotHolder); grpOffScreen.fillRect(startX, startY, 71, 96); //Makes a slot holder grpOffScreen.setColor(new Color(0,0,0)); //black grpOffScreen.drawRect(startX, startY, 71, 96); //Gives the holder a border } } protected Image getFaceDownImage () { return imgCardBack; } protected boolean ruleCanBeDragged (spiderSolitareCard previousCard, spiderSolitareCard currentCard) { if (currentCard.getRank() == (previousCard.getRank() - 1)) { return true; } return false; } protected boolean ruleCanBeDropped (spiderSolitareCard dragCard, spiderSolitareCard columnCard) { //Drag card is the top card in the drag stack, column card is the last card in the column if (dragCard.getRank() == (columnCard.getRank() - 1)) { return true; } return false; } protected boolean testFullDeck () //Tests if a full deck (ace - king, in the same colour) { if (size() < 13) //If the stack size is less then 13, a full deck is impossible { return false; } spiderSolitareCard previousCard = (spiderSolitareCard)getLastCard(); if (previousCard.getRank() != 0) //If the first card is not an ace { return false; } int cardIndex = size() - 2; spiderSolitareCard currentCard = null; for (int counter = 0; counter < 12; counter++) //Loop 12 times { currentCard = (spiderSolitareCard)getCard(cardIndex); if ((currentCard.getColour() != previousCard.getColour()) || (currentCard.getRank() != (previousCard.getRank() + 1))) { return false; } cardIndex--; previousCard = currentCard; } removeStack(size() - 13); return true; } }