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

📄 maze.cpp

📁 Win32下立体迷宫程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					if(waycount<allwaycount-1)
					{
						wsprintf(allmessage,"\n共有%d条路,这是第%d条路	\n\n     是否继续?",allwaycount,waycount+1);
						if(MessageBox(hWnd,allmessage,"成功",MB_YESNO|MB_ICONQUESTION)==IDYES)
						{
							SetTimer(hWnd,waycount+3,50,NULL);
							waycount++;
							all=0;
							i=0; j=0;
							MazeChange(maze,mazeall[game-IDM_GAME01]);
							MazeDraw(hWnd);
							break;
						}
						else
						{
							all=0;
							waycount=0;
							allwaycount=0;
							i=0;j=0;
							break;
						}
					}
					else
					{
						all=0;
						waycount=0;
						i=0;j=0;
						wsprintf(allmessage,"\n共有%d条路,这是最后一条路    ",allwaycount);
						MessageBox(hWnd,allmessage,"成功",MB_OK|MB_ICONINFORMATION);
						allwaycount=0;
						break;
					}

				}
				mazeshow[(allway[waycount][all].x-1)/2][(allway[waycount][all].y-1)/2].buttom=PATH;
				mazeshow[(allway[waycount][all].x-1)/2][(allway[waycount][all].y-1)/2].man=0;
				mazeshow[(allway[waycount][all+1].x-1)/2][(allway[waycount][all+1].y-1)/2].man=1;
				WayDraw(hWnd,(allway[waycount][all].x-1)/2,(allway[waycount][all].y-1)/2);
				WayDraw(hWnd,(allway[waycount][all+1].x-1)/2,(allway[waycount][all+1].y-1)/2);
				all++;
			}			
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

// Mesage handler for about box.
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;
}

int SearchAllWay(HWND hWnd,int x,int y,int xx,int yy)
{
	int count1=0,count2,i,x1,x2,y1,y2,v,top=1;
	struct{int x;int y;int v;}s[(2*N+1)*(2*M+1)];

	if(mazeshow[9][9].man==1)
	{
		MessageBox(hWnd,"\n你已经到达终点了	","注意",MB_OK|MB_ICONEXCLAMATION);
		return -1;
	}
	//MazeChange(maze,mazeall[game-IDM_GAME01]);
	MazeDraw(hWnd);
	s[top].x=x;s[top].y=y;s[top].v=0;maze[x][y]=2;
	while(top)
	{
		x1=s[top].x;y1=s[top].y;v=s[top].v+1;
		top--;
		if(s[top].v>0)
			maze[x1+movex[v-1]][y1+movey[v-1]]=0;
		while(v<=4)
		{
			x2=x1+movex[v];y2=y1+movey[v];
			if(x2==xx&&y2==yy)
			{
				for(i=1;i<=top;i++)
				{
					if(count1>29999)
					{
						MessageBox(hWnd,"\n通路的数目已经超过30000!!\想累死我啊你!","失败",MB_OK|MB_ICONSTOP);
						return -1;
					}
					allway[count1][i-1].x=s[i].x;
					allway[count1][i-1].y=s[i].y;
				}
				allway[count1][i].x=x2;
				allway[count1][i].y=y2;
				count1++;												
			}//if
			else if(x2>0&&x2<2*N&&y2>0&&y2<2*M&&!maze[x2][y2])
			{
				top++;s[top].x=x1;s[top].y=y1;s[top].v=v;x1=x2;y1=y2;v=0;
				maze[x1][y1]=2;
			}//else
			v++;
		}//while(v<=4)
	}//while(top)
	return count1;
}//void serchallway

int SearchBestWay(HWND hWnd,int x,int y,int xx,int yy)
{
	int x1,y1,x2,y2,v,front,rear,p,mark=0;
	int m=0;
	struct{int x;int y;int pre;}s[(2*N+1)*(2*M+1)];

	if(mazeshow[9][9].man==1)
	{
		MessageBox(hWnd,"\n你已经到达终点了	","注意",MB_OK|MB_ICONEXCLAMATION);
		return -1;
	}
	//MazeChange(maze,mazeall[game-IDM_GAME01]);
	MazeDraw(hWnd);
	front=rear=1;
	s[rear].x=x;s[rear].y=y;
	s[rear].pre=0;
	maze[x][y]=2;
	while(front<=rear)
	{
		x1=s[front].x;y1=s[front].y;
		for(v=1;v<=4;v++)
		{
			x2=x1+movex[v];y2=y1+movey[v];
			if(!maze[x2][y2])
			{
				rear++;s[rear].x=x2;s[rear].y=y2;
				s[rear].pre=front;
				maze[x2][y2]=2;
				if(x2==xx&&y2==yy) 
				{
					mark=1;
					break;
				}
			}
		}//for
		if(mark)
			break;
		front++;
	}//while
	if(x2!=xx||y2!=yy)
	{
		MessageBox(hWnd,"\n无法找到通路	","失败",MB_OK|MB_ICONSTOP);
		return -1;
	}
	p=rear;
	while(p>=1)
	{
		x1=s[p].x;y1=s[p].y;maze[x1][y1]+=1;p=s[p].pre;
		way[m].x=x1;way[m].y=y1;
		m++;
	}
	//mazeshow[0][0].man=0;
	return m-3;	
	
	
}

