生活随笔
收集整理的這篇文章主要介紹了
C++五子棋(三)——判断鼠标有效点击
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分析
在鼠標左鍵點擊時,我們不能讓新棋子在已有棋子的位置落下,同時我們還要讓棋子在規定位置落下——棋盤線的交點處。
功能實現
創建數據類型
- 創建頭文件chessData.h和源文件chessData.cpp
- 在chessData.cpp和main.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{int chessMap
[BLOCK_GRAD_SIZE
][BLOCK_GRAD_SIZE
];int scoreMap
[BLOCK_GRAD_SIZE
][BLOCK_GRAD_SIZE
];bool playFlag
; };
ChessData game
;
初始化數據類型
void initChessData(ChessData
*);
void initChessData(ChessData
*data
){if(!data
) return;memset(data
->chessMap
,0,sizeof(data
->chessMap
));memset(data
->scoreMap
,0,sizeof(data
->scoreMap
));data
->playFlag
= true;}
判斷有效點擊
算法原理
實現
int clickPosRow
, clickPosCol
;
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
;}
#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
;
更新底層數據
void updateGameMap(ChessData
* data
, int row
, int col
);
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
; }
void manGo(){chessDown(clickPosRow
,clickPosCol
,CHESS_BLACK
);updateGameMap(&game
, clickPosRow
, clickPosCol
);}
總結
以上是生活随笔為你收集整理的C++五子棋(三)——判断鼠标有效点击的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。