Keep track of gameWon state
This commit is contained in:
parent
b558a3396e
commit
a1d676779d
|
@ -48,6 +48,9 @@ void GameState::dealCards()
|
|||
m_foundation.clear();
|
||||
m_throwawayPile.clear();
|
||||
|
||||
// Note that we don't need to reset gameWon from here, as it's
|
||||
// auto-checked from onFoundationChanged, which the emits trigger
|
||||
|
||||
emit drawPileChanged();
|
||||
emit throwawayPileChanged();
|
||||
emit columnsChanged();
|
||||
|
@ -165,6 +168,28 @@ bool GameState::moveColumnCardToFoundation(int columnId, PlayingCard::Suit found
|
|||
|
||||
}
|
||||
|
||||
void GameState::onFoundationChanged()
|
||||
{
|
||||
// Check if the game is won (can only happen on a foundation pile change)
|
||||
bool gameWon = true;
|
||||
for (const QList<PlayingCard*> &foundationPile : std::as_const(m_foundation)) {
|
||||
// The piles need to contain all 13 card values each, otherwise the game isn't won
|
||||
if (foundationPile.size() != 13) {
|
||||
gameWon = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (gameWon == m_gameWon)
|
||||
return;
|
||||
|
||||
if (gameWon)
|
||||
qDebug() << "The game was won!";
|
||||
|
||||
m_gameWon = gameWon;
|
||||
emit gameWonChanged();
|
||||
}
|
||||
|
||||
bool GameState::tryMoveCardToFoundation(PlayingCard::Suit foundationId, PlayingCard* cardToMove)
|
||||
{
|
||||
assert(foundationId >= PlayingCard::Suit::Clubs && foundationId < PlayingCard::Suit::Spades);
|
||||
|
@ -234,3 +259,8 @@ QList<QList<PlayingCard *> > GameState::foundation() const
|
|||
{
|
||||
return m_foundation;
|
||||
}
|
||||
|
||||
bool GameState::gameWon() const
|
||||
{
|
||||
return m_gameWon;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ class GameState : public QObject
|
|||
Q_PROPERTY(QList<PlayingCard*> throwawayPile READ throwawayPile NOTIFY throwawayPileChanged)
|
||||
Q_PROPERTY(QList<QList<ColumnSlot*>> columns READ columns NOTIFY columnsChanged)
|
||||
Q_PROPERTY(QList<QList<PlayingCard*>> foundation READ foundation NOTIFY foundationChanged)
|
||||
Q_PROPERTY(bool gameWon READ gameWon NOTIFY gameWonChanged)
|
||||
|
||||
public:
|
||||
explicit GameState(QObject *parent = nullptr);
|
||||
|
@ -20,6 +21,7 @@ public:
|
|||
QList<PlayingCard*> throwawayPile() const;
|
||||
QList<QList<ColumnSlot*>> columns() const;
|
||||
QList<QList<PlayingCard*>> foundation() const;
|
||||
bool gameWon() const;
|
||||
|
||||
void dealCards();
|
||||
void drawNextCard();
|
||||
|
@ -32,12 +34,17 @@ signals:
|
|||
void throwawayPileChanged();
|
||||
void columnsChanged();
|
||||
void foundationChanged();
|
||||
void gameWonChanged();
|
||||
|
||||
private slots:
|
||||
void onFoundationChanged();
|
||||
|
||||
private:
|
||||
QList<PlayingCard*> m_drawPile;
|
||||
QList<PlayingCard*> m_throwawayPile;
|
||||
QList<QList<ColumnSlot*>> m_columns;
|
||||
QList<QList<PlayingCard*>> m_foundation;
|
||||
bool m_gameWon;
|
||||
|
||||
bool tryMoveCardToFoundation(PlayingCard::Suit foundationId, PlayingCard* cardToMove);
|
||||
void ensureColumnRevealed(int columnId);
|
||||
|
|
Loading…
Reference in a new issue