九宫格拼图游戏

int GetPosX(int);
int GetPosY(int);

int GetPosX(int n)
{
switch (n)
{
case 1: return 0;
case 4: return 0;
case 7: return 0;
case 2: return 1;
case 5: return 1;
case 8: return 1;
case 3: return 2;
case 6: return 2;
case 9: return 2;
default: return 3;
}
}
int GetPosY(int n)
{
switch (n)
{
case 1: return 0;
case 2: return 0;
case 3: return 0;
case 4: return 1;
case 5: return 1;
case 6: return 1;
case 7: return 2;
case 8: return 2;
case 9: return 2;
default: return 3;
}
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HBITMAP hbmp;
HDC  hdcmem;
BITMAP bitmap;
static RECT  rect;
static int  block[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 0 }, i, j, nSide;


switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);


switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
srand((unsigned)time(NULL));
for (i = 0; i < 9; ++i)
do
{
block[i] = rand() % 9;
for (j = 0; j <= i; ++j)
{
if (block[i] == block[j])
break;
}
} while (i != j);


break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
hdcmem = CreateCompatibleDC(hdc);
hbmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP));
GetObject(hbmp, sizeof(BITMAP), &bitmap);
GetClientRect(hWnd, &rect);
nSide = bitmap.bmWidth / 3;
SelectObject(hdcmem, hbmp);
for (i = 0; i < 9; ++i)
{
BitBlt(hdc, GetPosX(i + 1)*nSide, GetPosY(i + 1)*nSide, nSide, nSide, hdcmem,
GetPosX(block[i]) *nSide, GetPosY(block[i]) * nSide, SRCCOPY);
}
j = 0;
for (i = 0; i < 9; ++i)
{
if (8 == i)
{
if (0 == block[i])
++j;
}
else
{
if (i + 1 == block[i])
++j;
}
}
if (9 == j)
{
MessageBox(hWnd, L"恭喜完成!", NULL, MB_OK);
}


DeleteDC(hdcmem);
DeleteObject(hbmp);
EndPaint(hWnd, &ps);
break;
case WM_KEYDOWN:


switch (wParam)
{
case VK_DOWN:
for (i = 0; i < 9; ++i)
if (!block[i])
if (i > 2)
{
j = block[i];
block[i] = block[i - 3];
block[i - 3] = j;
break;
}
break;
case VK_UP:
for (i = 0; i < 9; ++i)
if (!block[i])
if (i < 7)
{
j = block[i];
block[i] = block[i + 3];
block[i + 3] = j;
break;
}
break;
case VK_LEFT:
for (i = 0; i < 9; ++i)
if (!block[i])
if (i % 3 < 2)
{
j = block[i];
block[i] = block[i + 1];
block[i + 1] = j;
break;
}
break;
case VK_RIGHT:
for (i = 0; i < 9; ++i)
if (!block[i])
if (i % 3 > 0)
{
j = block[i];
block[i] = block[i - 1];
block[i - 1] = j;
break;
}
break;
}
InvalidateRect(hWnd, &rect, TRUE);
break;
case WM_DESTROY:


PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值