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

		}
	}
}
相关推荐
炸膛坦客8 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-9 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-9 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
河南花仙子科技12 小时前
花仙子科技详解:小游戏合规开发完整要点
科技·游戏
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe12 小时前
C++——多态
开发语言·c++
心平气和量大福大13 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_14 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法