win32GDI函数编程实现推箱子小游戏

          利用GDI绘图函数实现推箱子小游戏,代码源于上一篇博客 C语言控制台推箱子。

          实现方法很简单,把字符用绘图函数绘出的图形替换即可。

          从字符控制台到win32界面编程,更加形象化。

          代码量大增,主程序就有一千多行,这还只不过是个小程序,路还很长!

          win32GDI自绘窗口,界面如下图:

  

      主函数如下:

/********************************
名称:推箱子
描述:用win32程序实现推箱子小游戏
编译:codeblocks16.01  vs2010
创建:零千刻
日期:170525
*********************************/
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <windows.h>
#include <tchar.h>
#include"resource.h"

#include"mapfile.h"//本项目头文件,不可用<>

/*个性化窗口 无标题栏 开启居中*/
#define WINDOW_WIDTH	640 //为窗口宽度定义的宏,以方便在此处修改窗口宽度
#define WINDOW_HEIGHT	600 //为窗口高度定义的宏,以方便在此处修改窗口高度
HDC hdc,mdc;
HWND hwnd;
LPCSTR szClassName=_T("CodeBlocksWindowsApp");
bool RefWin=true;
bool BtnClose=true;
bool Btn1=true;

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WindowProcedurePush (HWND, UINT, WPARAM, LPARAM);
bool Init(HWND);
void MouseMove(HWND,int,int,WPARAM);
void MouseClick(HWND,int,int,WPARAM );
void DrawFace(HDC);
void TextFace(HDC);
bool CleanUp(HWND);

void DrawMap(HDC);
void PlayGame(WPARAM);
void TextManage(HDC);
void DrawMapBase();
void nextMap(HDC);
void TextChange(HDC);
void DrawBox(HDC,int,int,int);

COORD coord= {0,0};
//COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。