int MazeChange(int a[2*N+1][2*M+1],int b[2*N+1][2*M+1])
{
	int i,j;
	for(i=0;i<2*N+1;i++)
		for(j=0;j<2*M+1;j++)
			a[i][j]=b[i][j];
	if(!mazeshowinitializtion())
		return 0;
	return 1;
}

int mazeshowinitializtion(void)
{
	int i,j;
	
	for(i=1;i<2*M;i+=2)
		for(j=1;j<2*N;j+=2)
		{
			mazeshow[(j-1)/2][(i-1)/2].buttom=0;
			mazeshow[(j-1)/2][(i-1)/2].man=0;
			mazeshow[(j-1)/2][(i-1)/2].up=maze[j-1][i];
			mazeshow[(j-1)/2][(i-1)/2].left=maze[j][i-1];
			mazeshow[(j-1)/2][(i-1)/2].right=maze[j][i+1];
			mazeshow[(j-1)/2][(i-1)/2].down=maze[j+1][i];
		}
	mazeshow[0][0].man =1;
	mazeshow[0][0].buttom=GATE;
	mazeshow[9][9].buttom=EXIT;
	return 1;
}


int MazeboxDraw(HWND hWnd,int i,int j)//i,j is depend on mazeshow's not maze!!!
{
	HDC hdc;
	HBRUSH holdbrush,hbrush;
	HPEN holdpen,hpen;

	POINT myPolygonup[4];
	POINT myPolygonright[4];
	POINT myPolygonleft[4];
	POINT myPolygondown[4];
	POINT myPolygonbuttom[4];

	myPolygonup[0].x=myPolygonleft[0].x=START_L+(i+j)*LONG;			myPolygonup[0].y=myPolygonleft[0].y=START_H+(i-j)*WIDE;
	myPolygonup[1].x=myPolygonright[0].x=START_L+(i+j+1)*LONG;		myPolygonup[1].y=myPolygonright[0].y=START_H+(i-j-1)*WIDE;
	myPolygonup[2].x=myPolygonright[3].x=START_L+(i+j+1)*LONG;		myPolygonup[2].y=myPolygonright[3].y=START_H+(i-j-1)*WIDE+HIGH;
	myPolygonup[3].x=myPolygonleft[3].x=START_L+(i+j)*LONG;			myPolygonup[3].y=myPolygonleft[3].y=START_H+(i-j)*WIDE+HIGH;
	myPolygondown[0].x=myPolygonleft[1].x=START_L+(i+j+1)*LONG;		myPolygondown[0].y=myPolygonleft[1].y=START_H+(i-j+1)*WIDE;
	myPolygondown[1].x=myPolygonright[1].x=START_L+(i+j+2)*LONG;	myPolygondown[1].y=myPolygonright[1].y=START_H+(i-j)*WIDE;
	myPolygondown[2].x=myPolygonright[2].x=START_L+(i+j+2)*LONG;	myPolygondown[2].y=myPolygonright[2].y=START_H+(i-j)*WIDE+HIGH;
	myPolygondown[3].x=myPolygonleft[2].x=START_L+(i+j+1)*LONG;		myPolygondown[3].y=myPolygonleft[2].y=START_H+(i-j+1)*WIDE+HIGH;

	myPolygonbuttom[1].x=START_L+(i+j+1)*LONG;	myPolygonbuttom[1].y=START_H+(i-j-1)*WIDE+HIGH;
	myPolygonbuttom[0].x=START_L+(i+j)*LONG;	myPolygonbuttom[0].y=START_H+(i-j)*WIDE+HIGH;
	myPolygonbuttom[2].x=START_L+(i+j+2)*LONG;myPolygonbuttom[2].y=START_H+(i-j)*WIDE+HIGH;
	myPolygonbuttom[3].x=START_L+(i+j+1)*LONG;	myPolygonbuttom[3].y=START_H+(i-j+1)*WIDE+HIGH;

	hdc=GetDC(hWnd);
	SelectObject(hdc,GetStockObject(BLACK_PEN));
	if(mazeshow[i][j].up)
	{
		hbrush=CreateSolidBrush(RGB(120,120,120));
		holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
		Polygon(hdc,myPolygonup,4);
		SelectObject(hdc,holdbrush);
		DeleteObject(hbrush);
	}
	if(mazeshow[i][j].right)
	{
		hbrush=CreateSolidBrush(RGB(255,255,255));
		holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
		Polygon(hdc,myPolygonright,4);
		SelectObject(hdc,holdbrush);
		DeleteObject(hbrush);
	}
	//if(mazeshow[i][j].buttom)
	{

		SelectObject(hdc,GetStockObject(NULL_PEN));
		switch(mazeshow[i][j].buttom)
		{
		case 0:
			Polygon(hdc,myPolygonbuttom,4);
			break;
		case PATH:
			hbrush=CreateSolidBrush(RGB(125,225,235));
			holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
			Polygon(hdc,myPolygonbuttom,4);
			SelectObject(hdc,holdbrush);
			DeleteObject(hbrush);
			break;
		case GATE:
			hbrush=CreateSolidBrush(RGB(0,200,200));
			holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
			Polygon(hdc,myPolygonbuttom,4);
			SelectObject(hdc,holdbrush);
			DeleteObject(hbrush);
			break;
		case EXIT:
			hbrush=CreateSolidBrush(RGB(255,0,0));
			holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
			Polygon(hdc,myPolygonbuttom,4);
			SelectObject(hdc,holdbrush);
			DeleteObject(hbrush);
			break;		
		}
		SelectObject(hdc,GetStockObject(BLACK_PEN));
	}
	if(mazeshow[i][j].man)
	{
		hbrush=CreateSolidBrush(RGB(255,255,0));
		holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
		Ellipse(hdc,START_L+(i+j)*LONG+LONG/2,START_H+(i-j)*WIDE,START_L+(i+j)*LONG+3*LONG/2-1,START_H+(i-j)*WIDE+WIDE/2+HIGH);
		hpen=CreatePen(PS_SOLID,3,(0,0,0));
		holdpen=(HPEN)SelectObject(hdc,hpen);
		MoveToEx(hdc,START_L+(i+j)*LONG+3*LONG/4-2,START_H+(i-j)*WIDE+WIDE/3+1,NULL);
		LineTo(hdc,START_L+(i+j)*LONG+3*LONG/4+3,START_H+(i-j)*WIDE+WIDE/3+1);
		MoveToEx(hdc,START_L+(i+j+2)*LONG-3*LONG/4+1,START_H+(i-j)*WIDE+WIDE/3+1,NULL);
		LineTo(hdc,START_L+(i+j+2)*LONG-3*LONG/4-4,START_H+(i-j)*WIDE+WIDE/3+1);
		SelectObject(hdc,holdpen);
		DeleteObject(hpen);
		hpen=CreatePen(PS_SOLID,5,RGB(200,0,0));
		holdpen=(HPEN)SelectObject(hdc,hpen);
		MoveToEx(hdc,START_L+(i+j)*LONG+LONG-2,START_H+(i-j)*WIDE+2*WIDE/3,NULL);
		LineTo(hdc,START_L+(i+j)*LONG+LONG+1,START_H+(i-j)*WIDE+2*WIDE/3);
		SelectObject(hdc,holdpen);
		DeleteObject(hpen);
		hpen=CreatePen(PS_SOLID,1,RGB(255,45,45));
		holdpen=(HPEN)SelectObject(hdc,hpen);
		Arc(hdc,START_L+(i+j)*LONG+3*LONG/4,START_H+(i-j)*WIDE+WIDE/2,START_L+(i+j)*LONG+3*LONG/2-LONG/4-1,START_H+(i-j)*WIDE+WIDE/4+HIGH,START_L+(i+j)*LONG+3*LONG/4+1,START_H+(i-j)*WIDE+WIDE/4+HIGH+2,START_L+(i+j)*LONG+3*LONG/2-LONG/4-1,START_H+(i-j)*WIDE+WIDE/4+HIGH+2);
		SelectObject(hdc,holdpen);
		DeleteObject(hpen);
		SelectObject(hdc,holdbrush);
		DeleteObject(hbrush);		
	}
	if(mazeshow[i][j].left)
	{
		hbrush=CreateSolidBrush(RGB(255,255,255));
		holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
		Polygon(hdc,myPolygonleft,4);
		SelectObject(hdc,holdbrush);
		DeleteObject(hbrush);
	}
	if(mazeshow[i][j].down)
	{
		hbrush=CreateSolidBrush(RGB(120,120,120));
		holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
		Polygon(hdc,myPolygondown,4);
		SelectObject(hdc,holdbrush);
		DeleteObject(hbrush);
	}
	ReleaseDC(hWnd,hdc);
	
	return 1;
}

