其实我计划学习《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