分析

在鼠标左键点击时,我们不能让新棋子在已有棋子的位置落下,同时我们还要让棋子在规定位置落下——棋盘线的交点处。

功能实现

创建数据类型

  • 创建头文件chessData.h和源文件chessData.cpp
  • chessData.cppmain.cpp分别引用头文件chessData.h
#include "chessData.h"
  • 将之前在main.cpp中写的棋盘数据剪贴chessData.h
const float BLOCKSIZE = 67.4;
const int BLOCK_GRAD_SIZE = 13;
  • chessData.h中定义常量 POS_OFFSET,即鼠标有效点击距离上限
const int POS_OFFSET = BLOCKSIZE * 0.4;
  • chessData.h定义结构体 ChessData
struct ChessData{//储存当前游戏棋盘的情况,空白为0,黑棋为1,白棋为-1int chessMap[BLOCK_GRAD_SIZE][BLOCK_GRAD_SIZE];//储存各点的评分情况,用于之后的AI走棋int scoreMap[BLOCK_GRAD_SIZE][BLOCK_GRAD_SIZE];bool playFlag;  //表示下棋放,true黑棋,false白棋(AI)};
  • main.cpp中添加全局变量game
ChessData game;

初始化数据类型

  • chessData.h中添加函数声明
void initChessData(ChessData*);
  • chessData.cpp
void initChessData(ChessData *data){if(!data) return;memset(data->chessMap,0,sizeof(data->chessMap));memset(data->scoreMap,0,sizeof(data->scoreMap));data->playFlag = true;}

判断有效点击

算法原理

实现