int MazeDraw(HWND hWnd)
{
	int i,j;
	HDC hdc;
	HBRUSH hbrush,holdbrush;
	const POINT PolygonLastdown[4]={{START_L+N*LONG,START_H+M*WIDE},{START_L+2*N*LONG,START_H},{START_L+2*N*LONG,START_H+HIGH},{START_L+N*LONG,START_H+M*WIDE+HIGH}};
	const POINT PolygonLastleft[4]={{START_L,START_H},{START_L+N*LONG,START_H+M*WIDE},{START_L+N*LONG,START_H+M*WIDE+HIGH},{START_L,START_H+HIGH}};

	for(i=0;i<N;i++)
		for(j=M-1;j>=0;j--)
		{
			if(!MazeboxDraw(hWnd,i,j))
				return 0;
		}
	hdc=GetDC(hWnd);
	Polygon(hdc,PolygonLastleft,4);
	hbrush=CreateSolidBrush(RGB(120,120,120));
	holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
	Polygon(hdc,PolygonLastdown,4);
	SelectObject(hdc,holdbrush);
	DeleteObject(hbrush);
	ReleaseDC(hWnd,hdc);
	
	return 1;
}

int WayDraw(HWND hWnd,int i,int j)
{
	HDC hdc;
	HBRUSH hbrush,holdbrush;
	HPEN hpen,holdpen;
	const POINT PolygonLastdown[4]={{START_L+N*LONG,START_H+M*WIDE},{START_L+2*N*LONG,START_H},{START_L+2*N*LONG,START_H+HIGH},{START_L+N*LONG,START_H+M*WIDE+HIGH}};
	const POINT PolygonLastleft[4]={{START_L,START_H},{START_L+N*LONG,START_H+M*WIDE},{START_L+N*LONG,START_H+M*WIDE+HIGH},{START_L,START_H+HIGH}};
	
	hdc=GetDC(hWnd);
	MazeboxDraw(hWnd,i,j);
	if(i+1<N&&j-1>=0)
	{
		POINT PolygonNextup[4];
		POINT PolygonNextright[4];
		PolygonNextup[1].x=PolygonNextright[1].x=START_L+(i+j+1)*LONG;		PolygonNextup[1].y=PolygonNextright[1].y=START_H+(i-j+1)*WIDE;
		PolygonNextup[2].x=PolygonNextright[2].x=START_L+(i+j+1)*LONG;		PolygonNextup[2].y=PolygonNextright[2].y=START_H+(i-j+1)*WIDE+HIGH;
		PolygonNextup[3].x=PolygonNextup[0].x=START_L+(i+j+1)*LONG-LONG/2;	PolygonNextup[3].y=START_H+(i-j+1)*WIDE+HIGH+WIDE/2;		PolygonNextup[0].y=START_H+(i-j+1)*WIDE+WIDE/2;
		PolygonNextright[3].x=PolygonNextright[0].x=START_L+(i+j+1)*LONG+LONG/2;		PolygonNextright[3].y=START_H+(i-j+1)*WIDE+HIGH+WIDE/2;		PolygonNextright[0].y=START_H+(i-j+1)*WIDE+WIDE/2;

		if(mazeshow[i+1][j-1].up)
		{
			SelectObject(hdc,GetStockObject(NULL_PEN));
			hbrush=CreateSolidBrush(RGB(120,120,120));
			holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
			Polygon(hdc,PolygonNextup,4);
			SelectObject(hdc,holdbrush);
			DeleteObject(hbrush);
			SelectObject(hdc,GetStockObject(BLACK_PEN));
			Polyline(hdc,PolygonNextup,4);
		}
		if(mazeshow[i+1][j-1].right)
		{
			SelectObject(hdc,GetStockObject(NULL_PEN));
			SelectObject(hdc,GetStockObject(WHITE_BRUSH));
			Polygon(hdc,PolygonNextright,4);
			SelectObject(hdc,GetStockObject(BLACK_PEN));
			Polyline(hdc,PolygonNextright,4);
		}
	}

	Polygon(hdc,PolygonLastleft,4);
	hbrush=CreateSolidBrush(RGB(120,120,120));
	holdbrush=(HBRUSH)SelectObject(hdc,hbrush);
	Polygon(hdc,PolygonLastdown,4);
	SelectObject(hdc,holdbrush);
	DeleteObject(hbrush);
	ReleaseDC(hWnd,hdc);

	return 1;
}

⌨️ 快捷键说明

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