int map[14][16]= {};
bool mapNumWait=true;//地图关卡数
int mapNumGoing=1;//地图关卡数
int mapNumGoingC=1;//地图关卡数副本
bool nextm=true;
bool textc=false;
bool nextK=true;
int iox=0;
int jox=0;
short m=10;//关卡设置
DWORD bytes=0;
HBITMAP boxbmp;
HBITMAP boxbmpPart[6];

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    MSG msg= {0};

    WNDCLASSEX wincl;
    HINSTANCE hThisInstancePush;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);

    wincl.hIcon = LoadIcon (NULL, (LPCSTR)IDI_ICON1);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = CreateSolidBrush(RGB(154,205,141));

    if (!RegisterClassEx (&wincl))
        return 0;

    /*非全屏状态下,窗口显示在屏幕中心*/
    int nPosX,nPosY,nWndWidth,nWndHeight;
    nPosX=0;
    nPosY=0;
    nWndWidth=WINDOW_WIDTH;		//设置窗口大小为游戏画面大小
    nWndHeight=WINDOW_HEIGHT;
    //计算加上边框后的窗口大小
    nWndWidth=WINDOW_WIDTH+GetSystemMetrics(SM_CXFIXEDFRAME)*2;
    nWndHeight=WINDOW_HEIGHT+GetSystemMetrics(SM_CYFIXEDFRAME)*10;
    //计算在窗口居中时,窗口左上角的位置
    nPosX=(GetSystemMetrics(SM_CXSCREEN)-nWndWidth)/2;
    nPosY=(GetSystemMetrics(SM_CYSCREEN)-nWndHeight)/2;

    hwnd = CreateWindowEx (
               0,
               szClassName,
               _T("Code::Blocks Template Windows App"),
               WS_POPUP,//WS_POPUP弹出式无边框窗口
               nPosX,
               nPosY,
               WINDOW_WIDTH,
               WINDOW_HEIGHT,
               HWND_DESKTOP,
               NULL,
               hThisInstance,
               NULL
           );


    ShowWindow (hwnd, nCmdShow);
    UpdateWindow(hwnd);

    HDC hdc=GetDC(hwnd);

    if (!Init (hwnd))
    {
        MessageBox(hwnd, _T("资源初始化失败"), _T("消息窗口"), 0);
        //使用MessageBox函数,创建一个消息窗口
        return FALSE;
    }
    while (msg.message!=WM_QUIT)
    {
        if(PeekMessage (&msg, NULL, 0, 0,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {

		HDC hMemDC;					//内存缓冲设备环境
		PAINTSTRUCT ps;				//绘图结构ps
		HBITMAP hbmMem,hbmOld;
		BeginPaint(hwnd,&ps);
		//开始绘图,并获取绘图环境hDC hDCBeginPaint(hwnd,&ps)不可用。重复定义。
		hMemDC=CreateCompatibleDC(hdc);	//创建内存兼容设备环境
        hbmMem=CreateCompatibleBitmap(hdc,WINDOW_WIDTH,WINDOW_HEIGHT);
		hbmOld=(HBITMAP)SelectObject(hMemDC,hbmMem);

            DrawMapBase();
            DrawMap(hMemDC);

        BitBlt(hdc,4,24,512,446,hMemDC,0,0,SRCCOPY);
		SelectObject(hMemDC,hbmOld);
        DeleteObject(hbmMem);
		DeleteDC(hMemDC);
		EndPaint(hwnd,&ps);

            nextMap(hdc);
            TextChange(hdc);
            Sleep(30);

            /*DrawMapBase();
            DrawMap(hdc);
            nextMap(hdc);
            TextChange(hdc);
            Sleep(30);*/
        }
    }
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage (0);
        break;
    case WM_KEYDOWN:					// 若是键盘按下消息
        if (wParam == VK_ESCAPE)    // 如果被按下的键是ESC
            DestroyWindow(hwnd);// 销毁窗口, 并发送一条WM_DESTROY消息
        PlayGame(wParam);

        break;									//跳出该switch语句
    case WM_MOUSEMOVE:
        MouseMove(hwnd,LOWORD(lParam),HIWORD(lParam),wParam);

        break;
    case WM_LBUTTONDOWN:			//鼠标左键按下消息
        MouseClick(hwnd,LOWORD(lParam),HIWORD(lParam),wParam);
        break;
    case WM_PAINT:
        PAINTSTRUCT paintStruct;
        hdc = BeginPaint( hwnd, &paintStruct );  //指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到paintStruct结构体中。
        textc=true;
        Init( hwnd);
        EndPaint( hwnd, &paintStruct );			//EndPaint函数标记指定窗口的绘画过程结束
        ValidateRect(hwnd, NULL);		// 更新客户区的显示

        break;
    default:
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}

bool Init( HWND hwnd )
{
    hdc=GetDC(hwnd);//绘制界面
    DrawFace(hdc);
    TextFace(hdc);
    TextManage(hdc);
    TextChange(hdc);
    CleanUp(hwnd);
    return true;
}

void DrawFace(HDC hdc)
{
    //COLORREF col=RGB(200,0,0);
    HPEN hPen1=CreatePen(PS_SOLID,8,RGB(222,185,129));
    HPEN hPen2=CreatePen(PS_SOLID,48,RGB(222,185,129));
    HPEN hPen3=CreatePen(PS_SOLID,4,RGB(222,185,129));
    HBRUSH hbrush1=CreateSolidBrush(RGB(162,196,149));//草绿色
    HBRUSH hbrush2=CreateHatchBrush(HS_DIAGCROSS,RGB(0,206,230));
    //SelectObject(hdc,hPen3);
    //SelectObject(hdc,hbrush1);
    //Ellipse(hdc,WINDOW_WIDTH-60,2,WINDOW_WIDTH-40,20);
    //Rectangle(hdc,4,20,WINDOW_WIDTH-4,WINDOW_HEIGHT-4);
    SelectObject(hdc,hPen2);//将对应的画笔选好
    MoveToEx(hdc,0,0,NULL);
    LineTo(hdc,WINDOW_WIDTH,0);
    SelectObject(hdc,hPen1);//将对应的画笔选好
    LineTo(hdc,WINDOW_WIDTH,WINDOW_HEIGHT);
    LineTo(hdc,0,WINDOW_HEIGHT);
    LineTo(hdc,0,0);
    SelectObject(hdc,hPen3);
    MoveToEx(hdc,520,24,NULL);
    LineTo(hdc,520,WINDOW_HEIGHT);
    MoveToEx(hdc,520,476,NULL);
    LineTo(hdc,4,476);
    DeleteObject (hPen1) ;
    DeleteObject (hPen2) ;
    DeleteObject (hPen3) ;
    DeleteObject(hbrush1);
    DeleteObject(hbrush2);
}
void TextFace(HDC hdc)
{
    HFONT hFont1=CreateFont(20,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,_T("微软雅黑"));
    HFONT hFont2=CreateFont(30,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,_T("隶书"));
    HFONT hFont3=CreateFont(40,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,_T("黑体"));  //创建一种字体
    SelectObject(hdc,hFont1);  //将字体选入设备环境中
    SetBkMode(hdc, TRANSPARENT);    //设置输出文字背景色为透明
    //SetTextColor(hdc,RGB(50,50,200));
    SetTextColor(hdc,RGB(203,136,82));
    TextOut(hdc,WINDOW_WIDTH/2-104,2,_T("推箱子  GDI绘图编程"),strlen(_T("推箱子  GDI绘图编程")));
    if(BtnClose)
    {
        SetTextColor(hdc,RGB(185,206,210));
        TextOut(hdc,WINDOW_WIDTH-32,2,_T("O"),strlen(_T("O")));
        SetTextColor(hdc,RGB(203,136,82));
        TextOut(hdc,WINDOW_WIDTH-32,2,_T("X"),strlen(_T("X")));
    }
    else if(!BtnClose)
    {
        SetTextColor(hdc,RGB(185,206,210));
        TextOut(hdc,WINDOW_WIDTH-32,2,_T("X"),strlen(_T("X")));
        SetTextColor(hdc,RGB(203,136,82));
        TextOut(hdc,WINDOW_WIDTH-32,2,_T("O"),strlen(_T("O")));

    }
    if(Btn1)
    {
        SetTextColor(hdc,RGB(154,205,141));
        TextOut(hdc,520+10,WINDOW_HEIGHT-200,_T("休息一下!"),strlen(_T("休息一下!")));
        SetTextColor(hdc,RGB(200,150,141));
        TextOut(hdc,520+10,WINDOW_HEIGHT-200,_T("休息一下!"),strlen(_T("休息一下!")));
    }
    else if(!Btn1)
    {
        SetTextColor(hdc,RGB(154,205,141));
        TextOut(hdc,520+10,WINDOW_HEIGHT-200,_T("休息一下!"),strlen(_T("休息一下!")));
        SetTextColor(hdc,RGB(200,10,10));
        TextOut(hdc,520+10,WINDOW_HEIGHT-200,_T("休息一下!"),strlen(_T("休息一下!")));


    }
    DeleteObject(hFont1);//释放字体对象
    DeleteObject(hFont2);//释放字体对象
    DeleteObject(hFont3);//释放字体对象
}

void MouseMove(HWND hwnd,int x,int y,WPARAM wParam)
{
    POINT pt= {x,y}; //定义鼠标单击点
    RECT rect= {WINDOW_WIDTH-32,0,WINDOW_WIDTH-8,24};
    RECT rectrest= {520+10,WINDOW_HEIGHT-200,520+10+100,WINDOW_HEIGHT-200+18};
    hdc=GetDC(hwnd);
    if(PtInRect(&rect,pt)&&BtnClose)
    {
        BtnClose=false;
        TextFace(hdc);
    }
   if(!PtInRect(&rect,pt)&&!BtnClose)
    {
        BtnClose=true;
        TextFace(hdc);
    }
    if(PtInRect(&rectrest,pt)&&Btn1)
    {
        Btn1=false;
        TextFace(hdc);
    }
   if(!PtInRect(&rectrest,pt)&&!Btn1)
    {
        Btn1=true;
        TextFace(hdc);
    }
}
void MouseClick(HWND hwnd,int x,int y,WPARAM wParam)
{
    POINT pt= {x,y};		//定义鼠标单击点
    RECT rectc= {0,0,WINDOW_WIDTH,24};
    RECT rectclose= {WINDOW_WIDTH-32,0,WINDOW_WIDTH-8,24};
    RECT rectrest= {520+10,WINDOW_HEIGHT-200,520+10+100,WINDOW_HEIGHT-200+18};
    if(PtInRect(&rectc,pt))//在指定方形区域,可移动窗口!
        PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, wParam);
    if(PtInRect(&rectclose,pt))
        DestroyWindow(hwnd);		// 销毁窗口, 并发送一条WM_DESTROY消息;
    if(PtInRect(&rectrest,pt))
        DestroyWindow(hwnd);		// 销毁窗口, 并发送一条WM_DESTROY消息;
}

