zoukankan      html  css  js  c++  java
  • 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_;
    };
  • 相关阅读:
    4.2 手指绘图
    Linux-linux常用操作
    gdb的使用
    时钟的函数
    动态链接库
    简单算法整理
    win的使用
    c语言格式化打印
    Symfony2 学习笔记之控制器
    Symfony2 学习笔记之系统路由
  • 原文地址:https://www.cnblogs.com/lnlin/p/13898896.html
Copyright © 2011-2022 走看看