-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 | 3 |
4 files changed, 89 insertions, 1 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 @@ -322,22 +322,23 @@ void CanvasCardGame::contentsMouseReleaseEvent(QMouseEvent *e) Card *c = NULL; if ( oldPile != pile) { 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 @@ -73,16 +73,17 @@ public: void setNumberToDraw(int numToDraw) { this->numberToDraw = numToDraw; } 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; int cardXOff, cardYOff; 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 @@ -64,16 +64,99 @@ void FreecellCardGame::deal(void) card->move( workingPiles[i%8]->getCardPos( card ) ); card->showCard(); 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) ) { moving = NULL; return TRUE; 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 @@ -57,16 +57,17 @@ 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)) { numberOfCardsBeingMoved++; if ( (int)card->getValue() != nextExpectedValue ) @@ -133,20 +134,22 @@ public: discardPiles[3]->kingOnTop() ); } 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]; }; #endif |