#ifndef GAMESTATE_H #define GAMESTATE_H #include #include #include "playingcard.h" #include "columnslot.h" class GameState : public QObject { Q_OBJECT QML_ELEMENT QML_UNCREATABLE("Use C++ logic to instantiate") Q_PROPERTY(QList drawPile READ drawPile NOTIFY drawPileChanged) Q_PROPERTY(QList throwawayPile READ throwawayPile NOTIFY throwawayPileChanged) Q_PROPERTY(QList> columns READ columns NOTIFY columnsChanged) Q_PROPERTY(QList> foundation READ foundation NOTIFY foundationChanged) Q_PROPERTY(bool gameWon READ gameWon NOTIFY gameWonChanged) public: explicit GameState(QObject *parent = nullptr); // Getters QList drawPile() const; QList throwawayPile() const; QList> columns() const; QList> foundation() const; bool gameWon() const; // General functions void dealCards(); void drawNextCard(); // Manual moves (from X to Y) bool moveCardToColumn(int columnId); bool moveThrownCardToFoundation(PlayingCard::Suit foundationId); bool moveColumnCardToFoundation(int columnId, PlayingCard::Suit foundationId); // Automatic moves (from X to auto) bool autoMoveThrownCard(); bool autoMoveColumnCard(int columnId); signals: void drawPileChanged(); void throwawayPileChanged(); void columnsChanged(); void foundationChanged(); void gameWonChanged(); private slots: void onFoundationChanged(); private: QList m_drawPile; QList m_throwawayPile; QList> m_columns; QList> m_foundation; bool m_gameWon; bool tryMoveCardToFoundation(PlayingCard::Suit foundationId, PlayingCard* cardToMove); bool tryAutoMoveCard(PlayingCard* cardToMove); bool isMoveToColumnLegal(PlayingCard* cardToMove, int columnId); void ensureColumnRevealed(int columnId); }; #endif // GAMESTATE_H