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条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思