智能拼图

本文介绍了作者使用Win32 API编写的两款拼图游戏,包括基本功能如图片移动、计时和步数记录。第一版实现了分割图片并允许玩家操作。第二版增加了作弊、路径显示、自动寻路等功能,其中自动完成拼图部分运用了8数码问题的解决方案。文章提供了关键代码片段和完整资源的下载链接。
摘要由CSDN通过智能技术生成

前几天用win32 api写了个拼图游戏,现在写完了,想与大家分享一下。这个拼图游戏,我一共写了两个版本。

一、第一个版本

这是比较原始的版本,包含了拼图游戏所需的基本功能,通过用鼠标点击图片,实现图片的移动,并且,加入了计时和记录步数的功能。

1.效果图:


2.设计思路:

大致的思路是这样的,先加载一张位图,将位图分割成9个小的图片,开一个3*3的POINT数组,用来存储这9张图片的左上角顶点的坐标。程序中我用了两个POINT数组,一个数组p用来记录着终止状态时这九张图片的坐标,数组point用来记录当前时刻9张图片的坐标。这样的话,把对应的point[i]位置的图片加载到p[i]位置,就可以实现将图片分割的效果。

3.注意点;

对于随机打乱图片的位置生成的拼图,有50%的几率是不可解的。我这里生成的拼图是保证可解的。这里有一个知识点,在这种情况下,生成拼图序列的逆序数是偶数就可解;

关键代码:

void Generate_Puzzles()
{
	srand((unsigned)time(NULL));
	int b[NUM * NUM];
	while (true)
	{
		memset(vis, false, sizeof(vis));
		for (int i = 0; i < NUM * NUM - 1; i++)
		{
			while (true)
			{
				int t = rand() % (NUM * NUM - 1);
				if (!vis[t])
				{
					vis[t]     = true;
					point[i].x = p[t].x;
					point[i].y = p[t].y;
					b[i]       = t;
					break;
				}
			}
		}
		point[NUM * NUM - 1].x = point[NUM * NUM - 1].y = -1;
		/*判断是否有解*/
		int sum = 0;
		for (int i = 0; i < NUM * NUM - 2; i++)
		{
			for (int j = i + 1; j < NUM * NUM - 1; j++)
			{
				if (b[i] > b[j]) sum++;
			}
		}
		if(0 == sum % 2) break;
	}
}


4.完整代码:

/*
DreamChaser
2014.05.10 2:07
功能:计时,记录步数
*/
#include <windows.h>
#include <time.h>
#include <algorithm>
using namespace std;

#define WINDOW_WIDTH  820
#define WINDOW_HEIGHT 640
#define WINDOW_TITLE  L"[DCGE]拼图"
#define WINDOW_CLASS  L"DreamChaser"
#define NUM			  3

HDC					g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL;
HBITMAP				g_hbmp, g_hbmps;
int					g_width, g_height, g_step, g_tstart;
POINT				p[NUM * N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值