• Win32实现迷宫


    跟着杨立祥老师的课程,为了完成扫雷的作业,打算先用DFS/BFS实现路径搜索的简单Demo。

    生成迷宫:

    /*
    扫雷程序生成方砖
    */
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <windowsx.h>
    #include "resource.h"
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,
    	PSTR szCmdLine, int iCmdshow)
    {
    	static TCHAR szAppName[] = TEXT("Maze");
    	HWND		 hwnd;
    	MSG			 msg;
    	WNDCLASS	 wndclass;
    
    	wndclass.style = CS_HREDRAW | CS_VREDRAW;
    	wndclass.lpfnWndProc = WndProc;
    	wndclass.cbClsExtra = 0;
    	wndclass.cbWndExtra = 0;
    	wndclass.hInstance = hInstance;
    	wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
    	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wndclass.lpszMenuName = NULL;
    	wndclass.lpszClassName = szAppName;
    
    	if (!RegisterClass(&wndclass))
    	{
    		MessageBox(NULL, TEXT("registered error"), szAppName, MB_ICONERROR);
    	}
    	hwnd = CreateWindow(szAppName,
    		TEXT("Mazes"),
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		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)
    {
    	static HBITMAP	hBitmap;
    	static int		cxClient, cyClient, cxSource, cySource, xClick, yClick;
    	static int		leftPos, rightPos, topPos, bottomPos;
    	BITMAP			bitmap;
    	HDC				hdc, hdcMem;
    	PAINTSTRUCT		ps;
    	int				x, y;
    	HINSTANCE		hInstance;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		PlaySound(TEXT("start.wav"), NULL, SND_FILENAME | SND_ASYNC);
    		srand((unsigned)time(NULL));
    		hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
    		hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
    		GetObject(hBitmap, sizeof(BITMAP), &bitmap);
    		cxSource = bitmap.bmWidth;
    		cySource = bitmap.bmHeight / 3;
    		
    		return 0;
    
    	case WM_SIZE:
    		cxClient = GET_X_LPARAM(lParam);
    		cyClient = GET_Y_LPARAM(lParam);
    		return 0;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    		hdcMem = CreateCompatibleDC(hdc);
    		SelectObject(hdcMem, hBitmap);
    
    		//方砖的范围(左上角)
    		topPos = cySource * 2;
    		leftPos = cxSource * 2;
    
    		for (y = topPos; y <= cyClient - cySource * 3; y += cySource)
    		{
    			for (x = leftPos; x <= cxClient - cxSource * 3; x += cxSource)
    			{
    
    				if (rand() % 4 == 1)
    				{
    					BitBlt(hdc, x, y, cxSource, cySource, hdcMem, 0, 0, SRCCOPY);
    				}
    				else
    				{
    					BitBlt(hdc, x, y, cxSource, cySource, hdcMem, 0, cySource, SRCCOPY);
    				}
    			}
    		}
    		rightPos = x - cxSource;
    		bottomPos = y - cySource;
    		//左上:右下为出口
    		BitBlt(hdc, cxSource * 2, cySource * 2, cxSource, cySource, hdcMem, 0, cySource, SRCCOPY);
    		BitBlt(hdc, rightPos, bottomPos, cxSource, cySource, hdcMem, 0, cySource, SRCCOPY);
    
    		DeleteDC(hdcMem);
    		EndPaint(hwnd, &ps);
    		return 0;
    	case WM_LBUTTONDOWN:
    		xClick = GET_X_LPARAM(lParam);
    		yClick = GET_Y_LPARAM(lParam);
    		//无效区
    		if (xClick < leftPos || xClick > rightPos + cxSource || yClick < topPos || yClick > bottomPos + cySource)
    		{
    			break;
    		}
    
    		for (y = topPos; y <= bottomPos; y += cySource)
    		{
    			if (yClick >= y && yClick <= y + cySource)
    			{
    				yClick = y;
    				break;
    			}
    		}
    
    		for (x = leftPos; x <= rightPos; x += cxSource)
    		{
    			if (xClick >= x && xClick <= x + cxSource)
    			{
    				xClick = x;
    				break;
    			}
    		}
    		hdc = GetDC(hwnd);
    		hdcMem = CreateCompatibleDC(hdc);
    		SelectObject(hdcMem, hBitmap);
    		BitBlt(hdc, xClick, yClick, cxSource, cySource, hdcMem, 0, cySource * 2, SRCCOPY);
    		DeleteDC(hdcMem);
    		ReleaseDC(hwnd, hdc);
    		return 0;
    	case WM_DESTROY:
    		DeleteObject(hBitmap);
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }

    效果图:


    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    【转】Uiautomator Api浅析
    【转】UiAutomator简要介绍
    后台自动启动appium
    adb通过wifi连接Android设备
    Python字符串处理和输入输出
    OJ题目输出的生成
    Weka的使用和二次开发(朴素贝叶斯及其属性选择)
    PointNet++论文理解和代码分析
    VGG-16复现
    二维偏序-最长上升子序列的两种求解方式
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834701.html
Copyright © 2020-2023  润新知