← index
PuzzleDrop/puzzle_drop.hpp
Source: PuzzleDrop/puzzle_drop.hpp

#ifndef _PUZZLE_DROP_H_
#define _PUZZLE_DROP_H_

#include<iostream>
#include<string>

namespace puzzle {

    enum class BlockType { BLOCK_NULL=0, BLOCK_CLEAR, RED1, RED2, RED3, GREEN1, GREEN2, GREEN3, BLUE1, BLUE2, BLUE3, MATCH };

    class Piece;

    class Block {
        int x,y;
        BlockType type;
        int clear;
        int flash_counter;
    public:
        Block();
        Block(const Block &b);
        Block(Block &&b) = delete;
        Block &operator=(const Block &b);
        Block &operator=(Block &&b);
        Block &operator=(const BlockType &t);
        Block(int xx, int yy, BlockType t);
        int getX() const;
        int getY() const;
        BlockType getType() const;
        bool operator==(const Block &b);
        bool operator==(const BlockType &type);
        int &clearValue();
        int &flashCounter();
        void clearBlock();
        friend class Piece;
        friend std::ostream &operator<<(std::ostream &out, Block &b);
    };

    enum Direction { D_DOWN=1, D_UP =2 };

    class Piece {
    public:
        Piece();
        Piece(const Piece &p);
        Piece(Piece &&p);
        Piece &operator=(const Piece &p);
        Piece &operator=(Piece &&p);
        void newPiece(int start_x, int start_y);
        void randColors();
        void moveLeft();
        void moveRight();
        void moveDown();
        void rotateLeft();
        void rotateRight();
        void shift(Direction dir);
        int pos() const;
        Block blocks[3];
        friend std::ostream &operator<<(std::ostream &out, Piece &p);
    private:
        int position;
    };

    class Grid {
    public:
        Grid(int w, int h);
        ~Grid();
        void clearGrid();
        Block *grid(int x, int y);
        int getWidth() const;
        int getHeight() const;
        Piece &getPiece();
        void keyLeft();
        void keyRight();
        void keyDown();
        void keyShiftUp();
        void keyShiftDown();
        void keyRotateLeft();
        void keyRotateRight();
        int level() const;
        int currentLines() const;
        void levelNext();
        bool procMoveDown();
        bool procBlocks();
        bool gameOver() const;
    protected:
        Block **blocks;
        Piece piece;
        int grid_w, grid_h;
        int game_level;
        int lines;
        bool game_over;
        bool checkPiece(Piece &p, int x, int y);
        void setPiece();
        bool checkBlock(int x, int y, const BlockType &type);
        void addScore();
    };

}


#endif