C语言制作消消乐游戏(4)

4.实现方块的移动

(1)处理用户点击操作

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;
				}
			}
		}

(2)实现两个方块的移动

cpp 复制代码
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);

		}
	}
}
相关推荐
大黄说说38 分钟前
iOS 列表滑动卡顿:UITableView / UICollectionView 深度优化实战
开发语言
于樱花森上飞舞1 小时前
【Redis】哨兵详解
java·开发语言·数据库·redis
Navigator_Z1 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
Lazionr1 小时前
二叉搜索树:从树形结构到高效查找
开发语言·c++
此生决int1 小时前
深入理解C++系列(21)——异常
开发语言·c++
乌暮1 小时前
Java 抽象类与接口详解:半成品图纸 vs 能力合同
java·开发语言·后端·学习
乐观的Terry2 小时前
ShipDesk 完整使用教程:从新建项目到 SSH 自动发布
开发语言
牵猫散步的鱼儿2 小时前
stride 图像步长
c语言
刃神太酷啦2 小时前
前端入门第一课:HTML 基础语法 + 常用标签 + 实战全解
服务器·c语言·前端·javascript·css·c++·html
山下梅子酒2252 小时前
洛谷-入门-B2055
c语言