//Download by http://www.codefans.net
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