作者在 2009-08-31 21:11:28 发布以下内容
#include <windows.h>
#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 420
#define MY_INTERVAL 20
char* g_szApplicationName="迷宫";
char* g_szWindowClassName="LinrenWindowClass";
//////////////////////
char a[20][20]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,
1,0,0,0,0,1,1,0,0,3,0,1,1,1,0,1,1,1,1,1,
1,0,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,
1,0,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,
1,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,
1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,
1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int b[20][20]={0};
int ix,iy;
//////////////////////
void myfun(LPVOID sc){
int i,j,p1,p2,p3,p4,p=1,k;
int sln[4];
int u,v;
i=1,j=1,k=1;
while(a[i][j]!=3){
ix=i,iy=j;
Sleep(MY_INTERVAL);
if(a[i][j-1]==3){
j--;ix=i,iy=j;break;
}
if(a[i-1][j]==3){
i--;ix=i,iy=j;break;
}
if(a[i][j+1]==3){
j++;ix=i,iy=j;break;
}
if(a[i+1][j]==3){
i++;ix=i,iy=j;break;
}
if(a[i][j-1]==0){
p1=1;sln[0]=b[i][j-1];
}else{
p1=0;sln[0]=-1;
}
if(a[i-1][j]==0){
p2=1;sln[1]=b[i-1][j];
}else{
p2=0;sln[1]=-1;
}
if(a[i][j+1]==0){
p3=1;sln[2]=b[i][j+1];
}else{
p3=0;sln[2]=-1;
}
if(a[i+1][j]==0){
p4=1;sln[3]=b[i+1][j];
}else{
p4=0;sln[3]=-1;
}
u=-1;
for(k=0;k<4;k++){
if(sln[k]==-1) continue;
v=sln[k];
if(u==-1||v<=u) u=v;
}
for(k=0;k<4;k++){
if(sln[k]==-1) continue;
if(sln[k]!=u){
if(k==0) p1=0;
else if(k==1) p2=0;
else if(k==2) p3=0;
else if(k==3) p4=0;
}
}
if(p==1){//←
if(p1){
j--;p=1;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}else if(p4){
i++;p=4;b[i][j]++;
}else if(p3){
j++;p=3;b[i][j]++;
}
}else if(p==2){//↑
if(p3){
j++;p=3;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}else if(p1){
j--;p=1;b[i][j]++;
}else if(p4){
i++;p=4;b[i][j]++;
}
}else if(p==3){//→
if(p4){
i++;p=4;b[i][j]++;
}else if(p3){
j++;p=3;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}else if(p1){
j--;p=1;b[i][j]++;
}
}else if(p==4){//↓
if(p1){
j--;p=1;b[i][j]++;
}else if(p4){
i++;p=4;b[i][j]++;
}else if(p3){
j++;p=3;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}
}
}
MessageBox(NULL,"到达出口!","提示",0);
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
static int cxClient,cyClient;
static HDC hdcBackBuffer;
static HBITMAP hBitmap;
static HBITMAP hOldBitmap;
//////////////////////
static HBRUSH BlackBrush=CreateSolidBrush(RGB(0, 0, 0));
static HBRUSH OldBrush=NULL;
//////////////////////
switch(msg){
case WM_CREATE:
{
RECT rect;
GetClientRect(hwnd,&rect);
cxClient=rect.right;
cyClient=rect.bottom;
//////////////////////
OldBrush=(HBRUSH)SelectObject(hdcBackBuffer, BlackBrush);
int i,j;
int x,y;
int u=ix,v=iy;
for(i=0;i<20;i++){
for(j=0;j<20;j++){
x=i*20;y=j*20;
if(u==i&&v==j){
TextOut(hdcBackBuffer,x,y,"☆",2);
}
else if(a[i][j]==1){
Rectangle(hdcBackBuffer,x,y,x+20,y+20);
}
else if(a[i][j]==2){
TextOut(hdcBackBuffer,x,y,"S",1);
}
else if(a[i][j]==3){
TextOut(hdcBackBuffer,x,y,"★",2);
}
else if(a[i][j]==4){
TextOut(hdcBackBuffer,x,y,"×",2);
}
}
}
SelectObject(hdcBackBuffer, OldBrush);
//////////////////////
hdcBackBuffer=CreateCompatibleDC(NULL);
HDC hdc=GetDC(hwnd);
hBitmap=CreateCompatibleBitmap(hdc,cxClient,cyClient);
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap);
ReleaseDC(hwnd,hdc);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
BitBlt(hdcBackBuffer,0,0,cxClient,cyClient,NULL,NULL,NULL,WHITENESS);
//////////////////////
OldBrush=(HBRUSH)SelectObject(hdcBackBuffer, BlackBrush);
int i,j;
int x,y;
int u=ix,v=iy;
for(i=0;i<20;i++){
for(j=0;j<20;j++){
x=j*20;y=i*20;
if(u==i&&v==j){
TextOut(hdcBackBuffer,x,y,"☆",2);
}
else if(a[i][j]==1){
Rectangle(hdcBackBuffer,x,y,x+20,y+20);
}
else if(a[i][j]==2){
TextOut(hdcBackBuffer,x,y,"S",1);
}
else if(a[i][j]==3){
TextOut(hdcBackBuffer,x,y,"★",2);
}
else if(a[i][j]==4){
TextOut(hdcBackBuffer,x,y,"×",2);
}
}
}
SelectObject(hdcBackBuffer, OldBrush);
//////////////////////
BitBlt(ps.hdc,0,0,cxClient,cyClient,hdcBackBuffer,0,0,SRCCOPY);
EndPaint(hwnd,&ps);Sleep(10);
}
break;
case WM_DESTROY:
{
//////////////////////
DeleteObject(BlackBrush);
DeleteObject(OldBrush);
//////////////////////
SelectObject(hdcBackBuffer,hOldBitmap);
DeleteDC(hdcBackBuffer);DeleteObject(hBitmap);
PostQuitMessage(0);
}break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR szCmdLine,int iCmdShow){
HWND hWnd;
WNDCLASSEX winclass;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hInstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = NULL;
winclass.lpszMenuName = NULL;
winclass.lpszClassName = g_szWindowClassName;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&winclass)){
MessageBox(NULL,"RegisterClassEx Error!","error",0);return 0;
}
hWnd=CreateWindowEx(NULL,
g_szWindowClassName,
g_szApplicationName,
WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
GetSystemMetrics(SM_CXSCREEN)/2-WINDOW_WIDTH/2,
GetSystemMetrics(SM_CYSCREEN)/2-WINDOW_HEIGHT/2,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,NULL,hInstance,NULL);
if(!hWnd){
MessageBox(NULL,"CreateWindowEx Error!","error",0);
}
ShowWindow(hWnd, iCmdShow);UpdateWindow(hWnd);
HANDLE thrd;
thrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myfun,(LPVOID)&hWnd,0,NULL);
MSG msg;
bool bDone=false;
while(!bDone){
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message==WM_QUIT){
TerminateThread(thrd,NULL);
bDone=true;
}else{
TranslateMessage(&msg);DispatchMessage(&msg);
}
}
InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);
}
UnregisterClass(g_szWindowClassName,winclass.hInstance);
return msg.wParam;
}
#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 420
#define MY_INTERVAL 20
char* g_szApplicationName="迷宫";
char* g_szWindowClassName="LinrenWindowClass";
//////////////////////
char a[20][20]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,
1,0,0,0,0,1,1,0,0,3,0,1,1,1,0,1,1,1,1,1,
1,0,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,
1,0,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,
1,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,
1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,
1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,
1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int b[20][20]={0};
int ix,iy;
//////////////////////
void myfun(LPVOID sc){
int i,j,p1,p2,p3,p4,p=1,k;
int sln[4];
int u,v;
i=1,j=1,k=1;
while(a[i][j]!=3){
ix=i,iy=j;
Sleep(MY_INTERVAL);
if(a[i][j-1]==3){
j--;ix=i,iy=j;break;
}
if(a[i-1][j]==3){
i--;ix=i,iy=j;break;
}
if(a[i][j+1]==3){
j++;ix=i,iy=j;break;
}
if(a[i+1][j]==3){
i++;ix=i,iy=j;break;
}
if(a[i][j-1]==0){
p1=1;sln[0]=b[i][j-1];
}else{
p1=0;sln[0]=-1;
}
if(a[i-1][j]==0){
p2=1;sln[1]=b[i-1][j];
}else{
p2=0;sln[1]=-1;
}
if(a[i][j+1]==0){
p3=1;sln[2]=b[i][j+1];
}else{
p3=0;sln[2]=-1;
}
if(a[i+1][j]==0){
p4=1;sln[3]=b[i+1][j];
}else{
p4=0;sln[3]=-1;
}
u=-1;
for(k=0;k<4;k++){
if(sln[k]==-1) continue;
v=sln[k];
if(u==-1||v<=u) u=v;
}
for(k=0;k<4;k++){
if(sln[k]==-1) continue;
if(sln[k]!=u){
if(k==0) p1=0;
else if(k==1) p2=0;
else if(k==2) p3=0;
else if(k==3) p4=0;
}
}
if(p==1){//←
if(p1){
j--;p=1;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}else if(p4){
i++;p=4;b[i][j]++;
}else if(p3){
j++;p=3;b[i][j]++;
}
}else if(p==2){//↑
if(p3){
j++;p=3;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}else if(p1){
j--;p=1;b[i][j]++;
}else if(p4){
i++;p=4;b[i][j]++;
}
}else if(p==3){//→
if(p4){
i++;p=4;b[i][j]++;
}else if(p3){
j++;p=3;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}else if(p1){
j--;p=1;b[i][j]++;
}
}else if(p==4){//↓
if(p1){
j--;p=1;b[i][j]++;
}else if(p4){
i++;p=4;b[i][j]++;
}else if(p3){
j++;p=3;b[i][j]++;
}else if(p2){
i--;p=2;b[i][j]++;
}
}
}
MessageBox(NULL,"到达出口!","提示",0);
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
static int cxClient,cyClient;
static HDC hdcBackBuffer;
static HBITMAP hBitmap;
static HBITMAP hOldBitmap;
//////////////////////
static HBRUSH BlackBrush=CreateSolidBrush(RGB(0, 0, 0));
static HBRUSH OldBrush=NULL;
//////////////////////
switch(msg){
case WM_CREATE:
{
RECT rect;
GetClientRect(hwnd,&rect);
cxClient=rect.right;
cyClient=rect.bottom;
//////////////////////
OldBrush=(HBRUSH)SelectObject(hdcBackBuffer, BlackBrush);
int i,j;
int x,y;
int u=ix,v=iy;
for(i=0;i<20;i++){
for(j=0;j<20;j++){
x=i*20;y=j*20;
if(u==i&&v==j){
TextOut(hdcBackBuffer,x,y,"☆",2);
}
else if(a[i][j]==1){
Rectangle(hdcBackBuffer,x,y,x+20,y+20);
}
else if(a[i][j]==2){
TextOut(hdcBackBuffer,x,y,"S",1);
}
else if(a[i][j]==3){
TextOut(hdcBackBuffer,x,y,"★",2);
}
else if(a[i][j]==4){
TextOut(hdcBackBuffer,x,y,"×",2);
}
}
}
SelectObject(hdcBackBuffer, OldBrush);
//////////////////////
hdcBackBuffer=CreateCompatibleDC(NULL);
HDC hdc=GetDC(hwnd);
hBitmap=CreateCompatibleBitmap(hdc,cxClient,cyClient);
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap);
ReleaseDC(hwnd,hdc);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
BitBlt(hdcBackBuffer,0,0,cxClient,cyClient,NULL,NULL,NULL,WHITENESS);
//////////////////////
OldBrush=(HBRUSH)SelectObject(hdcBackBuffer, BlackBrush);
int i,j;
int x,y;
int u=ix,v=iy;
for(i=0;i<20;i++){
for(j=0;j<20;j++){
x=j*20;y=i*20;
if(u==i&&v==j){
TextOut(hdcBackBuffer,x,y,"☆",2);
}
else if(a[i][j]==1){
Rectangle(hdcBackBuffer,x,y,x+20,y+20);
}
else if(a[i][j]==2){
TextOut(hdcBackBuffer,x,y,"S",1);
}
else if(a[i][j]==3){
TextOut(hdcBackBuffer,x,y,"★",2);
}
else if(a[i][j]==4){
TextOut(hdcBackBuffer,x,y,"×",2);
}
}
}
SelectObject(hdcBackBuffer, OldBrush);
//////////////////////
BitBlt(ps.hdc,0,0,cxClient,cyClient,hdcBackBuffer,0,0,SRCCOPY);
EndPaint(hwnd,&ps);Sleep(10);
}
break;
case WM_DESTROY:
{
//////////////////////
DeleteObject(BlackBrush);
DeleteObject(OldBrush);
//////////////////////
SelectObject(hdcBackBuffer,hOldBitmap);
DeleteDC(hdcBackBuffer);DeleteObject(hBitmap);
PostQuitMessage(0);
}break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR szCmdLine,int iCmdShow){
HWND hWnd;
WNDCLASSEX winclass;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hInstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = NULL;
winclass.lpszMenuName = NULL;
winclass.lpszClassName = g_szWindowClassName;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&winclass)){
MessageBox(NULL,"RegisterClassEx Error!","error",0);return 0;
}
hWnd=CreateWindowEx(NULL,
g_szWindowClassName,
g_szApplicationName,
WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
GetSystemMetrics(SM_CXSCREEN)/2-WINDOW_WIDTH/2,
GetSystemMetrics(SM_CYSCREEN)/2-WINDOW_HEIGHT/2,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,NULL,hInstance,NULL);
if(!hWnd){
MessageBox(NULL,"CreateWindowEx Error!","error",0);
}
ShowWindow(hWnd, iCmdShow);UpdateWindow(hWnd);
HANDLE thrd;
thrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myfun,(LPVOID)&hWnd,0,NULL);
MSG msg;
bool bDone=false;
while(!bDone){
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message==WM_QUIT){
TerminateThread(thrd,NULL);
bDone=true;
}else{
TranslateMessage(&msg);DispatchMessage(&msg);
}
}
InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);
}
UnregisterClass(g_szWindowClassName,winclass.hInstance);
return msg.wParam;
}