visual studio 扫雷游戏API的实现方法.docx
《visual studio 扫雷游戏API的实现方法.docx》由会员分享,可在线阅读,更多相关《visual studio 扫雷游戏API的实现方法.docx(31页珍藏版)》请在冰豆网上搜索。
visualstudio扫雷游戏API的实现方法
经典扫雷游戏C++API函数的实现方法
扫雷对大家来说应该是非常熟悉和经典的游戏之一了,但是这样一个看似简单的小游戏是如何实现的呢?
其实方法有很多种,相信我们大家都学过C++,我就先提供一种利用C++中的API函数实现扫雷的方法。
代码使用说明:
游戏实现后的功能,鼠标左键单击掀开未知区域,鼠标右键单击设置标记,鼠标中间滑轮单击实现自动翻开功能。
1首先打开VisualStudio2010软件;
2点击文件->新建->项目
3选择Win32中的Win32项目:
4确定后点击“下一步”:
如下图中勾选,点击完成即可:
5点击视图主菜单(View)->解决方案资源管理器:
6在右侧的解决方案资源管理器中的头文件文件夹中添加下面的头文件(.h),在源文件文件夹下添加下面的源文件(.cpp文件)
以下是实现的各部分代码:
首先我们来写程序的入口程序WinMain函数:
文档命名为WinMain.cpp
#include"proc.h"
#include"caculate.h"
externcharco[xk][yk];
externcharth[xk][yk];
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow)
{
creat(th);num(th);cover(th,co);
MSGMsg;
if(!
InitWindowsClass(hInstance))
returnFALSE;
if(!
InitWindows(hInstance,nCmdShow))
returnFALSE;
//-----------------消息循环----------------------
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
returnMsg.wParam;//消息循环结束即程序终止时将信息返回系统
}
由于Windows是基于消息的传递机制,所以接下来编写过程处理函数:
命名为Proc.cpp
#include"proc.h"
#include"caculate.h"
externintrecord[xk][yk]={0};//记录窗口的图形状态0为关闭、1为开启、2为占旗
externcharco[xk][yk];
externcharth[xk][yk];
externintxs,ys;
externinttn;
voidprint(charco[xk][yk],HWNDhWnd,intini_x,intini_y,intwidth,intheight,intcir_len);
longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)
{
intwidth=d_width,height=d_height,ini_x=d_ini_x,ini_y=d_ini_y,cir_len=8,mine_x=ys,mine_y=xs,cyc_x,cyc_y;
intmove_x,move_y,record_i,record_j,flag;
inttest_x,test_y;
WORDmouse_x,mouse_y;
HDChDC;//定义指向设备的句柄
HBRUSHhBrush,hB;//定义指向画刷的句柄
HPENhPen;//定义指向画笔的句柄
PAINTSTRUCTPtStr;//定义指向包含绘图信息的结构体变量
WORDx,y;
HCURSORhCursor;
TEXTMETRICtm;
wchar_tlpsz1[]=L"重新开局",lpsz2[]=L"重试本局",lpsz[3],lpsz_text[]=L"剩余标记数:
";
inti,j;//揭开时的坐标
switch(iMessage)//处理消息
{
caseWM_MOUSEMOVE:
x=LOWORD(lParam);
y=HIWORD(lParam);
if(x>=ini_x&&x<=ini_x+width*mine_x&&y>=ini_y&&y<=ini_y+height*mine_y)
{
hCursor=LoadCursor(NULL,IDC_CROSS);
SetCursor(hCursor);
}/*
if(x>=20+2*d_ini_x+ys*d_width&&x<=20+2*d_ini_x+ys*d_width+70&&y>=10&&y<=10+height)
{
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,20+2*d_ini_x+ys*d_width,10,20+2*d_ini_x+ys*d_width+70,10+height,cir_len,cir_len);
EndPaint(hWnd,&PtStr);//结束绘图
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
SetTextColor(hDC,RGB(255,233,0));
GetTextMetrics(hDC,&tm);
TextOut(hDC,20+2*d_ini_x+ys*d_width+2,10+2,lpsz1,4);
EndPaint(hWnd,&PtStr);//结束绘图
}*/
return0;
caseWM_PAINT:
//处理绘图消息
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
for(cyc_x=0;cyc_x{
for(cyc_y=0;cyc_y{
RoundRect(hDC,ini_x+cyc_y*width,ini_y+cyc_x*height,ini_x+cyc_y*width+width,ini_y+cyc_x*height+height,cir_len,cir_len);//绘制圆角矩形
}
}
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
//按钮
EndPaint(hWnd,&PtStr);//结束绘图
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(WHITE_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,20+2*d_ini_x+ys*d_width,10,20+2*d_ini_x+ys*d_width+70,10+height,cir_len,cir_len);
RoundRect(hDC,20+2*d_ini_x+ys*d_width,50,20+2*d_ini_x+ys*d_width+70,50+height,cir_len,cir_len);
EndPaint(hWnd,&PtStr);//结束绘图
//按钮
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
SetTextColor(hDC,RGB(255,233,0));
GetTextMetrics(hDC,&tm);
TextOut(hDC,20+2*d_ini_x+ys*d_width+2,10+2,lpsz1,4);
TextOut(hDC,20+2*d_ini_x+ys*d_width+2,50+2,lpsz2,4);
EndPaint(hWnd,&PtStr);//结束绘图*/
return0;
caseWM_LBUTTONUP:
mouse_x=LOWORD(lParam);
mouse_y=HIWORD(lParam);
test_x=(mouse_x+ini_x)/25-1;
test_y=(mouse_y+ini_y)/25-1;
move_x=((mouse_x+ini_x)/25-1)*width+ini_x;
move_y=((mouse_y+ini_y)/25-1)*height+ini_y;
if(mouse_x>=20+2*d_ini_x+ys*d_width&&mouse_x<=20+2*d_ini_x+ys*d_width+70&&mouse_y>=50&&mouse_y<=50+height)
{
cover(th,co);
for(record_i=0;record_ifor(record_j=0;record_jrecord[record_i][record_j]=0;
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
for(cyc_x=0;cyc_x{
for(cyc_y=0;cyc_y{
RoundRect(hDC,ini_x+cyc_y*width,ini_y+cyc_x*height,ini_x+cyc_y*width+width,ini_y+cyc_x*height+height,cir_len,cir_len);//绘制圆角矩形
}
}
}
if(mouse_x>=20+2*d_ini_x+ys*d_width&&mouse_x<=20+2*d_ini_x+ys*d_width+70&&mouse_y>=10&&mouse_y<=10+height)
{
creat(th);num(th);cover(th,co);
for(record_i=0;record_ifor(record_j=0;record_jrecord[record_i][record_j]=0;
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
for(cyc_x=0;cyc_x{
for(cyc_y=0;cyc_y{
RoundRect(hDC,ini_x+cyc_y*width,ini_y+cyc_x*height,ini_x+cyc_y*width+width,ini_y+cyc_x*height+height,cir_len,cir_len);//绘制圆角矩形
}
}
}
if(mouse_x>=ini_x&&mouse_x<=ini_x+width*mine_x&&mouse_y>=ini_y&&mouse_y<=ini_y+height*mine_y)
{
if(record[test_y][test_x]==0)
{
//record[test_y][test_x]=1;
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(WHITE_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,move_x,move_y,move_x+width,move_y+height,cir_len,cir_len);
EndPaint(hWnd,&PtStr);//结束绘图
//揭开
//cover(th,co);
i=test_y;j=test_x;//获取揭开坐标
if(th[i][j]=='*')
{
copy(th,co);
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
for(record_i=0;record_ifor(record_j=0;record_jrecord[record_i][record_j]=1;
}
else
{
if(th[i][j]==0)
{
open(th,co,i,j);
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
}
else
{
co[i][j]=th[i][j];
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
}
}
//揭开*/
}
/*
elseif(record[test_y][test_x]==2)
{
record[test_y][test_x]=0;
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式左键取消标记代码
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,ini_x+width*test_x,ini_y+height*test_y,ini_x+width*test_x+width,ini_y+height*test_y+height,cir_len,cir_len);
EndPaint(hWnd,&PtStr);
}*/
}
return0;
caseWM_RBUTTONDOWN:
mouse_x=LOWORD(lParam);
mouse_y=HIWORD(lParam);
test_x=(mouse_x+ini_x)/25-1;
test_y=(mouse_y+ini_y)/25-1;
move_x=((mouse_x+ini_x)/25-1)*width+ini_x;
move_y=((mouse_y+ini_y)/25-1)*height+ini_y;
if(mouse_x>=ini_x&&mouse_x<=ini_x+width*mine_x&&mouse_y>=ini_y&&mouse_y<=ini_y+height*mine_y)
{
if(record[test_y][test_x]==0)
{
hDC=GetDC(hWnd);
record[test_y][test_x]=2;
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(WHITE_BRUSH);
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
Pie(hDC,move_x+2,move_y+2,move_x+25,move_y+25,move_x+2,move_y+2,move_x+2,move_y+2);
EndPaint(hWnd,&PtStr);
}
elseif(record[test_y][test_x]==2)
{
record[test_y][test_x]=0;
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//黑色画笔
hB=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC,hB);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,ini_x+width*test_x,ini_y+height*test_y,ini_x+width*test_x+width,ini_y+height*test_y+height,cir_len,cir_len);
EndPaint(hWnd,&PtStr);
}
}
flag=0;
for(record_i=0;record_ifor(record_j=0;record_j{
if(record[record_i][record_j]==2)flag++;
}
flag=tn-flag;
lpsz[0]=flag/100+48;lpsz[1]=(flag%100)/10+48;lpsz[2]=flag%10+48;
hDC=GetDC(hWnd);
SetMapMode(hDC,MM_ANISOTROPIC);//设置映像模式
SetTextColor(hDC,RGB(0,0,234));
GetTextMetrics(hDC,&tm);
TextOut(hDC,20+2*d_ini_x+ys*d_width+2,80+2,lpsz_text,5);
TextOut(hDC,20+2*d_ini_x+ys*d_width+2,120+2,lpsz,3);
return0;
caseWM_MBUTTONDOWN:
mouse_x=LOWORD(lParam);
mouse_y=HIWORD(lParam);
test_x=(mouse_x+ini_x)/25-1;
test_y=(mouse_y+ini_y)/25-1;
move_x=((mouse_x+ini_x)/25-1)*width+ini_x;
move_y=((mouse_y+ini_y)/25-1)*height+ini_y;
if(record[test_y][test_x]==1)
{
if(intelligence(record,th,test_x,test_y))
{
for(i=test_y-1,j=test_x-1;j<=test_x+1;j++)
{
if(i<0||j<0||i>=xs|j>=ys)continue;
if(record[i][j]!
=1&&record[i][j]!
=2)
{
co[i][j]=th[i][j];
if(th[i][j]==0)
open(th,co,i,j);
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
}
}
for(j--,i++;i<=test_y+1;i++)
{
if(i<0||j<0||i>=xs|j>=ys)continue;
if(record[i][j]!
=1&&record[i][j]!
=2)
{
co[i][j]=th[i][j];
if(th[i][j]==0)
open(th,co,i,j);
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
}
}
for(i--,j--;j>=test_x-1;j--)
{
if(i<0||j<0||i>=xs|j>=ys)continue;
if(record[i][j]!
=1&&record[i][j]!
=2)
{
co[i][j]=th[i][j];
if(th[i][j]==0)
open(th,co,i,j);
print(co,hWnd,ini_x,ini_y,width,height,cir_len);
}
}
for(j++,i--;i>=test_y;i--)
{
if(