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

		}
	}
}
相关推荐
froginwe112 小时前
Python3 实例
开发语言
xiaoshuaishuai82 小时前
C# ZLibrary数字资源分发
开发语言·windows·c#
小碗羊肉2 小时前
【从零开始学Java | 第四十二篇】生产者消费者问题(等待唤醒机制)
java·开发语言
流年如夢2 小时前
自定义类型进阶:联合与枚举
java·c语言·开发语言·数据结构·数据库·c++·算法
Little At Air2 小时前
C++stack模拟实现
linux·开发语言·c++·算法
张老师带你学2 小时前
Unity 机器人 humanoid +shader效果
科技·游戏·unity·游戏引擎·模型
三品吉他手会点灯2 小时前
C语言学习笔记 - 9.C概述 - 常见问题答疑
c语言·笔记·学习
『昊纸』℃2 小时前
C语言上机入门实例
c语言·程序设计·编程学习·vc++6.0·海伦公式
Ulyanov2 小时前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio组件化开发与UI组件库构建
开发语言·python·qt·ui·雷达电子战系统仿真