迷宫

作者在 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;
}
日志 | 阅读 718 次
文章评论,共1条
leattlestar
2009-09-07 20:49
1
好长啊,我运行时有错误啊,我也看不大懂诶。
游客请输入验证码
浏览8475次