C语言制作消消乐游戏(4)
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); } } }