⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maze32.cpp

📁 手势分类器设计,很好很强大
💻 CPP
字号:

int lenth=30,width=40;
#define LENTH lenth
#define WIDTH width
#include<windows.h>
#include<wingdi.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include"resource.h"
#include"tidymaze.h"
#include"createmaze.h"
#include"findway.h"

HINSTANCE hInst;
HWND hWnd;
RECT rt,wndrt;
RECT cub,wall;
TCHAR szName[]="Maze";
int maze[100][100];
int s=10,t=0;

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK Define(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK Help(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK About(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK Gamewin(HWND,UINT,WPARAM,LPARAM);
VOID CALLBACK TimerProc (HWND,UINT,UINT,DWORD);

int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdshow)
{
	hInst=hInstance;
	MSG msg;
	WNDCLASS wndclass;

	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)COLOR_WINDOW;
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=NULL;
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=(WNDPROC)WindowProc;
	wndclass.lpszClassName=szName;
	wndclass.lpszMenuName=(LPCTSTR)IDM_MENU;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;

	RegisterClass(&wndclass);

	hWnd=CreateWindow(szName,szName,WS_SYSMENU|WS_MINIMIZEBOX|WS_HSCROLL|WS_VSCROLL,
		CW_USEDEFAULT,CW_USEDEFAULT,
		CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,hInstance,NULL);

	ShowWindow(hWnd,nCmdshow);

	if(t==0) SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
	Createmaze(maze);

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	HDC hDC;
	SCROLLINFO si;
	PAINTSTRUCT ps;
	HPEN hPen=NULL;
	HBRUSH hBrush=NULL;
	CHAR szWait[]="正在绘制迷宫,请稍候……";

	static int i=0,j=0,x,y,g=0;
	static int hzPos=0,vsPos=0;
	static int hzMove=0,vsMove=0;
	static int xPos,yPos;

	xPos=LOWORD(lParam);
	yPos=HIWORD(lParam);

	HMENU hMenu=GetMenu(hWnd);

	switch(uMsg)
	{
	case WM_CREATE:
		hzPos=0;
		vsPos=0;

		si.cbSize=sizeof(si); 
		si.fMask=SIF_RANGE|SIF_PAGE|SIF_POS;
		si.nMin=0;
		si.nMax=WIDTH*s-1;
		si.nPage=40*s;
		si.nPos=0;

		SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);
	
		si.fMask=SIF_RANGE|SIF_PAGE|SIF_POS;
		si.nMin=0;
		si.nMax=LENTH*s-1;
		si.nPage=30*s;
		si.nPos=0;

		SetScrollInfo(hWnd, SB_VERT, &si, TRUE);

		GetClientRect(hWnd,&rt);
		GetWindowRect(hWnd,&wndrt);

		SetWindowPos(hWnd,HWND_TOP,0,0,wndrt.right-wndrt.left+(40*s-rt.right-1),wndrt.bottom-wndrt.top+(30*s-rt.bottom-1),SWP_NOMOVE);

		return 0;

	case WM_COMMAND:
		hDC=GetDC(hWnd);

		switch(LOWORD(wParam))
		{
		case IDG_EASY:
			CheckMenuItem(hMenu,IDG_EASY,MF_CHECKED);
			CheckMenuItem(hMenu,IDG_NORMAL,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_HARD,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_DEFINE,MF_UNCHECKED);
			lenth=30;
			width=40;
			SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
			break;
		case IDG_NORMAL:
			CheckMenuItem(hMenu,IDG_EASY,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_NORMAL,MF_CHECKED);
			CheckMenuItem(hMenu,IDG_HARD,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_DEFINE,MF_UNCHECKED);
			lenth=45;
			width=60;
			SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
			break;
		case IDG_HARD:
			CheckMenuItem(hMenu,IDG_EASY,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_NORMAL,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_HARD,MF_CHECKED);
			CheckMenuItem(hMenu,IDG_DEFINE,MF_UNCHECKED);
			lenth=60;
			width=80;
			SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
			break;
		case IDG_DEFINE:
			CheckMenuItem(hMenu,IDG_EASY,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_NORMAL,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_HARD,MF_UNCHECKED);
			CheckMenuItem(hMenu,IDG_DEFINE,MF_CHECKED);
			if(DialogBox(hInst,(LPCTSTR)IDD_DEFINE,hWnd,(DLGPROC)Define)==TRUE)
			SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
			break;

		case IDG_START:
			EnableMenuItem(hMenu,IDG_OVER,MF_ENABLED);
			FillRect(hDC,&rt,NULL);
			TextOut(hDC,0,0,szWait,strlen(szWait));
			SetTimer(hWnd,1,1,NULL);

			FillRect(hDC,&rt,NULL);

			Createmaze(maze);

			for(i=0,j=0;j<WIDTH;j++)
			{
				if(maze[i][j]==0) break;
				else continue;
			}
			cub.left=j*s;
			cub.top=i*s;
			cub.right=cub.left+s;
			cub.bottom=cub.top+s;
			x=j;y=i;
			g=1;
			
			SendMessage(hWnd,WM_CREATE,NULL,NULL);
			SendMessage(hWnd,WM_PAINT,NULL,NULL);

			break;

		case IDG_OVER:
			EnableMenuItem(hMenu,IDG_OVER,MF_GRAYED);
			Tidymaze(maze);
			for(i=0,j=0;j<WIDTH-1;j++)
			if(maze[i][j]==0) break;
			Findway(maze,i,j);
			g=0;

			FillRect(hDC,&cub,NULL);
			SendMessage(hWnd,WM_PAINT,NULL,NULL);

			ReleaseDC(hWnd,hDC);
			break;

		case IDD_HELP:
			DialogBox(hInst,(LPCTSTR)IDD_HELP,hWnd,(DLGPROC)Help);
			break;

		case IDD_ABOUT:
			DialogBox(hInst,(LPCTSTR)IDD_ABOUT,hWnd,(DLGPROC)About);
			break;

		case IDG_CLOSE:
			PostQuitMessage(0);
			break;

		default:
			break;
		}
		ReleaseDC(hWnd,hDC);

		return 0;

		//

	case WM_HSCROLL:
		switch(LOWORD(wParam))
		{
		case SB_THUMBTRACK:
			SetScrollPos(hWnd,SB_HORZ,HIWORD(wParam),TRUE);
			hzPos=HIWORD(wParam);
			break;
		}
		SendMessage(hWnd,WM_PAINT,NULL,NULL);

		return 0;

	case WM_VSCROLL:
		switch(LOWORD(wParam))
		{
		case SB_THUMBTRACK:
			SetScrollPos(hWnd,SB_VERT,HIWORD(wParam),TRUE);
			vsPos=HIWORD(wParam);
			break;
		}
		SendMessage(hWnd,WM_PAINT,NULL,NULL);

		return 0;

		//

	case WM_LBUTTONUP:
		t=0;

		return 0;

	case WM_LBUTTONDOWN:
		if(xPos>cub.left&&xPos<cub.right&&yPos>cub.top&&yPos<cub.bottom)
			t=1;

		return 0;

	case WM_MOUSEMOVE:
		hDC=GetDC(hWnd);

		if(t==1&&(xPos>cub.left||xPos<cub.right||yPos>cub.top||yPos<cub.bottom)&&wParam==MK_LBUTTON)
		{
			FillRect(hDC,&cub,NULL);
			if(xPos>cub.right&&maze[y][x+1]!=1) x++;
			if(xPos<cub.left&&maze[y][x-1]!=1) x--;
			if(yPos>cub.bottom&&maze[y+1][x]!=1) y++;
			if(yPos<cub.top&&maze[y-1][x]!=1) y--;

			cub.left=x*s-hzPos;
			cub.top=y*s-vsPos;
			cub.right=cub.left+s;
			cub.bottom=cub.top+s;

			hBrush=CreateSolidBrush(RGB(255,0,0));
			FillRect(hDC,&cub,hBrush);
			DeleteObject(hBrush);
		
			ReleaseDC(hWnd,hDC);

			if(maze[y][x]==3)
			{
				if(DialogBox(hInst,(LPCTSTR)IDD_GAMEWIN,hWnd,(DLGPROC)Gamewin)==TRUE)
					SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
				else
					SendMessage(hWnd,WM_DESTROY,NULL,NULL);
			}
		}

		return 0;

		//

	case WM_KEYDOWN:
		hDC=GetDC(hWnd);

		hBrush=CreateSolidBrush(RGB(255,0,0));

		switch(wParam)
		{
		case 0x26:
			if(maze[y-1][x]!=1&&y!=0)
			{FillRect(hDC,&cub,NULL);cub.top-=s;y--;}
			break;
		case 0x25:
			if(maze[y][x-1]!=1)
			{FillRect(hDC,&cub,NULL);cub.left-=s;x--;}
			break;
		case 0x27:
			if(maze[y][x+1]!=1)
			{FillRect(hDC,&cub,NULL);cub.left+=s;x++;}
			break;
		case 0x28:
			if(maze[y+1][x]!=1&&y!=LENTH-1)
			{FillRect(hDC,&cub,NULL);cub.top+=s;y++;}
			break;
		default:
			break;
		}

		cub.bottom=cub.top+s;
		cub.right=cub.left+s;

		FillRect(hDC,&cub,hBrush);

		DeleteObject(hBrush);
		ReleaseDC(hWnd,hDC);
		
		if(maze[y][x]==3)
		{
			if(DialogBox(hInst,(LPCTSTR)IDD_GAMEWIN,hWnd,(DLGPROC)Gamewin)==TRUE)
				SendMessage(hWnd,WM_COMMAND,IDG_START,NULL);
			else
				SendMessage(hWnd,WM_DESTROY,NULL,NULL);
		}

		return 0;

		//

	case WM_PAINT:
		hDC=GetDC(hWnd);

		BeginPaint(hWnd, &ps);
		if(g==1)
		{
			cub.left=x*s-hzPos;
			cub.top=y*s-vsPos;
			cub.right=cub.left+s;
			cub.bottom=cub.top+s;
			hBrush=CreateSolidBrush(RGB(255,0,0));
			FillRect(hDC,&cub,hBrush);
			DeleteObject(hBrush);
		}

		for(i=0;i<LENTH;i++)
			for(j=0;j<WIDTH;j++)
			{
				wall.top=i*s-vsPos;
				wall.left=j*s-hzPos;
				wall.bottom=i*s+s-vsPos;
				wall.right=j*s+s-hzPos;
				switch(maze[i][j])
				{
				case 0:
					if(wall.left==cub.left&&wall.top==cub.top&&wall.right==cub.right&&wall.bottom==cub.bottom) break;
					else FillRect(hDC,&wall,NULL);
					break;
				case 1:
					hBrush=CreateSolidBrush(RGB(0,0,0));
					FillRect(hDC,&wall,hBrush);
					break;
				case 3:
					FillRect(hDC,&wall,NULL);
					break;
				case 4:
					FillRect(hDC,&wall,NULL);
					break;
				default:
					hBrush=CreateSolidBrush(RGB(0,0,255));
					FillRect(hDC,&wall,hBrush);
					break;
				}
				DeleteObject(hBrush);
			}

		EndPaint(hWnd, &ps);
		ReleaseDC(hWnd,hDC);

		return 0;

		//

	case WM_DESTROY:
		KillTimer (hWnd,1);
		PostQuitMessage(0);

		return 0;
	default:
		return DefWindowProc(hWnd,uMsg,wParam,lParam);
	}

	return 0;
}


