VC拼方块游戏
VC拼方块游戏
运行下面代码
// pics.cpp : 定义应用程序的入口点。 #include "stdafx.h" #include "pics.h" #include "stdlib.h" #include "time.h" #include <math.h> //图片水平方向切分的块数 #define IMGCLIPW 4 //图片垂直方向切分的块数 #define IMGCLIPH 4 //图片地址 #define IMGSRC L"C\:\\Users\\sqqihao\\Desktop\\node\\jpg.bmp" //图片宽度和高度 #define IMGW 400 #define IMGH 400 #define IMGBLOCK IMGW/IMGCLIPW #define MAX_LOADSTRING 100 struct Block{ int left; int top; }; Block arr[IMGCLIPH*IMGCLIPH]; // 全局变量: HINSTANCE hInst; // 当前实例 WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 VOID InitGame(Block _arr[IMGCLIPH*IMGCLIPH]); VOID ResetGame(Block _arr[IMGCLIPH*IMGCLIPH]); VOID ShowImage(HDC hdc, Block _arr[IMGCLIPH*IMGCLIPH]); VOID resizeWindow(HWND hWnd); //初始化加载图片 VOID displayImage(HDC hdc); int getWhilte(Block _arr[IMGCLIPH*IMGCLIPH]); //数组中两个不同的索引互相替换 VOID switchBlock(Block _arr[IMGCLIPH*IMGCLIPH], int i, int j); int checkSuccess(Block _arr[IMGCLIPH*IMGCLIPH]); // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK Done(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 // 初始化全局字符串 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_PICS, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PICS)); MSG msg; // 主消息循环: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PICS)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_PICS); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // // 注释: // 在此函数中,我们在全局变量中保存实例句柄并 // 创建和显示主程序窗口 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // 将实例句柄存储在全局变量中 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } VOID InitGame(Block _arr[IMGCLIPH*IMGCLIPH]) { int i , left , top; for (i = 0; i < IMGCLIPH*IMGCLIPW-1; i++) { left = i % IMGCLIPW; top = floor(i / IMGCLIPH); _arr[i] = { left*IMGBLOCK ,top*IMGBLOCK }; } _arr[IMGCLIPH*IMGCLIPW-1] = { -1 ,-1 }; } //随机切分图片 VOID ResetGame(Block _arr[IMGCLIPH*IMGCLIPH]) { int i, num; Block temp; srand(time(NULL)); for (i = 0; i < IMGCLIPH*IMGCLIPW; i++) { num = rand() % (IMGCLIPH*IMGCLIPH); temp = _arr[num]; _arr[num] = _arr[i]; _arr[i] = temp; } } //根据当前的数据,移动图片到VIEW VOID ShowImage(HDC hdc ,Block _arr[IMGCLIPH*IMGCLIPH]) { int i, left , top, posX, posY; HDC hdcMem; HBITMAP hbmp; //一张位图的句柄 BITMAP bmp; hdcMem = CreateCompatibleDC(hdc); //创建一个与指定设备兼容的内存设备上下文环境 hbmp = (HBITMAP)LoadImage(NULL, IMGSRC, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); GetObject(hbmp, sizeof(BITMAP), &bmp); //得到一个位图对象 SelectObject(hdcMem, hbmp); for (i = 0; i < IMGCLIPH*IMGCLIPW; i++) { posX = i % IMGCLIPW; posY = floor(i / IMGCLIPH); left = _arr[i].left; top = _arr[i].top; if (left == -1 && top == -1) { Rectangle(hdc, posX*IMGBLOCK, posY*IMGBLOCK, (posX+1)*IMGBLOCK, (posY+1)*IMGBLOCK); } else { BitBlt(hdc, posX*IMGBLOCK, posY*IMGBLOCK, IMGW, IMGH, hdcMem, left, top, SRCCOPY); //显示位图 } } } VOID resizeWindow(HWND hWnd) { RECT rect; int nWinX, nWinY, nClientX, nClientY, nScreenWidth, nScreenHeight, userWidth, userHeight; GetWindowRect(hWnd, &rect); //获取窗口大小 nWinX = rect.right - rect.left; nWinY = rect.bottom - rect.top; //获取客户区大小 GetClientRect(hWnd, &rect); nClientX = rect.right - rect.left; nClientY = rect.bottom - rect.top; //获取屏幕的宽高 nScreenWidth = GetSystemMetrics(SM_CXSCREEN); nScreenHeight = GetSystemMetrics(SM_CYSCREEN); userWidth = 415; userHeight = 471; MoveWindow(hWnd, (nScreenWidth - userWidth) / 2, (nScreenHeight - userHeight) / 2, userWidth, userHeight, TRUE); } //初始化加载图片 VOID displayImage(HDC hdc) { HDC hdcMem; HBITMAP hbmp; //一张位图的句柄 BITMAP bmp; hdcMem = CreateCompatibleDC(hdc); //创建一个与指定设备兼容的内存设备上下文环境 hbmp = (HBITMAP)LoadImage(NULL, IMGSRC, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); GetObject(hbmp, sizeof(BITMAP), &bmp); //得到一个位图对象 SelectObject(hdcMem, hbmp); BitBlt(hdc, 0, 0, IMGW, IMGH, hdcMem, 0, 0, SRCCOPY); //显示位图 } int getWhilte( Block _arr[IMGCLIPH*IMGCLIPH] ) { for (int i = 0; i < IMGCLIPH*IMGCLIPW; i++) { if (_arr[i].left == -1 && _arr[i].top == -1) { return i; } } } //数组中两个不同的索引互相替换 VOID switchBlock(Block _arr[IMGCLIPH*IMGCLIPH], int i, int j) { Block temp = _arr[i]; _arr[i] = _arr[j]; _arr[j] = temp; } int checkSuccess(Block _arr[IMGCLIPH*IMGCLIPH]) { int i, left, top , flag = 1; for (i = 0; i < IMGCLIPH*IMGCLIPW - 1; i++) { left = i % IMGCLIPW; top = floor(i / IMGCLIPH); if (left*IMGBLOCK!=_arr[i].left && top*IMGBLOCK!=_arr[i].top) { flag = 0; } } return flag; } // // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { resizeWindow(hWnd); InitGame(arr); } break; case WM_COMMAND: { int wmId = LOWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: //DestroyWindow(hWnd); ResetGame(arr); InvalidateRect(hWnd, NULL, true); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { //获取白色方块的位置; int idx = getWhilte(arr); switch(wParam) { case VK_UP: //判断方块是否可以上移,如果可以那么就移动 //判断白色方块 if (idx - IMGCLIPH >= 0) { //替换位置 switchBlock(arr, idx, idx - IMGCLIPH); InvalidateRect(hWnd, NULL, true); } break; case VK_DOWN: if (idx + IMGCLIPH < IMGCLIPH*IMGCLIPH) { //替换位置 switchBlock(arr, idx, idx + IMGCLIPH); InvalidateRect(hWnd, NULL, true); } break; case VK_LEFT: if ( idx%IMGCLIPH -1>=0 ) { //替换位置 switchBlock(arr, idx, idx-1); InvalidateRect(hWnd, NULL, true); } break; case VK_RIGHT: if (idx%IMGCLIPH +1 < IMGCLIPH) { //替换位置 switchBlock(arr, idx, idx + 1); InvalidateRect(hWnd, NULL, true); } break; default: break; } int result = checkSuccess(arr); if (result == 1) { DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Done); } } break; case WM_PAINT: { // TODO: 在此处添加使用 hdc 的任何绘图代码... HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); //为指定句柄hwnd窗口进行绘画准备工作 //displayImage(hdc); ShowImage(hdc, arr); EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // “关于”框的消息处理程序。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } // “关于”框的消息处理程序。 INT_PTR CALLBACK Done(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
1
天道酬勤
本文作者:方方和圆圆
本文链接:https://www.cnblogs.com/diligenceday/p/6082576.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
C 和C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2013-11-20 JS模式:策略模式,感觉就是一个闭包存储信息,然后是加一些验证方法--还看了老半天