一、源码简介
这是一个可以进行扫雷游戏的小程序,采用C语言进行编写。
上下左右控制光标位置,按j键进行标记,按k进行点击探雷,并且当光标 放在数字上,且周围的雷都已经被正确标记时,按k可以点开周围所有的空白,不过出错会结束游戏。
雷区长宽为25格,初始有10雷,每过一关增加20雷。
编译环境:VC6.0(采取纯C语言写法)
第三方库:无
二、运行截图
三、源码解析
我们先来看游戏的主体逻辑。
虽然下面的代码很长,但逻辑还是较为清晰的。
以下循环
若游戏未开始,初始化。
若游戏开始,则检测键盘输入
按下ASDW则移动光标
第一次按下K,则初始化雷区
按下K则点开空白,或者清雷,并检测是否胜利
按下j则进行标记
游戏结束跳出循环
void Gamerun()//游戏主体
{
int first;
while(1)
{
if(gamestate==0)//初始化
{
first=0;
m_time=time(NULL);//时间初始化
Init_display();//初始化显示区域
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);//设置指定控制台屏幕缓冲区的光标的大小和可见性
gamestate=1;
}
else if(gamestate==1)//游戏中
{
RemainderMine();//计算剩余的雷
Draw_display();
MoveCursor();
PressJ();
if(GetAsyncKeyState('K')&1)//如果按下K
{
if(first==0)
{
Init_mine(pos.y,pos.x);
OpenDisplay(pos.y,pos.x);
first++;
if(Victory())//判定是否获胜
{
Showmine();
Draw_display();
UINT uint=MessageBox(NULL,TEXT("恭喜过关!是否继续。"),TEXT("提示"),1);
if(uint==IDOK)
{
count+=20;
level++;
gamestate=0;
}
else if(uint==IDCANCEL)
{
gamestate=2;
}
else;
}
else;
}
else
{
if(TreadMine(pos.y,pos.x))//判断是否踩到雷
{
Showmine();
Draw_display();
UINT uint=MessageBox(NULL,TEXT("扫雷失败!是否重新开始?"),TEXT("提示"),MB_OKCANCEL|MB_ICONERROR);
if(uint==IDOK)
{
gamestate=0;
}
else if(uint==IDCANCEL)
{
gamestate=2;
}
else;
}
else
{
OpenDisplay(pos.y,pos.x);
}
if(OpenNumDisplay1(pos.y,pos.x))//按K也可以清雷,返回值为1表示踩雷
{
Showmine();
Draw_display();
UINT uint=MessageBox(NULL,TEXT("扫雷失败!是否重新开始?"),TEXT("提示"),MB_OKCANCEL|MB_ICONERROR);
if(uint==IDOK)
{
gamestate=0;
}
else if(uint==IDCANCEL)

请登录后发表评论
注册
停留在世界边缘,与之惜别