LRESULT CALLBACK Define(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	int xTemp,yTemp;
	HWND hWidth=GetDlgItem(hDlg,IDC_WIDTH);
	HWND hLenth=GetDlgItem(hDlg,IDC_LENTH);

	switch (message)
	{
		case WM_INITDIALOG:
				SetWindowText(hWidth,"40");
				SetWindowText(hLenth,"30");
				return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam)==IDOK) 
			{
				xTemp=GetDlgItemInt(hDlg,IDC_WIDTH,NULL,TRUE);
				yTemp=GetDlgItemInt(hDlg,IDC_LENTH,NULL,TRUE);

				if(xTemp<40) width=40;
				else if(xTemp>100) width=100;
				else width=xTemp;

				if(yTemp<30) lenth=30;
				else if(yTemp>100) lenth=100;
				else lenth=yTemp;

				EndDialog(hDlg,LOWORD(wParam));
				return TRUE;
			}
			else if (LOWORD(wParam)==IDCANCEL)
			{
				EndDialog(hDlg,LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

LRESULT CALLBACK Help(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
				return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL) 
			{
				EndDialog(hDlg,LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
				return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL) 
			{
				EndDialog(hDlg,LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}
LRESULT CALLBACK Gamewin(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
			MessageBeep(MB_OK);

			RECT dlgrt;

			GetWindowRect(hWnd,&wndrt);
			GetWindowRect(hDlg,&dlgrt);

			SetWindowPos(hDlg,HWND_TOP,wndrt.left+((wndrt.right-wndrt.left)-(dlgrt.right-dlgrt.left))/2,wndrt.top+((wndrt.bottom-wndrt.top)-(dlgrt.bottom-dlgrt.top))/2,0,0,SWP_NOSIZE);
			
			return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL) 
			{
				EndDialog(hDlg,LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -