利用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;               //绘图结构psHBITMAP 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)    // 如果被按下的键是ESCDestroyWindow(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;               //绘图结构psHBITMAP hbmMem,hbmOld;BeginPaint(hwnd,&ps); //开始绘图,并获取绘图环境hDChMemDC=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));
//将字体选入设备环境中 _TCHARSetBkMode(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

点击打开链接

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

  1. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  2. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

  3. c#推箱子小游戏代码_推箱子小游戏V1.0制作

    小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...

  4. 移动平台开发项目(推箱子小游戏)

    项目目的:实现一个推箱子小游戏 项目架构:使用三个活动类 项目功能: 能在touch中的Action_down动作下,实现小人推着箱子走的效果,全部箱子到达旗帜为过关. 能使用底部Button键来前后 ...

  5. C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流

    C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流 说明:学做了4关推箱子, 仅供初学者参考可用g++ 编译,可以将内容复制到TXT文件,将后缀改为".cp ...

  6. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

  7. python推箱子小游戏

    推箱子小游戏 本次小游戏学习视频:https://www.bilibili.com/video/BV1gz411B71H 相关素材:点击这里 import turtle import levelms ...

  8. PLC也能制作小游戏----Codesys编写推箱子小游戏

    1.序言 前文已介绍,Codesys编程软件拥有的各种编译方式,以及强大的可视化功能,完全可以实现类似的小游戏程序编写,让疲惫的工控人员在调机的空闲之余可以休闲下,本文编写另一个小游戏,也是十几年前的 ...

  9. 基于Java Swing JFream 组件的趣味推箱子小游戏

    一 需求分析 设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的"上"."下"."左"."右 ...

最新文章

  1. 生成可执行jar文件
  2. NPS cisco 802.1x window7 实现认证接入网络
  3. arm export 汇编_C/C++与汇编混合编程有什么好处?
  4. 我来谈谈小程序和工作方向
  5. Libevent源码分析-----连接监听器evconnlistener
  6. linux ps pstree pstack命令
  7. 有小数点是什么类型_「JAVA零基础入门系列」Day3 Java基本数据类型
  8. Macro版Property Generator辅助工具
  9. python的setheading什么意思_用Python告诉你什么是佩奇
  10. 智能门锁的千亿市场,为何迟迟不来?
  11. Linux搭建Redis集群(搭建集群必看)
  12. HTML四季变换图,四季星空图
  13. 画出使用回溯法解0/1背包问题的解空间树
  14. python语言接收信息的内置函数_Python这7个好用内置函数!
  15. Android常用炫酷风格控件包含项目地址汇总
  16. 群晖邮箱服务器需要什么证书,群晖NAS邮件通知及两步验证登录详解
  17. navicat导入excel 日期格式处理
  18. Linux学习笔记 驱动开发篇
  19. iOS定位从 “始终”定位,改变成“使用期间”定位
  20. 降维算法(PCA/LDA/LLE/LEP/FA)总结

热门文章

  1. OSPF协议中查看路由器的RID
  2. JavaScript中自定义函数以及文本框、radio、下拉框的值的获取,结合淘宝竞拍案例来理解。。。...
  3. 服务器过关稳定靠谱有利于网站的运行
  4. jQuery Ajax 实例 全解析(转载)
  5. 刘润:四个层次决定企业存亡
  6. Kubernetes集群部署实录
  7. 现代 Web 开发的现状与未来(JSDC 2019 演讲全文)
  8. java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用...
  9. PCI-E 1X金手指封装
  10. php工程师 英文,开发工程师的英文怎么说