别踩白块儿之禅模式 windows程序实现

来源:互联网 发布:石大在线网络教育 编辑:程序博客网 时间:2024/05/01 07:50

别踩白块儿之禅模式 windows程序实现

代码如下

#include <Windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(//程序入口,WINAPI是一种函数调用约定,用于表明如何生成在堆栈中放置调用参数的机器代码HINSTANCE hInstance  //实例句柄,标识该程序, HINSTANCE hPreInstance  //16位中用于标识该程序前一实例,32位中不再采用,参数为NULL, LPSTR szCmdLine  //调用时的命令行, int iCmdShow)   //窗口显示方式{static TCHAR szName[] = TEXT("HIYUN");HWND hwnd;MSG msg;WNDCLASS wc;wc.style = CS_VREDRAW | CS_HREDRAW;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);wc.hInstance = hInstance;wc.lpfnWndProc = WndProc;wc.lpszMenuName = NULL;wc.lpszClassName = szName;if (!RegisterClass(&wc)){MessageBox(NULL, TEXT("注册失败!"), TEXT("失败"), MB_OK | MB_ICONERROR);}hwnd = CreateWindow(szName, TEXT("别踩白块儿之禅模式 - 闲云野鹤制作,QQ群116920287"), WS_OVERLAPPEDWINDOW,400, 100, 400, 600,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam){HDC hdc;PAINTSTRUCT ps;RECT rect;TCHAR szBuff[50];static HBRUSH brushPass = CreateSolidBrush(RGB(223, 223, 223));static int i, j, x, y, tx, ty;static int runing, cxChar, cyChar, cxClient, cyClient, cxSquare, cySquare;static TCHAR PlayName[] = TEXT("YUN");static ULONG score = 0, t;static int Loc[20];switch (message){case WM_CREATE:runing = 0;hdc = GetDC(hwnd);TEXTMETRIC tm;GetTextMetrics(hdc, &tm);cxChar = tm.tmAveCharWidth;cyChar = tm.tmHeight + tm.tmExternalLeading;ReleaseDC(hwnd, hdc);return 0;case WM_SIZE:cxClient = LOWORD(lparam);cyClient = HIWORD(lparam);cxSquare = cxClient / 4;cySquare = (int)(cxSquare * 1.5);for (i = 0; i <= cyClient / cySquare + 2; ++i){Loc[i] = rand() % 4;}return 0;case WM_LBUTTONDOWN:tx = x = LOWORD(lparam);ty = y = HIWORD(lparam);x /= cxSquare;y = (cyClient - y) / cySquare;if (Loc[0] == x && y == 0 && !runing){runing = 1;InvalidateRect(hwnd, NULL, true);}else if (Loc[1] == x && y == 1 && runing){score++;for (i = 0; i <= cyClient / cySquare + 1; ++i){Loc[i] = Loc[i + 1];}Loc[i] = rand() % 4;InvalidateRect(hwnd, NULL, true);}return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);SetBkMode(hdc, TRANSPARENT);SetTextColor(hdc, RGB(255, 0, 0));for (i = 1; i < 4; ++i){MoveToEx(hdc, cxSquare * i, 0, NULL);LineTo(hdc, cxSquare * i, cyClient);}for (i = 0; i <= cyClient / cySquare + 1; ++i){MoveToEx(hdc, 0, cyClient - cySquare * i, NULL);LineTo(hdc, cxClient, cyClient - cySquare * i);j = Loc[i];if (i == 0 && runing)SelectObject(hdc, brushPass);elseSelectObject(hdc, GetStockObject(BLACK_BRUSH));Rectangle(hdc, j * cxSquare, cyClient - cySquare * (i + 1),cxSquare * (j + 1) + 1, cyClient - cySquare * i + 1);if (!runing && i == 0){TextOut(hdc, j * cxSquare + cxSquare / 2 - cxChar * 1.5, cyClient - cySquare / 2,szBuff, wsprintf(szBuff, TEXT("开始")));}}TextOut(hdc, cxChar, cyChar, szBuff,wsprintf(szBuff, TEXT("Player:%s"), PlayName));t = wsprintf(szBuff, TEXT("Score: %ld"), score);TextOut(hdc, cxClient - (t + 2) * cxChar, cyChar, szBuff, t);EndPaint(hwnd, &ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wparam, lparam);}


1 0