bool CleanUp( HWND hwnd )
{
    ReleaseDC(hwnd,hdc);
    DeleteDC(hdc);
    return TRUE;
}
/*游戏函数*/
void DrawMapBase()
{
    if(mapNumWait)//bool判断中勿再赋值
    {
        for(int m=0; m<14; m++)
        {
            for(int n=0; n<16; n++)
            {
                switch(mapNumGoing)
                {
                case 1:
                    map[m][n]=map1[m][n];
                    break;
                case 2:
                    map[m][n]=map2[m][n];
                    break;
                case 3:
                    map[m][n]=map3[m][n];
                    break;
                case 4:
                    map[m][n]=map4[m][n];
                    break;
                case 5:
                    map[m][n]=map5[m][n];
                    break;
                case 6:
                    map[m][n]=map6[m][n];
                    break;
                case 7:
                    map[m][n]=map7[m][n];
                    break;
                case 8:
                    map[m][n]=map8[m][n];
                    break;
                case 9:
                    map[m][n]=map9[m][n];
                    break;
                case 10:
                    map[m][n]=map10[m][n];
                    break;
                case 11:
                    map[m][n]=map11[m][n];
                    break;
                case 12:
                    map[m][n]=map12[m][n];
                    break;
                case 13:
                    map[m][n]=map13[m][n];
                    break;
                case 14:
                    map[m][n]=map14[m][n];
                    break;
                case 15:
                    map[m][n]=map15[m][n];
                    break;
                case 16:
                    map[m][n]=map16[m][n];
                    break;
                case 17:
                    map[m][n]=map17[m][n];
                    break;
                case 18:
                    map[m][n]=map18[m][n];
                    break;
                }
            }
        }
        mapNumWait=false;
    }
}
void DrawMap(HDC hdc)
{
		/*HDC hMemDC;					//内存缓冲设备环境
		PAINTSTRUCT ps;				//绘图结构ps
		HBITMAP hbmMem,hbmOld;
        BeginPaint(hwnd,&ps);	//开始绘图,并获取绘图环境hDC
		hMemDC=CreateCompatibleDC(hdc);	//创建内存兼容设备环境
        hbmMem=CreateCompatibleBitmap(hdc,WINDOW_WIDTH-100,WINDOW_HEIGHT-100);
		hbmOld=(HBITMAP)SelectObject(hMemDC,hbmMem);

    //用for循环遍历二维数组
    for(int i=0; i<14; i++)
    {
        coord.X =4;
        coord.Y =i*32+24;
        MoveToEx(hdc,coord.X,coord.Y,NULL);

        for(int j=0; j<16; j++)
        {

            switch(map[i][j])
            {
            case 0:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                break;
            case 1:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,1,coord.X+j*32,coord.Y);
                break;
            case 3:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,3,coord.X+j*32,coord.Y);
                break;
            case 4:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,4,coord.X+j*32,coord.Y);
                break;
            case 5:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,5,coord.X+j*32,coord.Y);
                break;
            case 7:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,7,coord.X+j*32,coord.Y);
                break;
            case 8:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,5,coord.X+j*32,coord.Y);
                break;

            }
        }
    }
        BitBlt(hdc,0,0,WINDOW_WIDTH-100,WINDOW_HEIGHT-100,hMemDC,0,0,SRCCOPY);
		SelectObject(hMemDC,hbmOld);
        DeleteObject(hbmMem);
		DeleteDC(hMemDC);
		EndPaint(hwnd,&ps);*/
    //用for循环遍历二维数组
    for(int i=0; i<14; i++)
    {
        //coord.X =4;
        //coord.Y =i*32+24;
        coord.X =0;
        coord.Y =i*32;
        MoveToEx(hdc,coord.X,coord.Y,NULL);

        for(int j=0; j<16; j++)
        {

            switch(map[i][j])
            {
            case 0:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                break;
            case 1:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,1,coord.X+j*32,coord.Y);
                break;
            case 3:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,3,coord.X+j*32,coord.Y);
                break;
            case 4:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,4,coord.X+j*32,coord.Y);
                break;
            case 5:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,5,coord.X+j*32,coord.Y);
                break;
            case 7:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,7,coord.X+j*32,coord.Y);
                break;
            case 8:
                MoveToEx(hdc,coord.X+j*32,coord.Y,NULL);
                DrawBox(hdc,0,coord.X+j*32,coord.Y);
                DrawBox(hdc,5,coord.X+j*32,coord.Y);
                break;

            }
        }
    }

}
void DrawBox(HDC hdc,int i,int x,int y)
{
    //HPEN hPen1=CreatePen(PS_SOLID,2,RGB(222,185,129));
    HPEN hPen1=CreatePen(PS_SOLID,2,RGB(203,136,82));
    HPEN hPen2=CreatePen(PS_SOLID,2,RGB(154,205,141));
    HBRUSH hbrush1=CreateSolidBrush(RGB(222,185,129));
    HBRUSH hbrush2=CreateSolidBrush(RGB(217,105,68));
    HBRUSH hbrush3=CreateSolidBrush(RGB(154,205,141));
    //HBRUSH hbrush2=CreateHatchBrush(HS_DIAGCROSS,RGB(0,206,230));

    if(i==0)
    {
        SelectObject(hdc,hPen2);
        SelectObject(hdc,hbrush3);
        Rectangle(hdc,x,y,x+32,y+32);
    }
    if(i==1)
    {
        SelectObject(hdc,hPen1);
        SelectObject(hdc,hbrush1);
        Rectangle(hdc,x,y,x+32,y+32);
    }
    if(i==3)
    {
        SelectObject(hdc,hPen1);
        SelectObject(hdc,hbrush1);
        MoveToEx(hdc,x+16,y+4,NULL);
        LineTo(hdc,x+16,y+28);
        MoveToEx(hdc,x+4,y+16,NULL);
        LineTo(hdc,x+28,y+16);
    }
    if(i==4)
    {
        SelectObject(hdc,hPen1);
        SelectObject(hdc,hbrush1);
        Rectangle(hdc,x,y,x+32,y+32);
        MoveToEx(hdc,x,y,NULL);
        LineTo(hdc,x+31,y+31);
        MoveToEx(hdc,x+31,y,NULL);
        LineTo(hdc,x,y+31);
    }
    if(i==5)
    {
        SelectObject(hdc,hPen1);
        SelectObject(hdc,hbrush1);
        MoveToEx(hdc,x+16,y+8,NULL);
        Ellipse(hdc,x+10,y+2,x+22,y+14);
        MoveToEx(hdc,x+16,y+14,NULL);
        LineTo(hdc,x+16,y+30);
        MoveToEx(hdc,x+4,y+16,NULL);
        LineTo(hdc,x+28,y+16);
    }
    if(i==7)
    {
        SelectObject(hdc,hPen1);
        SelectObject(hdc,hbrush2);
        Rectangle(hdc,x,y,x+32,y+32);
        MoveToEx(hdc,x,y,NULL);
        LineTo(hdc,x+31,y+31);
        MoveToEx(hdc,x+31,y,NULL);
        LineTo(hdc,x,y+31);
    }
    DeleteObject (hPen1) ;
    DeleteObject (hPen2) ;
    DeleteObject(hbrush1);
    DeleteObject(hbrush2);
    DeleteObject(hbrush3);

}

