#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#define N 4 //拼图单边方块数
HINSTANCE G_hInst;
RECT Crect;
HDC G_BitMapBKDC;
HDC hMDC;
HDC TempDC;
long kW,kH;
int X_M,Y_M;
int n=0,T1=10,T2=10;
int TimeOver_m=2, TimeOver_s=0;
int OVER=1;
typedef struct puzzle {
HDC KoalaDC; //随机排列的环境句柄
HDC TrueDC; //正确排列的环境句柄
int X,Y;
}PUZZLE;
PUZZLE pDC[N*N];
HDC CreateMemoryDC(HDC hClientDC,RECT rect);
HDC HDCTOHDC(HDC hClientDC,PUZZLE BitMapDC[],long width,long height,RECT ClientRect);
HDC LoadBitMap(HINSTANCE hInst,char* filename,long& width,long& height);
long CALLBACK WndProc(HWND hWnd, int message, int wParam, int lParam)
{
switch(message)
{
case WM_CREATE:
{
HDC hDc = GetDC(hWnd);
SetTimer(hWnd,1,0,NULL);
SetTimer(hWnd,2,1000,NULL);
srand(time(NULL));
GetClientRect(hWnd,&Crect);
// G_BitMapBKDC = LoadBitMap(G_hInst,"koala.bmp",kW,kH);
// G_BitMapBKDC = LoadBitMap(G_hInst,"xilige.bmp",kW,kH);
G_BitMapBKDC = LoadBitMap(G_hInst,"cat.bmp",kW,kH);
RECT rect = {0,0,kW/N,kH/N};
int nCol,nRow,m,j;
for(int i=0; i<N*N; i++)
{
pDC[i].KoalaDC = CreateMemoryDC(hDc,rect);
nCol = i%N;
nRow = i/N;
BitBlt(pDC[i].KoalaDC,0,0,kW/N,kH/N,G_BitMapBKDC,nCol*kW/N,nRow*kH/N,SRCCOPY);
pDC[i].TrueDC = pDC[i].KoalaDC;
}
//设定空格
pDC[N*N-1].KoalaDC = NULL;
pDC[N*N-1].TrueDC = NULL;
//随机排列图片
for(i=0; i<N*N; i++)
{
m = rand()%(N*N);
j = rand()%(N*N);
while(pDC[N*N-1].KoalaDC==pDC[m].KoalaDC) m = rand()%(N*N);
while(pDC[N*N-1].KoalaDC==pDC[j].KoalaDC) j = rand()%(N*N);
TempDC = pDC[m].KoalaDC;
pDC[m].KoalaDC = pDC[j].KoalaDC;
pDC[j].KoalaDC = TempDC;
}
hMDC = HDCTOHDC(hDc,pDC,kW,kH,Crect);
break;
}
case WM_LBUTTONDOWN:
{
HDC hDc = GetDC(hWnd);
X_M = LOWORD(lParam);
Y_M = HIWORD(lParam);
int quit=0;
for(int i=0; i<N*N; i++)
{
if(X_M>pDC[i].X && X_M<pDC[i].X+kW/N && Y_M>pDC[i].Y && Y_M<pDC[i].Y+kH/N)
{
for(int j=0; j<N*N; j++)
{
if( (pDC[i].X+kW/N+1==pDC[j].X && pDC[i].Y==pDC[j].Y && pDC[j].KoalaDC==NULL) ||
(pDC[i].X==pDC[j].X && pDC[i].Y+kH/N+1==pDC[j].Y && pDC[j].KoalaDC==NULL) ||
(pDC[i].X-kW/N-1==pDC[j].X && pDC[i].Y==pDC[j].Y && pDC[j].KoalaDC==NULL) ||
(pDC[i].X==pDC[j].X && pDC[i].Y-kH/N-1==pDC[j].Y && pDC[j].KoalaDC==NULL) )
{
TempDC = pDC[i].KoalaDC;
pDC[i].KoalaDC = pDC[j].KoalaDC;
pDC[j].KoalaDC = TempDC;
quit = 1;
hMDC = HDCTOHDC(hDc,pDC,kW,kH,Crect);
break;
}
}
}
if(quit==1) break;
}
ReleaseDC(hWnd,hDc);
break;
}
case WM_RBUTTONDOWN:
{
HDC hDc= GetDC(hWnd);
X_M = LOWORD(lParam);
Y_M = HIWORD(lParam);
if(n>=2) n=0;
for(int i=0; i<N*N; i++)
{
if(X_M>pDC[i].X && X_M<pDC[i].X+kW/N && Y_M>pDC[i].Y && Y_M<pDC[i].Y+kH/N)
{
if(++n==1) T1 = i;
else if(n==2) T2 = i;
if(n==1)
{
hMDC = CreateMemoryDC(hDc,Crect);
HPEN hPen = ::CreatePen(PS_SOLID,1,RGB(255,0,0));
SelectObject(hMDC,hPen);
Rectangle(hMDC,pDC[i].X-1,pDC[i].Y-1,pDC[i].X+kW/N+1,pDC[i].Y+kH/N+1);
int nX=0,nY=0;
for(int j=0; j<N*N; j++)
{
pDC[j].X = nX; pDC[j].Y = nY;
BitBlt(hMDC,nX,nY,kW/N,kH/N,pDC[j].KoalaDC,0,0,SRCCOPY);
if((j+1)%N==0)
{
nX = 0;
nY += kH/N+1;
}
else
{
nX+=kW/N+1;
}
}
BitBlt(hMDC,Crect.right/2+20,0,kW,kH,G_BitMapBKDC,0,0,SRCCOPY);
DeleteObject(hPen);
}
break;
}
}
if(n==2)
{
TempDC = pDC[T1].KoalaDC;
pDC[T1].KoalaDC = pDC[T2].KoalaDC;
pDC[T2].KoalaDC = TempDC;
hMDC = HDCTOHDC(hDc,pDC,kW,kH,Crect);
}
ReleaseDC(hWnd,hDc);
break;
}
case WM_TIMER:
{
switch(wParam)
{
case 1:
{
char Time[50];
sprintf(Time,"拼图 鼠标左键移动图片 右键直接交换图片 剩余时间:%02d:%02d",TimeOver_m,TimeOver_s);
SetWindowText(hWnd,Time);
HDC hDc = GetDC(hWnd);
if(OVER!=-1) BitBlt(hDc,0,0,Crect.right,Crect.bottom,hMDC,0,0,SRCCOPY);
else BitBlt(hDc,0,0,Crect.right,Crect.bottom,G_BitMapBKDC,0,0,SRCCOPY);
for(int i=0; i<N*N; i++)
if(pDC[i].KoalaDC!=pDC[i].TrueDC) { OVER = 0; break; }
if(OVER==1)
{
OVER = -1;
MessageBox(hWnd,"你太聪明了!","祝贺",NULL);
PostQuitMessage(0);
}
if(OVER!=-1) OVER = 1;
if(TimeOver_m==0 && TimeOver_s==0)
{
TimeOver_m=-1;
MessageBox(hWnd,"TIME OVER!!!","提示",NULL);
PostQuitMessage(0);
}
ReleaseDC(hWnd,hDc);
break;
}
case 2:
{
if(OVER!=-1) TimeOver_s--;
if(TimeOver_s<=0 && TimeOver_m>0) { TimeOver_m--; TimeOver_s=59; }
if(TimeOver_m==0 && TimeOver_s<0) { TimeOver_m=0; TimeOver_s=0; }
if(TimeOver_m==0 && TimeOver_s==30) MessageBox(hWnd,"时间不多了!!!","提示",NULL);
break;
}
}
break;
}
case WM_DESTROY:
{
::PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
int _stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrelnstance,
LPSTR lpCmdLine,
int nShowCmd)
{
G_hInst = hInstance;
G_BitMapBKDC = LoadBitMap(G_hInst,"koala.bmp",kW,kH);
int YY1= GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
int XX1= GetSystemMetrics(SM_CYSIZEFRAME);
int Scrwidth = GetSystemMetrics(SM_CXSCREEN); //显示器宽度
int Scrheight = GetSystemMetrics(SM_CYSCREEN); //显示器高度
//1、设置窗体属性
WNDCLASSEX wcex;
// 结构体的大小
wcex.cbSize = sizeof(WNDCLASSEX);
// 窗体类的样式
wcex.style = CS_HREDRAW | CS_VREDRAW;
// *窗体回调函数
wcex.lpfnWndProc = (WNDPROC)WndProc;
// 窗体类额外字节数,通常为0
wcex.cbClsExtra = 0;
// 窗体实例额外字节数,通常为0
wcex.cbWndExtra = 0;
// *应用程序实例句柄
wcex.hInstance = hInstance;
wcex.hIcon = (HICON)LoadImage(NULL,"dnf.ico",IMAGE_ICON,48,48,LR_LOADFROMFILE); // 窗体大图标
wcex.hCursor = (HICON)LoadImage(NULL,"click.ico",IMAGE_ICON,36,36,LR_LOADFROMFILE); // 窗体鼠标光标样式
wcex.hbrBackground = (HBRUSH) GetStockObject (NULL) ; // 窗体背景色
wcex.lpszMenuName = NULL; // 窗体主菜单
// *窗体类名称
wcex.lpszClassName = "FW";
wcex.hIconSm = NULL; // 窗体小图标
//2、注册窗体
RegisterClassEx(&wcex);
//3、创建窗体
HWND hWnd = CreateWindow(
"FW", // *窗体类名称
"位图", // 窗体标题名
WS_BORDER|WS_MINIMIZEBOX|WS_SYSMENU, // 窗体外观样式
(Scrwidth-(kW+XX1)*2)/2, // 窗体在屏幕上的水平位置
(Scrheight-kH-YY1)/2, // 窗体在屏幕上的垂直位置
(kW+XX1)*2+20, // 窗口的宽度
kH+YY1, // 窗口的高度
NULL, // 父窗体句柄
NULL, // 窗口菜单句柄
hInstance, // *创建窗体的应用程序实例句柄
NULL); // 创建窗体时的额外信息,通常为NULL
if (NULL == hWnd)
{
return FALSE;
}
//4、显示窗体
ShowWindow(hWnd, nShowCmd);
//5、 更新窗体
UpdateWindow(hWnd);
//6、主消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) // 从消息队列中获取消息
{
TranslateMessage(&msg); // 转换消息
DispatchMessage(&msg); // 分发消息给回调函数
}
return msg.wParam;
}
HDC CreateMemoryDC(HDC hClientDC,RECT rect)
{
HDC hMDC = ::CreateCompatibleDC(hClientDC);
HBITMAP hBitMap = CreateCompatibleBitmap(hClientDC,
rect.right-rect.left,
rect.bottom-rect.top);
::SelectObject(hMDC,hBitMap);
::FillRect(hMDC,&rect,NULL);
::DeleteObject(hBitMap);
return hMDC;
}
HDC HDCTOHDC(HDC hClientDC,PUZZLE BitMapDC[],long width,long height,RECT ClientRect)
{
hMDC
WIN32 API拼图小游戏
3星 · 超过75%的资源 需积分: 10 197 浏览量
2011-05-17
22:27:58
上传
评论 1
收藏 2.94MB ZIP 举报
qq978087521
- 粉丝: 0
- 资源: 1
最新资源
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
- python-leetcode面试题解之第168题Excel表列名称-题解.zip
- python-leetcode面试题解之第167题两数之和II输入有序数组-题解.zip
- python-leetcode面试题解之第166题分数到小数-题解.zip
- python-leetcode面试题解之第165比较版本号-题解.zip
- python-leetcode面试题解之第163题缺失的区间-题解.zip
- python-leetcode面试题解之第162题寻找峰值-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