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

		}
	}
}
相关推荐
石山代码13 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言
程序大视界13 小时前
【Python系列课程】Python正则表达式(下):环视、命名分组与日志实战
开发语言·python·正则表达式
枫叶v.14 小时前
Agent 分层存储架构设计:从记忆方法到中间件选型
开发语言·python
sleven fung15 小时前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain
萤萤七悬15 小时前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
yjcode78915 小时前
探索游戏充值新纪元:友价源码技术革新之旅
大数据·人工智能·游戏·游戏交易
iCxhust15 小时前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机
csdn_aspnet15 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农16 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
oort12316 小时前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构