public void undo() { if (moveHistory.size() > 0) { unmove((Move) moveHistory.lastElement()); moveHistory.removeElement(moveHistory.lastElement()); } else { controller.alert("You haven't made any moves yet!"); } }
public void checkWin() { int homestack = PLAYSTACKLENGTH + CELLSTACKLENGTH; for (int i = homestack; i < homestack + HOMESTACKLENGTH; i++) { if (stacks[i].getSize() < 13) { return; } } controller.winGame(); }
public void unmove(Move move) { try { Card theCard = stacks[move.getTo()].getTopCard(); stacks[move.getFrom()].deal(theCard); stacks[move.getTo()].pop(); } catch (Exception e) { controller.alert("Sorry, I guess you're outta luck."); } this.repaint(); }
public void testRandomMovements() { try { Random generator = new Random(); int fromStack = 0; int toStack = 0; // Make sure we don't go from/to the same stack. while (fromStack == toStack) { fromStack = generator.nextInt(stacks.length); toStack = generator.nextInt(stacks.length); } stacks[toStack].push(stacks[fromStack].pop()); } catch (Exception e) { controller.alert(e.getMessage()); } this.repaint(); }
private void populatePlayArea(Deck deck) { // Retrieve cards from the deck and populate the play area. /* * Used for debugging playstack drawing. * * for (int i=0; i<13; i++) { Card tempCard = deck.popRandom(); stacks[0].deal(tempCard); } for (int i=0; i<12; i++) { Card tempCard = deck.popRandom(); stacks[1].deal(tempCard); } for (int i=0; i<11; i++) { Card tempCard = deck.popRandom(); stacks[2].deal(tempCard); } for (int i=0; i<10; i++) { Card tempCard = deck.popRandom(); stacks[3].deal(tempCard); } for (int i=0; i<6; i++) { Card tempCard = deck.popRandom(); stacks[4].deal(tempCard); }*/ int stackNum = 0; int deckSize = deck.length(); for (int i = 0; i < deckSize; i++) { try { Card tempCard = deck.popRandom(); stacks[stackNum].deal(tempCard); } catch (Exception e) { controller.alert(e.getMessage()); } if (stackNum == 7) { stackNum = 0; } else { stackNum++; } } // Now the deck is empty. }
public void autoHome() { boolean found = true; // Set once for the beginning. while (found) { // As long as we found something on a previous pass, keep trying. found = false; // TODO: Search cellstacks as well. I got arrayIndexOutOfBounds before, because it overstepped // some boundary. for (int i = 0; i < PLAYSTACKLENGTH; i++) { if (stacks[i].hasCards()) { Card theCard = stacks[i].getTopCard(); int homeStack = findHome(theCard); if (homeStack > -1) { found = true; Move move = new Move(i, homeStack, this); try { move.execute(); addToHistory(move); } catch (Exception e) { controller.alert(e.getMessage()); } } } } } }
protected void keyPressed(int keyCode) { int selectionLocation = getSelectionLocation(); // Selection buttons if ((keyCode == KEY_NUM4) || (keyCode == -3) || (keyCode == LEFT)) { // NUM4, left, bbtrackball left gotoPrevious(); } else if ((keyCode == KEY_NUM6) || (keyCode == -4) || (keyCode == RIGHT)) { // NUM5, right, bbtrackball right gotoNext(); // Action buttons } else if ((keyCode == -5) || (keyCode == FIRE) || (keyCode == -8) || (keyCode == 10)) { // Emulator OK, FIRE, bbtrackball click, keyboard return if (selectionLocation > -1) { if (selectionLocation == cursorLocation) { // Selecting the same card that's already selected try { // Toggle selection stacks[selectionLocation].unselect(); } catch (Exception e) { controller.alert(e.getMessage()); } } else { try { // Create the move and execute it. Move move = new Move(selectionLocation, cursorLocation, this); move.execute(); addToHistory(move); if (stacks[selectionLocation].hasCards()) { stacks[selectionLocation].unselect(); } } catch (AgainstTheRulesException e) { // If no solution is found, then complain. controller.alert(e.getMessage()); } catch (NoFreeCellException e) { // If the solver couldn't find enough cells, then complain. controller.alert(e.getMessage()); } catch (InvalidCardException e) { controller.alert(e.getMessage()); } finally { try { // And make sure nothing is left selected selectionLocation = getSelectionLocation(); if (selectionLocation > -1) { stacks[selectionLocation].unselect(); } } catch (Exception e) { // And if that fails, complain controller.alert(e.getMessage()); } } } this.repaint(); } else { try { // Select the card under the cursor stacks[cursorLocation].select(); } catch (Exception e) { // And if that fails, complain controller.alert(e.getMessage()); } repaint(); } } else if ((keyCode == UP) || (keyCode == -1)) { // UP, Emulator UP if (getSelectionLocation() == -1) { // Move the selection location to the top, for convenience. gotoLocation(PLAYSTACKLENGTH + CELLSTACKLENGTH - 1); this.repaint(); } else { // Move the currently-selected card home if possible, or to a free cell, if available. try { Card theCard = stacks[selectionLocation].getTopCard(); int homeslot = findHome(theCard); if (homeslot > -1) { Move move = new Move(selectionLocation, homeslot, this); move.execute(); addToHistory(move); } else { // Find a free cell and if found, create a move and execute. int freeCell = new FreeCellAllocator().getFreeCell(); Move move = new Move(selectionLocation, freeCell, this); move.execute(); addToHistory(move); } if (stacks[selectionLocation].hasCards()) { stacks[selectionLocation].unselect(); } } catch (AgainstTheRulesException e) { // If no solution is found, then complain. controller.alert(e.getMessage()); } catch (NoFreeCellException e) { // If the solver couldn't find enough cells, then complain. controller.alert(e.getMessage()); } catch (InvalidCardException e) { controller.alert(e.getMessage()); } finally { try { // And make sure nothing is left selected selectionLocation = getSelectionLocation(); if (selectionLocation > -1) { stacks[selectionLocation].unselect(); } } catch (Exception e) { // And if that fails, complain controller.alert(e.getMessage()); } } } // Other buttons } else { // DEBUG // controller.alert("KeyCode:"+keyCode+"\nCursor:"+cursor.toString()); } }