使用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_; };