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

		}
	}
}
相关推荐
特立独行的猫a20 分钟前
我用 Rust + Tauri 2 复刻了 N_m3u8DL-CLI:一个 m3u8 多线程下载器
开发语言·后端·rust·m3u8·视频下载器·m3u8dl-cli
程序员雷欧23 分钟前
LongAdder
开发语言·python
鱼子星_36 分钟前
【C++】反向迭代器:反向迭代器的底层认识与模拟实现
开发语言·c++·笔记·stl
名字还没想好☜38 分钟前
Java 用 MethodHandle 替代反射:调用性能实测、invokeExact 的坑与缓存
java·开发语言·缓存·反射·methodhandle
SMF191940 分钟前
【Linux】完美解决缩略图工具gm调用java.io.FileNotFoundException: gm问题
java·开发语言·python
念何架构之路1 小时前
路由注册:RouterGroup(routergroup.go)
开发语言·后端·golang
Darkwanderor1 小时前
C++的流简介和简单使用
开发语言·c++
北冥you鱼1 小时前
深入解析 Go 中 sync.YAML.Unmarshal:如何将 YAML 数据填充到 Config 结构体
开发语言·算法·golang
goldbin_zhang_xu1 小时前
我用 Go 重写了一个 OpenClaw 框架:这就是 GoClaw
开发语言·后端·golang·agent框架·goclaw·双循环机制
lingran__1 小时前
C++ STL map 与 set 底层剖析与模拟实现万字详解|基于红黑树,复刻 SGI-STL 泛型复用架构
开发语言·c++·stl·set·map·泛型编程·sgi-stl