利用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