OpenCV、C++——五指棋实现

使用C++和OpenCV实现的五指棋 2020/10/29

简要说明:

1.棋盘大小为15*15,每一格的像素尺寸为25*25,鼠标左键双击棋盘下棋。

2.只有鼠标点击的位置没有棋子,且该点击点处在以该交点为中心 边长为10像素的正方形内,该点击才被判断为有效

3.会在黑窗口输出每次鼠标点击位置的坐标(棋盘交点坐标(row, col),实际像素点坐标(x, y)),注意x与col对应

4.下面是初步实现版本,且仅包含相关类的定义,具体代码实现见GitHub

初步实现仅包含两个类,一个表示棋盘,一个表示五指棋

下面是代码

class Checkerboard
{
public:
    Checkerboard(std::string windowName);

    void init(std::string windowName);   // 初始化棋盘

    void drawCheckerboard();

    void showCheckerboard(std::string windowName);

    // 在棋盘上(x, y)处放置棋子指定颜色的棋子  row col 从0开始
    void putChesspiece(int row, int col, bool isBlack);

    void putChesspiece(cv::Point circle, bool isBlack);

    void flush();  // 将棋盘恢复到初始状态

    // 判断这个棋子落下后是否会产生赢家
    bool win(int row, int col);

    // 判断指定位置是否已经存在棋子
    bool isOccupied(int row, int col);

    void setIsBlack(bool isBlack);

    // 落子后更新相关参数
    void updateParams(int row, int col);

    void startGame();

    static void onMouse(int event, int x, int y, int flags, void* param);

    // 保存对局功能和恢复对局功能


    // 判断是否有赢家出现 并做一些处理
    void doSomethingAfterWinnerAppear(int row, int col);


private:
    cv::Mat checkerboard_;   // 五指棋棋盘图像
    // 记录棋盘上已有棋子的矩阵  0表示空位 1表示白子 2表示黑子
    std::vector<std::vector<int>> chesspiece_; 

    std::string windowName_;

    bool isBlack_;

    // 获胜时行或者列或者对角线相连棋子数目
    const int winNum_ = 5;
    // 棋盘每行每列的棋子总数
    const int allChesspiece_ = 15;
    // 棋盘左上角第一个棋子可以放置的位置
    const int xStart_ = 25;
    const int yStart_ = 25;
    // 棋盘右下角位置
    const int xEnd_ = 375;
    const int yEnd_ = 375;
    // 棋盘大小
    const int rows_ = 400;
    const int cols_ = 400;
    // 棋盘线型线宽
    const int thickness_ = 2;
    const int lineType_ = 8;
    // 棋盘每一格边长
    const int preCellSize_ = 25; 
    // 棋盘颜色
    const cv::Scalar checkerboardBackgrandColor_ = cv::Scalar(99, 175, 229);;
    // 棋盘上分割线颜色
    const cv::Scalar checkerboardLineColor_ = cv::Scalar(39, 105, 154);
    // 棋子半径
    const int radius_ = 7;
    // 棋子颜色
    const cv::Scalar black_ = cv::Scalar(0, 0, 0);
    const cv::Scalar white_ = cv::Scalar(255, 255, 255);
};
class Gobang
{
public:
    // 默认黑子先行 但这可以自行设置
    Gobang(bool isBlack = true);
    ~Gobang();
    // 初始化游戏参数
    void init(bool isBlack);
    // 放置一个棋子  测试用的
    void putChesspiece(int row, int col);
    // 判断是否有赢家产生
    //bool haveWiner(int row, int col);
    // 游戏开始
    void startGame();

    

    //static void onMouse(int event, int x, int y, int flags, void* param);

private:
    bool isBlack_;   // 此时正在下棋的黑子还是白子
    //bool isFull_;    // 棋盘下满了
    //int cntChesspiece;   // 棋盘上现有棋子的数量
    //const int allChesspiece_ = 375;  // 棋盘总共可以放下的棋子总数

    Checkerboard* checkerboard_;
    const std::string windowName_ = std::string("Gobang");

    //const int preCellSize_ = 25;

    // 鼠标点击的位置
    //int x_;
    //int y_;
};
原文地址:https://www.cnblogs.com/lnlin/p/13898896.html