📄 maze.cpp
字号:
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 + -