4.实现方块的移动
(1)处理用户点击操作
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; } } }
(2)实现两个方块的移动
void move() { isMoving = false; for (int i = ROW; i > 0; i--) { for (int j = 1; j <= COL; j++) { struct block* p = &map[i][j]; int dx, dy; for (int k = 0; k < 3; k++) { int x = off_x + (p->col + 1) * (block_size + 2); int y = off_y + (p->row - 1) * (block_size + 2); dx = p->x - x; dy = p->y - y; if (dx)p->x -= dx / abs(dx); if (dy)p->y -= dy / abs(dy); } if (dx || dy)isMoving = true; //p->x; //p->y; //map[i][j].x = off_x + (j + 1) * (block_size + 2);//调整方块位置 //map[i][j].y = off_y + (i - 1) * (block_size + 2); } } }