-rw-r--r-- | noncore/games/solitaire/canvascardgame.cpp | 3 | ||||
-rw-r--r-- | noncore/games/solitaire/canvascardgame.h | 1 | ||||
-rw-r--r-- | noncore/games/solitaire/freecellcardgame.cpp | 83 | ||||
-rw-r--r-- | noncore/games/solitaire/freecellcardgame.h | 5 |
4 files changed, 90 insertions, 2 deletions
diff --git a/noncore/games/solitaire/canvascardgame.cpp b/noncore/games/solitaire/canvascardgame.cpp index 8e07cc8..8250193 100644 --- a/noncore/games/solitaire/canvascardgame.cpp +++ b/noncore/games/solitaire/canvascardgame.cpp @@ -324,18 +324,19 @@ void CanvasCardGame::contentsMouseReleaseEvent(QMouseEvent *e) while ( item ) { item->show(); if ( oldPile ) { c = oldPile->cardInfront(item); oldPile->removeCard(item); } - pile->addCardToTop(item); item->setCardPile(pile); //item->move( pile->getCardPos(item) ); + pile->addCardToTop(item); QPoint p = pile->getCardPos(item); item->setPos( p.x(), p.y(), highestZ ); highestZ++; + checkUnusable(); // added for freecell to move card to discard pile if (item->getValue() == king && haveWeWon()) { alphaCardPile->hide(); gameWon(); moving = NULL; return; diff --git a/noncore/games/solitaire/canvascardgame.h b/noncore/games/solitaire/canvascardgame.h index 0dfb85e..d159de6 100644 --- a/noncore/games/solitaire/canvascardgame.h +++ b/noncore/games/solitaire/canvascardgame.h @@ -75,12 +75,13 @@ public: void readPile( Config& cfg, CardPile *pile, QString name, int& highestZ ); protected: void contentsMousePressEvent(QMouseEvent *e); void contentsMouseReleaseEvent(QMouseEvent *e); void contentsMouseMoveEvent(QMouseEvent *e); + virtual void checkUnusable() { } //added for freecell protected: // Mouse event state variables bool moved; CanvasCard *moving; CanvasCardPile *alphaCardPile; diff --git a/noncore/games/solitaire/freecellcardgame.cpp b/noncore/games/solitaire/freecellcardgame.cpp index 98415aa..aeb32fc 100644 --- a/noncore/games/solitaire/freecellcardgame.cpp +++ b/noncore/games/solitaire/freecellcardgame.cpp @@ -66,12 +66,95 @@ void FreecellCardGame::deal(void) highestZ++; } endDealing(); } +// checks if smaller card with different color, that could be put on top on the +// card, is present in working or freecell pile +bool FreecellCardGame::checkNeeded(Card *card) +{ + if (card->getValue() > 2){ + int i; + Card *c; + for (i=0;i<4;i++){ + c = freecellPiles[i]->cardOnBottom(); + if (c != NULL){ + if (card->isRed()!= c->isRed() && card->getValue()== c->getValue()+1){ + return (false); + } + } + } + for (i=0;i<8;i++){ + c=workingPiles[i]->cardOnBottom(); + while (c!=NULL){ + if (card->isRed() != c->isRed() && card->getValue() == c->getValue()+1) { + return (false); + } + c=workingPiles[i]->cardInfront(c); + } + } + } + return(true); +} + +// added to move cards, on which no card can be moved, to discard pile +void FreecellCardGame::checkUnusable() +{ + int i,j; +// printf("void FreecellCardGame::checkUnusable()\n"); + Card *top_one; + for (i=0;i < 8;i++) + { + top_one = workingPiles[i]->cardOnTop(); + if (top_one != NULL) + { + j = 0; + while ((j < 4)) + { + if (discardPiles[j]->isAllowedOnTop(top_one)){ + if (checkNeeded(top_one)){ + top_one->setCardPile(discardPiles[j]); + workingPiles[i]->removeCard(top_one); +// printf("k %d f work%d to disk%d on %d\n ",top_one->getValue(),i+1,j+1,highestZ); + discardPiles[j]->addCardToTop(top_one); + top_one->setPos(discardPiles[j]->getX(),discardPiles[j]->getY(),highestZ); + highestZ++; + j = 4; + checkUnusable(); + } + } + j++; + } + } + } + for (i=0;i<4;i++){ + top_one = freecellPiles[i]->cardOnTop(); + if (top_one != NULL) + { + j = 0; + while ((j < 4)) + { + if (discardPiles[j]->isAllowedOnTop(top_one)){ + if (checkNeeded(top_one)){ + top_one->setCardPile(discardPiles[j]); + freecellPiles[i]->removeCard(top_one); +// printf("k %d f work%d to disk%d on %d\n ",top_one->getValue(),i+1,j+1,highestZ); + discardPiles[j]->addCardToTop(top_one); + top_one->setPos(discardPiles[j]->getX(),discardPiles[j]->getY(),highestZ); + highestZ++; + j = 4; + checkUnusable(); + } + } + j++; + } + } + } +} + bool FreecellCardGame::mousePressCard( Card *c, QPoint p ) { Q_UNUSED(p); if ( !c->getCardPile()->isAllowedToBeMoved(c) ) { diff --git a/noncore/games/solitaire/freecellcardgame.h b/noncore/games/solitaire/freecellcardgame.h index f1b09ab..2df751b 100644 --- a/noncore/games/solitaire/freecellcardgame.h +++ b/noncore/games/solitaire/freecellcardgame.h @@ -43,13 +43,13 @@ public: PatienceWorkingPile(x, y, canvas) { } virtual bool isAllowedOnTop(Card *card) { if ( cardOnBottom() == NULL ) { int numberOfCardsBeingMoved = 0; Card *tempCard = card; - + while ((tempCard != NULL)) { numberOfCardsBeingMoved++; tempCard = cardInfront(tempCard); } if (numberOfCardsBeingMoved > numberOfFreeCells) @@ -59,12 +59,13 @@ public: if ( card->isFacing() && cardOnTop() == NULL ) return TRUE; return PatienceWorkingPile::isAllowedOnTop( card ); } + virtual bool isAllowedToBeMoved(Card *card) { int nextExpectedValue = (int)card->getValue(); bool nextExpectedColor = card->isRed(); int numberOfCardsBeingMoved = 0; while ((card != NULL)) { @@ -135,16 +136,18 @@ public: virtual void mousePress(QPoint p) { Q_UNUSED(p); } virtual void mouseRelease(QPoint p) { Q_UNUSED(p); } // virtual void mouseMove(QPoint p); virtual bool mousePressCard(Card *card, QPoint p); virtual void mouseReleaseCard(Card *card, QPoint p) { Q_UNUSED(card); Q_UNUSED(p); } // virtual void mouseMoveCard(Card *card, QPoint p) { Q_UNUSED(card); Q_UNUSED(p); } + virtual void checkUnusable(); void readConfig( Config& cfg ); void writeConfig( Config& cfg ); bool snapOn; private: + bool checkNeeded(Card *card); FreecellFreecellPile *freecellPiles[8]; FreecellWorkingPile *workingPiles[8]; FreecellDiscardPile *discardPiles[4]; }; |