日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/3/21 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++五子棋(三)——判断鼠标有效点击 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分析

在鼠標左鍵點擊時,我們不能讓新棋子在已有棋子的位置落下,同時我們還要讓棋子在規定位置落下——棋盤線的交點處。

功能實現

創建數據類型

  • 創建頭文件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++五子棋(三)——判断鼠标有效点击的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。