windows程序设计.api.拼图游戏

博主在学习《Windows程序设计》时,受到另一位博主的启发,制作了一个基于Win32 API的拼图小游戏。游戏原理源于八数码问题,通过随机打乱初始状态进行挑战。使用IDA*算法快速求解,按下tab+shift即可显示答案。这是一个结合搜索算法与Windows编程的实践项目。
摘要由CSDN通过智能技术生成

其实我计划学习《DirectX 9.0 3D》这本书的,但此书里面的主窗口程序就是用Win32 API编写的,虽然只涉及到最简单的创建窗口,消息队列的响应.

好吧,我还是决定先看看《Windows程序设计》(第五版),唉,总是这么三心二意,该咋办呢.

介于此书内容实在太太太多了,..........我就看了前几章.后来看到了一位博主也是在学习Win32过程中制作了一个拼图小游戏,于是我也照着学啦,hah!!

原作者:孤舟钓客 地址


做完这个我就不继续学了.....

拼图游戏其实就是以前学习搜索算法里的一个经典例题: 八数码. 原理是一样的,只不过我们需要自己绘制图片了

首先我们将窗口分割成n*n组成的小方块,赋予序号并记录窗口相对坐标(我用左上角坐标),将起打乱(用random函数),其实直接打乱游戏会出现无法复原的情况.这和线性代数里提到过的逆序对有关.

Unit存储方格序号.我们假定以下编号方式为最初状态,也就是说复原成这样就完成游戏了

1 2 3

4 5 6

7 8 9

下标从1至9

// 初始化
while(1)
	{
		memset(Unit, 0, sizeof(Unit) ); // Unit存储方格序号

		for(int i = 1; i <= NUM * NUM; i++)
		{
			int Tmp = rand() % (NUM * NUM) + 1;
			if(Unit[Tmp] == 0)
				Unit[Tmp] = i;
			else
				i--;
		}

		int Sta = 0; 
		//计算逆序对数
		for(int i = 1; i < NUM * NUM; i++)
			for(int j = i + 1; j <= NUM * NUM; j++)
				if(Unit[i] != NUM *NUM && Unit[i] > Unit[j])
					Sta++;
                //Game_Flag() 用于判断是否已经复原拼图(游戏结束标志),如果"不小心"初始化成有序状态,那就只能再来一遍了
                if( !(Sta & 1) && !Game_Flag() )
			break;
	}
那么加载图片,建立缓存(兼容DC),绘制图片,响应键盘操作,只要调用相应API函数即可,《Windows程序设计》上都有

代码风格非常糟糕...仅供参考

 #include <windows.h>
#include <time.h>
#include <math.h>
#include <string.h>

#pragma comment(lib, "WINMM.LIB")

#define NUM 3
#define N NUM
#define WINDOW_EXTRE 80

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

TCHAR szAppName [] = L"PinTu";

int SCREEN_WIDTH,SCREEN_HEIGHT,WINDOW_WIDTH, WINDOW_HEIGHT;

HBITMAP hBitmap;

int MinLenthx, MinLenthy;
int Unit[NUM * NUM + 1];
int Pos;
int MAX;
int a[N][N];
int ss;
bool ans;
int dir[4][2]={
  {-1,0},{0,-1},{0,1},{1,0}};
int TValue[9][2]={
  {0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}};
char droad[4]={'u','l','r','d'};
char road[100];
struct
{
	int x, y;
}Point[NUM * NUM + 1];


int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance, PSTR 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值