void PlayGame(WPARAM wParam)
{
    int pRow,pCol;//人的行和列
    int i,j;
    //时时刻刻得到人的下标,
    for (i=0; i<14; i++)
    {
        for(j=0; j<16; j++)
        {
            if(map[i][j]==5||map[i][j]==8)
            {
                pRow=i;
                pCol=j;
                break;//此break只能跳出第一个for循环
            }
        }
        if(map[i][j]==5||map[i][j]==8)//此句跳出第二个for循环 不可有goto语句
            break;

    }

    switch(wParam)
    {
    case 'W':
    case 'w':
    case VK_UP:
        if(map[pRow-1][pCol]==0||map[pRow-1][pCol]==3)
        {
            map[pRow-1][pCol]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow-1][pCol]==4||map[pRow-1][pCol]==7)//人的前面是箱子
        {
            if(map[pRow-2][pCol]==0||map[pRow-2][pCol]==3)//判断箱子的前面为空或目标
            {
                map[pRow-2][pCol]+=4;
                map[pRow-1][pCol]+=1;
                map[pRow][pCol]-=5;
            }
        }

        break;
    case 'S':
    case 's':
    case VK_DOWN:
        if(map[pRow+1][pCol]==0||map[pRow+1][pCol]==3)
        {
            map[pRow+1][pCol]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow+1][pCol]==4||map[pRow+1][pCol]==7)
        {
            if(map[pRow+2][pCol]==0||map[pRow+2][pCol]==3)
            {
                map[pRow+2][pCol]+=4;
                map[pRow+1][pCol]+=1;
                map[pRow][pCol]-=5;
            }
        }
        break;
    case 'A':
    case 'a':
    case VK_LEFT:
        if(map[pRow][pCol-1]==0||map[pRow][pCol-1]==3)
        {
            map[pRow][pCol-1]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow][pCol-1]==4||map[pRow][pCol-1]==7)
        {
            if(map[pRow][pCol-2]==0||map[pRow][pCol-2]==3)
            {
                map[pRow][pCol-2]+=4;
                map[pRow][pCol-1]+=1;
                map[pRow][pCol]-=5;
            }
        }
        break;
    case 'D':
    case 'd':
    case VK_RIGHT:
        if(map[pRow][pCol+1]==0||map[pRow][pCol+1]==3)
        {
            map[pRow][pCol+1]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow][pCol+1]==4||map[pRow][pCol+1]==7)
        {
            if(map[pRow][pCol+2]==0||map[pRow][pCol+2]==3)
            {
                map[pRow][pCol+2]+=4;
                map[pRow][pCol+1]+=1;
                map[pRow][pCol]-=5;
            }
        }
        break;
    case 'P'://大写有效,小写无效!win32中
        //case 'p':
        mapNumGoing=mapNumGoingC;
        mapNumWait=true;
        nextm=true;
        iox=0;
        break;
    case 'N':
    case 'n':

        nextK=false;
        jox=iox;

        break;
    default:
        break;;
    }
    return;
}
void nextMap(HDC hdc)
{

    if(nextm)
    {
        for(int m=0; m<14; m++)
        {
            for(int n=0; n<16; n++)
            {
                if(map[m][n]==3||map[m][n]==7)
                {
                    iox++;

                }
            }
        }
        nextm=false;
    }
    if(nextK)
    {
        jox=0;
        for(int i=0; i<14; i++)
        {

            for(int j=0; j<16; j++)
            {
                if(map[i][j]==7)
                {
                    jox++;

                }
            }
        }
    }
    if(jox==iox)
    {
        if(mapNumGoing<18)
        {
            mapNumGoing++;
        }
        mapNumGoingC=mapNumGoing;
        mapNumWait=true;
        nextm=true;
        nextK=true;
        iox=0;
        textc=true;
        Sleep(2000);
        //DrawMapBase();
        //DrawMap(hdc);
        //nextMap(hdc);
    }
}
void TextManage(HDC hdc)
{
    HFONT hFont1=CreateFont(20,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,_T("微软雅黑"));
    SelectObject(hdc,hFont1);  //将字体选入设备环境中
    SetBkMode(hdc, TRANSPARENT);    //设置输出文字背景色为透明
    //SetTextColor(hdc,RGB(50,50,200));
    //_TCHAR c1[]=_T("游戏进程:推箱新手,开始吧!生命不息,推箱不止!");
    _TCHAR c2[]=_T("游戏说明:所有箱子推至“十”。共十八关,难度递增。目标达成,推箱仙人!");
    _TCHAR c3[]=_T("游戏操作:按键WSAD或↑↓→←移动箱子,按下“P”键,重新开始当前关。");
    _TCHAR c4[]=_T("代码要点:win32GDI绘图,消息流程控制。");
    _TCHAR c5[]=_T("关卡设计:参考易语言例程推箱子;代码:参考网络资源");
    _TCHAR c6[]=_T("作       者:零千刻                            日期:17.05.25");

    //_TCHAR c7[]=_T("关卡:第一关");
    //_TCHAR c8[]=_T("称号:推箱新手");
    _TCHAR c9[]=_T("激励:推上云霄");

    _TCHAR c10[]=_T("休息一下!");
    SetTextColor(hdc,RGB(203,136,82));
    //TextOut(hdc,4+12,476+4,c1,strlen(c1));
    TextOut(hdc,4+12,476+28,c2,strlen(c2));
    TextOut(hdc,4+12,476+44,c3,strlen(c3));
    TextOut(hdc,4+12,476+60,c4,strlen(c4));
    TextOut(hdc,4+12,476+76,c5,strlen(c5));
    TextOut(hdc,4+12,476+92,c6,strlen(c6));

    //TextOut(hdc,520+10,24+30,c7,strlen(c7));
    //TextOut(hdc,520+10,24+90,c8,strlen(c8));
    TextOut(hdc,520+10,24+120,c9,strlen(c9));
    TextOut(hdc,520+10,WINDOW_HEIGHT-200,c10,strlen(c10));
    DeleteObject(hFont1);
}
void TextChange(HDC hdc)
{

    HPEN hPen1=CreatePen(PS_SOLID,1,RGB(154,205,141));
    HFONT hFont1=CreateFont(20,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,_T("微软雅黑"));
    HBRUSH hbrush2=CreateSolidBrush(RGB(154,205,141));
//将字体选入设备环境中 _TCHAR
    SetBkMode(hdc, TRANSPARENT); //设置输出文字背景色为透明
    _TCHAR d11[]=_T("游戏进程:推箱新手,开始吧!生命不息,推箱不止!");
    _TCHAR d17[]=_T("关卡:第一关");
    _TCHAR d18[]=_T("称号:推箱新手");
    _TCHAR d21[]=_T("游戏进程:推箱识途,好的开始,向前向前!");
    _TCHAR d27[]=_T("关卡:第二关");
    _TCHAR d28[]=_T("称号:推箱识途");
    _TCHAR d31[]=_T("游戏进程:推箱识途,略有进步,努力努力!");
    _TCHAR d37[]=_T("关卡:第三关");
    _TCHAR d38[]=_T("称号:推箱识途");
    _TCHAR d41[]=_T("游戏进程:推箱识途,大有进步,向前向前!");
    _TCHAR d47[]=_T("关卡:第四关");
    _TCHAR d48[]=_T("称号:推箱识途");
    _TCHAR d51[]=_T("游戏进程:推箱识途,即将升级,过关过关!");
    _TCHAR d57[]=_T("关卡:第五关");
    _TCHAR d58[]=_T("称号:推箱识途");
    _TCHAR d61[]=_T("游戏进程:推箱有成,不忘初心,方得始终!");
    _TCHAR d67[]=_T("关卡:第六关");
    _TCHAR d68[]=_T("称号:推箱有成");
    _TCHAR d71[]=_T("游戏进程:推箱有成,万里长城推不倒!");
    _TCHAR d77[]=_T("关卡:第七关");
    _TCHAR d78[]=_T("称号:推箱有成");
    _TCHAR d81[]=_T("游戏进程:推箱有成,千里黄河水滔滔!");
    _TCHAR d87[]=_T("关卡:第八关");
    _TCHAR d88[]=_T("称号:推箱有成");
    _TCHAR d91[]=_T("游戏进程:推箱有成,江山秀丽,叠彩峰岭!");
    _TCHAR d97[]=_T("关卡:第九关");
    _TCHAR d98[]=_T("称号:推箱有成");
    _TCHAR d101[]=_T("游戏进程:推箱悟心,天地任我行,实力在先!");
    _TCHAR d107[]=_T("关卡:第十关");
    _TCHAR d108[]=_T("称号:推箱悟心");
    _TCHAR d111[]=_T("游戏进程:推箱悟心,推箱不语,正悟心得!");
    _TCHAR d117[]=_T("关卡:第十一关");
    _TCHAR d118[]=_T("称号:推箱悟心");
    _TCHAR d121[]=_T("游戏进程:推箱悟心,新的境界,感悟期待!");
    _TCHAR d127[]=_T("关卡:第十二关");
    _TCHAR d128[]=_T("称号:推箱悟心");
    _TCHAR d131[]=_T("游戏进程:推箱得道,道可道,非常道,莫言!");
    _TCHAR d137[]=_T("关卡:第十三关");
    _TCHAR d138[]=_T("称号:推箱得道");
    _TCHAR d141[]=_T("游戏进程:推箱得道,一生二,二生三,三生万物!");
    _TCHAR d147[]=_T("关卡:第十四关");
    _TCHAR d148[]=_T("称号:推箱得道");
    _TCHAR d151[]=_T("游戏进程:推箱得道,若要升仙,先过此关!");
    _TCHAR d157[]=_T("关卡:第十五关");
    _TCHAR d158[]=_T("称号:推箱得道");
    _TCHAR d161[]=_T("游戏进程:推箱仙人,有仙术,“N” 跳到下一关!!");
    _TCHAR d167[]=_T("关卡:第十六关");
    _TCHAR d168[]=_T("称号:推箱仙人");
    _TCHAR d171[]=_T("游戏进程:推箱仙人,飞升云天,胜利在望! ");
    _TCHAR d177[]=_T("关卡:第十七关");
    _TCHAR d178[]=_T("称号:推箱仙人");
    _TCHAR d181[]=_T("游戏进程:推箱仙人,天地变色,众生膜拜!");
    _TCHAR d187[]=_T("关卡:第十八关");
    _TCHAR d188[]=_T("称号:推箱仙人");

    if(textc)
    {
        switch(mapNumGoing)
        {
        case 1:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d11,strlen(d11));
            TextOut(hdc,520+10,24+30,d17,strlen(d17));
            TextOut(hdc,520+10,24+90,d18,strlen(d18));
            break;
        case 2:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d21,strlen(d21));
            TextOut(hdc,520+10,24+30,d27,strlen(d27));
            TextOut(hdc,520+10,24+90,d28,strlen(d28));
            break;
        case 3:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d31,strlen(d31));
            TextOut(hdc,520+10,24+30,d37,strlen(d37));
            TextOut(hdc,520+10,24+90,d38,strlen(d38));
            break;
        case 4:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d41,strlen(d41));
            TextOut(hdc,520+10,24+30,d47,strlen(d47));
            TextOut(hdc,520+10,24+90,d48,strlen(d48));
            break;
        case 5:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d51,strlen(d51));
            TextOut(hdc,520+10,24+30,d57,strlen(d57));
            TextOut(hdc,520+10,24+90,d58,strlen(d58));
            break;
        case 6:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d61,strlen(d61));
            TextOut(hdc,520+10,24+30,d67,strlen(d67));
            TextOut(hdc,520+10,24+90,d68,strlen(d68));
            break;
        case 7:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d71,strlen(d71));
            TextOut(hdc,520+10,24+30,d77,strlen(d77));
            TextOut(hdc,520+10,24+90,d78,strlen(d78));
            break;
        case 8:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d81,strlen(d81));
            TextOut(hdc,520+10,24+30,d87,strlen(d87));
            TextOut(hdc,520+10,24+90,d88,strlen(d88));
            break;
        case 9:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d91,strlen(d91));
            TextOut(hdc,520+10,24+30,d97,strlen(d97));
            TextOut(hdc,520+10,24+90,d98,strlen(d98));
            break;
        case 10:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d101,strlen(d101));
            TextOut(hdc,520+10,24+30,d107,strlen(d107));
            TextOut(hdc,520+10,24+90,d108,strlen(d108));
            break;
        case 11:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d111,strlen(d111));
            TextOut(hdc,520+10,24+30,d117,strlen(d117));
            TextOut(hdc,520+10,24+90,d118,strlen(d118));
            break;
        case 12:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d121,strlen(d121));
            TextOut(hdc,520+10,24+30,d127,strlen(d127));
            TextOut(hdc,520+10,24+90,d128,strlen(d128));
            break;
        case 13:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d131,strlen(d131));
            TextOut(hdc,520+10,24+30,d137,strlen(d137));
            TextOut(hdc,520+10,24+90,d138,strlen(d138));
            break;
        case 14:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d141,strlen(d141));
            TextOut(hdc,520+10,24+30,d147,strlen(d147));
            TextOut(hdc,520+10,24+90,d148,strlen(d148));
            break;
        case 15:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d151,strlen(d151));
            TextOut(hdc,520+10,24+30,d157,strlen(d157));
            TextOut(hdc,520+10,24+90,d158,strlen(d158));
            break;
        case 16:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d161,strlen(d161));
            TextOut(hdc,520+10,24+30,d167,strlen(d167));
            TextOut(hdc,520+10,24+90,d168,strlen(d168));
            break;
        case 17:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d171,strlen(d171));
            TextOut(hdc,520+10,24+30,d177,strlen(d177));
            TextOut(hdc,520+10,24+90,d178,strlen(d178));
            break;
        case 18:
            SelectObject(hdc,hPen1);
            SelectObject(hdc,hbrush2);
            Rectangle(hdc,4+12,476+4,4+12+450,476+4+18);
            Rectangle(hdc,520+10,24+30,640-4,24+30+18);
            Rectangle(hdc,520+10,24+90,640-4,24+90+18);
            SelectObject(hdc,hFont1);
            SetTextColor(hdc,RGB(203,136,82));
            TextOut(hdc,4+12,476+4,d181,strlen(d181));
            TextOut(hdc,520+10,24+30,d187,strlen(d187));
            TextOut(hdc,520+10,24+90,d188,strlen(d188));
            break;
        }
        DeleteObject(hPen1);
        DeleteObject(hFont1);
        DeleteObject(hbrush2);
        textc=false;
    }
}
更多相关代码参见相关资源:

http://download.csdn.net/detail/qq_38329891/9865177

点击打开链接


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值