cpp
复制代码
ExMessage msg;
if (peekmessage(&msg) && msg.message == WM_LBUTTONDOWN) {
//printf("=== 鼠标点击 === x=%d, y=%d\n", msg.x, msg.y);
int clickedRow = -1, clickedCol = -1;
// 遍历所有方块,精确检测点击了哪个
for (int i = 1; i <= ROW; i++) {
for (int j = 1; j <= COL; j++) {
int left = map[i][j].x;
int right = map[i][j].x + block_size;
int top = map[i][j].y;
int bottom = map[i][j].y + block_size;
// 打印每个方块的位置(调试用,可以注释掉)
// printf("方块[%d,%d]: left=%d, right=%d, top=%d, bottom=%d\n",
// i, j, left, right, top, bottom);
if (msg.x >= left && msg.x <= right &&
msg.y >= top && msg.y <= bottom) {
clickedRow = i;
clickedCol = j;
//printf("点击到方块: [%d,%d]\n", clickedRow, clickedCol);
break;
}
}
if (clickedRow != -1) break;
}
if (clickedRow == -1) {
//printf("没有点击到任何方块!\n");
return;
}
// 处理点击逻辑
click++;
if (click == 1) {
posX1 = clickedRow;
posY1 = clickedCol;
//printf("第一次选中: [%d,%d]\n", posX1, posY1);
}
else if (click == 2) {
posX2 = clickedRow;
posY2 = clickedCol;
//printf("第二次点击: [%d,%d]\n", posX2, posY2);
// 检查是否相邻
int diff = abs(posX2 - posX1) + abs(posY2 - posY1);
//printf("距离: %d\n", diff);
if (diff == 1) {
//printf("执行交换!\n");
exchange(posX1, posY1, posX2, posY2);
click = 0;
isMoving = true;
isSwap = true;
}
else {
//printf("不相邻,重新选择\n");
click = 1;
posX1 = clickedRow;
posY1 = clickedCol;
}
}
}