Illustration de l'article

Qt pour des applications desktop et mobiles simplement (2/7)

Écrit par Yves

Suite de la découverte de la programmation desktop et mobile avec Qt.

Sommaire

2048

Maintenant que notre application QtQuick fonctionne intéressons nous à notre 2048.

2048.c

Le but étant d’explorer des technologies, pas de développer un jeu, je me suis donc basé sur une implémentation du 2048 en c que vous pouvez trouver ici.

C’est une implémentation en console pour Linux. Bon ça fonctionne aussi sous mac 😉

Le code est relativement simple, il y a une matrice 4*4 qui représente le plateau. Les mouvements sont simplifiés puisque seul le mouvement vers le haut est implémenté. Les autres mouvements sont une combinaison de rotation vers la droite et de déplacement vers le haut (une rotation, un déplacement, 3 rotations donne un déplacement vers la gauche par exemple).

J’ai gardé les principes de base, juste quelques petites modifications mineurs entre autre au niveau de ces déplacements.

2048 en Qt

J’ai donc ajouté une classe Board qui hérite de QObject. Il est bienvenue d’hériter de QObject car ça apporte plein de choses, comme les signaux et slots.

Voici le header de cette classe.

#ifndef BOARD_H
#define BOARD_H

#include <QObject>
#include <QStringList>

typedef int8_t t_index;
typedef uint16_t t_value;
typedef uint32_t t_score;
static const t_index kSize = 4;
static const t_value kValueOfLastTile = 2048;

class Board : public QObject {
    Q_OBJECT

public:
    explicit Board(QObject *parent = 0);

    void print() const;

    bool moveUp();
    bool moveRight();
    bool moveDown();
    bool moveLeft();

    t_value get(const t_index x, const t_index y) const;
    t_score score() const;
    bool gameEnded();
    bool win();

signals:

public slots:

private:
    t_value board_[kSize][kSize];
    t_score score_;
    t_value higherTile_;

    enum Directions {
        Up = 0,
        Left,
        Down,
        Right
    };

    void initGame();
    void initRand();
    t_value nextTileValue() const;
    void addRandomTile();

    bool move(Directions direction);
    bool moveTilesUpwards();
    void waitAndAddTile();

    void rotateToRight();
    bool slide(t_value array[kSize]);
    t_index findTarget(t_value array[kSize], const t_index pos, const t_index stop) const;
    bool findPairDown() const;
    t_value countEmpty() const;
};

#endif // BOARD_H

Au niveau des méthodes publiques rien de très complexe :

  • une méthode qui affiche dans la console le contenu du plateau
  • quatre méthodes de déplacement
  • une méthode pour récupérer la valeur d’une case (tuile) en fonction des coordonnées
  • une méthode pour récupérer le score
  • deux méthodes pour savoir si le jeux est fini et si on a gagné
  • une méthode d’init

Je ne détaille pas vraiment les méthodes privées ni l’implémentation, ce n’est pas tellement le sujet et github est là.

Juste histoire de voir que tout fonctionne bien j’ai changé le main comme suit :

int main(int argc, char *argv[])
{
    Q_UNUSED(argc)
    Q_UNUSED(argv)

    Board board;
    board.print();
    board.moveUp();
    board.print();
    board.moveRight();
    board.print();
    board.moveUp();
    board.print();
    board.moveRight();
    board.print();

    return 0;
}

C’est pas super beau mais ça permet de se rendre compte que oui ça fonctionne.

Apparté C++11

Petit apparté rapide. Normalement vous devriez avoir un warning du genre :

/Users/yves/Projects/Qt/qt2048/board.cpp:93: avertissement : ‘auto’ type specifier is a C++11 extension [-Wc++11-extensions] auto time = QTime::currentTime(); ^

C’est normal, j’utilise auto qui vient de C++11. Il faut donc l’activer dans le fichier qt2048.pro :

CONFIG+=c++11
Illustration de l'article
comments powered by Disqus