  • main.cpp中添加全局变量
int clickPosRow, clickPosCol;    //用于储存点击位置
  • 定义函数clickBoard()
//有效点击返回true,无效点击返回false
//MOUSEMSG为鼠标信息类型
bool clickBoard(MOUSEMSG msg){//(鼠标点击坐标 - 边界长度)/ 格宽 = 行(列)数//计算列数并取整int col = (msg.x - MARGIN_X) / BLOCKSIZE;//计算行数取整int row = (msg.y - MARGIN_Y) / BLOCKSIZE;//计算棋子正确坐标,即格子左上角棋子应在的棋盘格线交点处坐标int leftTopPosX = MARGIN_X + BLOCKSIZE * col;int leftTopPosY = MARGIN_Y + BLOCKSIZE * row;}
  • 在文件最上方引用头文件math.h用于后期计算
#include <math.h>
  • 之后要判断棋子应在四个交点中具体哪一点上,这里我们用一个do-while循环。继续添加**clickBoard()**函数的定义
int len; //用于计算两点见的距离(根据中学所学两点间距离公式)
int selectPos = false; //作为返回值do{//左上角len = sqrt((msg.x - leftTopPosX)*(msg.x - leftTopPosX) + (y - leftTopPosY)*(msg.y - leftTopPosY));if(len < POS_OFFSET){clickPosRow = row;clickPosCol = col;if ( game.chessMap[clickPosRow][clickPosCol] == 0 ){selectPos = true;}break;}//右上角len = sqrt((msg.x - leftTopPosX - BLOCKSIZE)*(msg.x - leftTopPosX - BLOCKSIZE) + (y - leftTopPosY)*(msg.y - leftTopPosY));if(len < POS_OFFSET){clickPosRow = row;clickPosCol = col + 1;if ( game.chessMap[clickPosRow][clickPosCol] == 0 ){selectPos = true;}break;}//左下角len = sqrt((msg.x - leftTopPosX)*(msg.x - leftTopPosX) + (y - leftTopPosY - BLOCKSIZE)*(msg.y - leftTopPosY - BLOCKSIZE));if(len < POS_OFFSET){clickPosRow = row + 1;clickPosCol = col;if ( game.chessMap[clickPosRow][clickPosCol] == 0 ){selectPos = true;}break;}//右下角len = sqrt((msg.x - leftTopPosX - BLOCKSIZE)*(msg.x - leftTopPosX - BLOCKSIZE) + (y - leftTopPosY - BLOCKSIZE)*(msg.y - leftTopPosY - BLOCKSIZE));if(len < POS_OFFSET){clickPosRow = row + 1;clickPosCol = col + 1;if ( game.chessMap[clickPosRow][clickPosCol] == 0 ){selectPos = true;}break;}}while(0);return selectPos;

更新底层数据

  • chessData.h
void updateGameMap(ChessData* data, int row, int col);
  • chessData.cpp
void updateGameMap(ChessData* data, int row, int col){if(!data) return;if(data->playFlag){data->chessMap[row][col] = 1;}else{data->chessMap[row][col] = -1;}data->playFlag = !data->playFlag;  //换下棋方}
  • main.cpp
//玩家走棋
void manGo(){chessDown(clickPosRow,clickPosCol,CHESS_BLACK);updateGameMap(&game, clickPosRow, clickPosCol);}

C++五子棋(三)——判断鼠标有效点击相关推荐

  1. Vue项目判断鼠标点击事件的左键、中键(滚轮)或右键

    Vue项目判断鼠标点击事件的左键.中键(滚轮)或右键 去掉特定区域的右键点击事件 在需要去掉右键点击事件的区域最外层div标签中添加@contextmenu.prevent属性 <templat ...

  2. jQuery 怎样判断鼠标点击的是左键还是右键

    <script> $(document).mousedown(function(event) {code=event.button;alert(code);//若点击左键弹出数字0,滚轮弹 ...

  3. Android 如何判断鼠标点击事件

    Android 如何判断鼠标点击事件 参考以下的文字 http://blog.csdn.net/shanghaibao123/article/details/49494039 http://blog. ...

  4. 判断鼠标点击在div外时,更改背景图片

    学习起步时,本人试着在web端界面上仿照qq客户端主菜单,做出了一个界面. 当做到qq主菜单的搜索框时,发现点击搜索框后,里面的背景图片会消失,如下面2张图所示:      点击前           ...

  5. cocos判断鼠标点击_鼠标左键失灵怎么办?鼠标左键不灵敏的修复方法

    鼠标用久了之后,就有可能会出现鼠标左键失灵或者不灵敏的情况,这要怎么修复呢?鼠标左键不灵敏该如何解决?本文就给大家详细介绍鼠标用久了后左键不灵敏或失灵的解决方法. 解决方法: 1.比如鼠标右键失灵,可 ...

  6. c++图形中如何判断鼠标点击在一条直线上_PS教程:十种抠图方法【上】

    今天的关键字是"抠图" 日常工作生活中大家可能经常会用到抠图的技能 方法很多 包括使用美图秀秀等 我之前也分享过比如利用ppt如何抠图 那么今天就来给大家介绍十种用ps抠图的方法: ...

  7. c++图形中如何判断鼠标点击在一条直线上_中考数学常考题型精讲精练系列:函数图象上点的存在性问题中的距离与面积...

    函数图象上点的存在性问题中的距离与面积(下)第1段 函数图象上点的存在性问题中的距离与面积(下)第2,3段 函数图象上点的存在性问题中的距离与面积(下)第4段 判断函数的图像是中考的重要考点,主要有以 ...

  8. C++ windows下判断鼠标点击及获取像素点

    ```cpp #include<iostream> #include <stdio.h> #include<windows.h>#define KEY_DOWN(V ...

  9. PyQt5 鼠标点击事件(点击响应事件可自定义):鼠标单击、双击、滚轮滚动、释放、移动等

    自己写通了最常用的鼠标事件,具体响应事件,大家可以自定义,实现的效果如下: 具体代码如下,有任何问题,欢迎小伙伴们交流讨论. # -*- coding: utf-8 -*- ""& ...

最新文章

  1. 《计算机网络》常考概念、英文缩写、公式大全
  2. 大专生质问马云:你说招聘从不看文凭,为什么我投阿里石沉大海
  3. 究竟有多少假代购,在2亿多海淘用户市场里浑水摸鱼?
  4. 如此简单 | ElasticSearch 最全详细使用教程
  5. 宝塔设置thinkphp的伪静态_thinkphp等入口文件在public目录的设置方法
  6. Java编写简单密码问题
  7. 乌班图anaconda安装
  8. CCF认证-2015-3-2 数字排序
  9. [android源码分析]sdp Server的启动分析
  10. 机器学习基础:K近邻算法(Machine Learning Fundamentals: KNN)
  11. 利用C++不使用递归,循环和goto,打印1到100 的某一答案分析
  12. App Transport Security has blocked a cleartext
  13. IT公司速查手册的各大IT公司薪资和待遇内幕
  14. vue 实现 word、ppt、excel、图片、PDF、视频、音频等格式的文件下载
  15. php与mysql 5_PHP5与MySQL5从入门到精通 PDF扫描版[61MB]
  16. 第三周助教工作总结——NWNU李泓毅
  17. MobileNet v2的Inverted Bottleneck为什么可以抵消ReLU激活函数所带来的信息损失
  18. 简单的卷积神经网络,实现手写英文字母识别
  19. Neural Networks and Deep Learning - 神经网络与深度学习 - Overfitting and regularization - 过拟合和正则化
  20. 微信运动服务器多久同步一次,微信运动多久更新一次步数(微信运动刷新时间表)...

热门文章

  1. 维沃手机有没有智能机器人_抢!抢!抢!到宏达手机广场抢价值399元智能学习机器人仅需39.9就可领取啦!...
  2. 83. Leetcode 148. 排序链表 (排序)
  3. 从无到有算法养成篇-线性表实战篇
  4. 新学期的一些安排 | 以及一些小建议
  5. linux中sort不对的问题
  6. python logging 毫秒级别的时间打印
  7. MNN通用端侧深度学习预测框架介绍
  8. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
  9. 使用HtmlUnit获取html页面
  10. 阿里异地多活与同城双活的架构演进