qq_35401322 2016-07-02 02:50 采纳率: 0%
浏览 1592
已结题

如何用c++在已有的扫雷程序中做一个扫雷界面,

下面是我搜的程序,不用鼠标也可以,输入坐标扫雷也行,但那个大概界面怎么弄

#include
#include

//画棋盘 a雷表 b周围雷数表 c打开表
bool MakeMap(bool a[9][9],int b[9][9],bool c[9][9])
{
int i=0,j=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(c[i][j])
{
if(a[i][j])
{
printf("* "); //雷显示为*号
}
else
{
printf("%d ",b[i][j]); //无雷则显示周围雷总数
}
}
else printf("# ");
}
printf("\n");
}
/*
printf("\n");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(a[i][j]) printf("1 ");
else printf("0 ");
}
printf("\n");
}
*/
return true;
}
//生成随机数
int MakeRand()
{
return rand(); //可完善
}

//生成雷区
bool MakeMinefield(bool a[9][9])
{
int num = 0;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
num = MakeRand();
//printf("rand:%d\n",num);
if(num%3==0)
a[i][j] = true; //放雷
else a[i][j] = false;
}
}
return true;
}

//生成周围地雷数
bool MakeMineNum(bool a[9][9],int b[9][9])
{
int num = 0;
for(int i=0;i {
for(int j=0;j {
if(i-1>=0)//检查上面是否有雷
{

if(a[i-1][j]) num = num+1;
}
if(i+1 {
if(a[i+1][j]) num = num+1;
}
if(j-1>=0)//检查前面是否有雷
{

if(a[i][j-1]) num = num+1;
}
if(j+1 {
if(a[i][j+1]) num = num+1;
}
if((i-1>=0)&&(j-1>=0))//检查左上角是否有雷
{

if(a[i-1][j-1]) num = num+1;
}
if((i+1=0))//检查左下角是否有雷
{
if(a[i+1][j-1]) num = num+1;
}
if((i-1>=0)&&(j+1 {
if(a[i-1][j+1]) num = num+1;
}
if((i+1 {
if(a[i+1][j+1]) num = num+1;
}
b[i][j] = num; //保存周围雷数到b中
num = 0;
}
num = 0;
}
return true;
}
//开雷操作
bool OpenMine(int i,int j,bool a[9][9],int b[9][9],bool c[9][9],int skip)
{
if(c[i][j] && (b[i][j]!=0))
{
return false; //如果该网格曾经打开过,并且值不等于0,则直接返回
}
if(!a[i][j])
{
if(b[i][j]==0)
{
if((i-1>=0)&&(skip!=1))//检查上面是否有雷
{

c[i-1][j] = true; //打开该格

if(b[i-1][j]==0) OpenMine(i-1,j,a,b,c,2);//重载开雷函数,不开下面的格
}
if(i+1 {
c[i+1][j] = true;
if(b[i+1][j]==0) OpenMine(i+1,j,a,b,c,1);
}
if(j-1>=0&&(skip!=3))//检查前面是否有雷
{

c[i][j-1] = true;
if(b[i][j-1]==0) OpenMine(i,j-1,a,b,c,4);
}
if(j+1 {
c[i][j+1] = true;
if(b[i][j+1]==0) OpenMine(i,j+1,a,b,c,3);
}
if((i-1>=0)&&(j-1>=0)&&(skip!=5))//检查左上角是否有雷
{
c[i-1][j-1] = true;
if(b[i-1][j-1]==0) OpenMine(i-1,j-1,a,b,c,8);
}
if((i+1=0)&&(skip!=6))//检查左下角是否有雷
{
c[i+1][j-1] = true;
if(b[i+1][j-1]==0) OpenMine(i+1,j-1,a,b,c,7);
}
if((i-1>=0)&&(j+1 {
c[i-1][j+1] = true;
if(b[i-1][j+1]==0) OpenMine(i-1,j+1,a,b,c,6);
}
if((i+1 {
c[i+1][j+1] = true;
if(b[i+1][j+1]==0) OpenMine(i+1,j+1,a,b,c,5);
}
}
c[i][j] = true; //打开该格
}
else
{
return true;
}
return false;
}
//游戏操作
bool SeletctOneCell(bool a[9][9],int b[9][9])
{
bool c[9][9];
int i=0,j=0,k=0;
for(i=0;i {
for(int j=0;j {
c[i][j] = false; //棋盘状态初始化
}
}
while(1)
{
printf("输入坐标Y/X:");
scanf("%d/%d",&i,&j);
if((i>0&&i0&&j<10))
{
if(OpenMine(i-1,j-1,a,b,c,0)) //开雷,0表示四周的8个网格都开
{
//c[i-1][j-1] = true;

for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
c[i][j] = true; //棋盘状态初始化
}

            }
            MakeMap(a,b,c); //重绘雷区
            printf("踩到雷了\n");
            break;  //游戏结束
        }
        else
        {
            MakeMap(a,b,c); //重绘雷区
        }
        k++;
    }
    else printf("输入数值不合法");
    printf("\n");       
    if(k>81) //所有格都打开
    {
        printf("游戏结束\n");
        break;
    }
}
return true;

}
int main()
{
bool a[9][9];
int b[9][9];
int i=0,j=0;
printf("扫雷游戏开始\n");
MakeMinefield(a); //生成雷区
MakeMineNum(a,b); //生成周围地雷数
SeletctOneCell(a,b);
return 0;
}

  • 写回答

2条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题