c++,扫雷问题,调试成功,为什么进不了雷区?谢谢各位了
#include<iostream>#include<stdio.h>
#include<Windows.h>
#define Long 9
#define Width 9
#define Bombnumbers 10
using namespace std;
class Grid
{
private:
bool ifhasBomb;//记录是否有雷
int NeighborBombNums;//记录周围的雷数
bool ifhasopend;//记录是否被打开
bool ifhasmarked;
bool ifhasclosed;//记录是否被标识
int closeBombNums;
public:
bool HaveBomb()
{
ifhasBomb=true;
}
void SetNeighborBombNums(int number)
{
NeighborBombNums=number;
}
bool HaveOpend()
{
ifhasopend=true;
}
bool HaveMarked()
{
ifhasmarked=true;
}
bool HaveClosed()
{
ifhasclosed=true;
}
void setcloseBombNums(int number)
{
closeBombNums=number;
}
};
class Deal:public Grid
{
//Grid obGrid;
private:
int X,Y;
bool ifhasopend;//记录是否被打开
bool ifhasclosed;//记录是否是关闭的
bool ifhasmarked;//记录是否被标记
int bombNumber;
bool ifhasBomb;//记录是否有雷
int NeighborBombNums;//记录周围的雷数
int R=10;//显示剩余的雷数
int x,y;//输入坐标
int closeBombNums;
//Grid grid;
public:
//void flag();
void Display();
//void opendisplay();
//void bombdisplay();
int Click(int,int);//当输入坐标选择点开时
};
class Mine:public Deal
{
private:
int X;
int Y;
bool ifhasopend;//记录是否被打开
bool ifhasclosed;//记录是否是关闭的
bool ifhasmarked;//记录是否被标记
int bombNumber;
bool ifhasBomb;//记录是否有雷
int NeighborBombNums;//记录周围的雷数
int R=10;//显示剩余的雷数
int x,y;//输入坐标
int closeBombNums;
public:
void setBomb(int);
int AroundMineNumbers();
int closeBombNumber();//显示雷区中剩余的格子数
void mark();
void start();
void rules();
};
Mine mine[Long][Width];//定义一个雷区数组
void Mine::setBomb(int bombNumber) //随机放置Bombnumbers个雷在雷区中
{
bombNumber = Bombnumbers;
int i;
int x,y;
srand((unsigned)GetCurrentTime()); //初始化产生随机数函数
for(i=0;i<Bombnumbers;i++)
{ int m=10,n=10;
if(mine[m][n].HaveBomb()==false)
{
m=rand()%Long+1; n=rand()%Width+1;//随机产生雷位坐标
mine[m][n].HaveBomb()==true;
}
}
/*for(x=0;x<Long;x++)
{
for(y=0;y<Width;y++)
{cout<<" ■ ";}
cout<<"\n"<<endl;
//cout<<"\n"<<endl;
}*/
}
int Mine::AroundMineNumbers()//计算所选坐标附近的雷数
{
int a,b;
if(mine[a][b].HaveBomb()==true)
{return 0 ;}//此时这个坐标就是雷区
else
{int x;
int y;
int p;
int q;
int z=0;
for(x=-1;x<1;x++)
{ for(y=-1;y<1;y++)//判断(a,b)坐标附近八个格子中是否有雷
p=a+x;q=a+y;
if(p>=0&&q>=0&&p<Long&&q<Width)//排除不适当的坐标点
{if(mine[a+x][b].HaveBomb()==true)
z++;}
mine[Long][Width].SetNeighborBombNums(z);
}
}
}
/*int Mine::closeBombNumber()
{
int x,y;
int n=Bombnumbers;
for(x=0;x<Long;x++)
{
for(y=0;y<Width;y++)
{
if(mine[x][y].HaveMarked()==true)
n--;
}
mine[Long][Width].setcloseBombNums(n);
}
}
/*int Mine::open()
{
int a,b;
int num;
if((mine[a][b].HaveOpend()==true)||(mine[a][b].HaveBomb()==true))
return 0;
else mine[a][b].HaveOpend()==true;
if(mine[a][b].HaveBomb()==false)
num=AroundMineNumbers();
return num;
} */
/*void Mine::mark()
{
int a,b;
if(mine[a][b].HaveMarked()==true)
return ;
if(mine[a][b].HaveMarked()==false)
{
if(mine[a][b].HaveBomb()==false)
{
mine[a][b].HaveMarked()==true;
//if(mine[a][b].HaveBomb()==false)
//flag();
}
}
}*/
void Mine::rules()
{
cout<<"欢迎来到扫雷\n";
cout<<"以下是扫雷的游戏规则:\n";
cout<<"1 雷区从左往右横坐标依次为0-9,从上往下纵坐标依次为0-9\n2 按照游戏要求输入坐标(x,y),根据提示完成游戏操作\n";
cout<<"3 若没有点中雷区,则显示该坐标附近八个格子的地雷数目;若点中雷区,则游戏结束;若标记正确,则地雷数少一。\n";
cout<<"######################################################\n";
cout<<"请开始游戏:\n";
}
void Mine::start()
{ //if(mine[Long][Width].closeBombNumber()=L)
int x,y,k,m;
int a,b;
cout<<"请输入坐标(x y中间用空格间开):x(0-9) y(0-9)\n";
cin>>x>>y;
cout<<"请选择要点击0还是标记1\n";
cin>>k;
if (k=1)
{ mine[x][y].HaveOpend()==true;
for(a=0;a<Long;a++)
{
for(b=0;b<Width;b++)
{ if(mine[a][b].HaveOpend()==false||mine[a][b].HaveMarked()==false) cout<<" ■ ";
if(mine[a][b].HaveOpend()==false||mine[a][b].HaveMarked()==true) cout<<" & ";
if(mine[a][b].HaveOpend()==true&&mine[a][b].HaveBomb()==true) cout<<" x ";
if(mine[a][b].HaveOpend()==true&&mine[a][b].HaveBomb()==false) cout<<" √ ";
cout<<"\n"<<endl;
}
// cout<<"\n"<<endl;
}
}
}
void Deal::Display()
{
int x,y;
for(x=0;x<Long;x++)
{
for(y=0;y<Width;y++)
{cout<<" ■ ";}
cout<<"\n"<<endl;
//cout<<"\n"<<endl;
}
}
/*int Deal::Click(int a,int b)
{
X=a;
Y=b;
int p,q;
/*if(mine[a][b].HaveOpend()==true)
{
cout<<"此坐标已被打开 请重新输入/n"<<endl;
cin>>x;
cin>>y;
}
if(mine[a][b].HaveBomb()==true)
{
cout<<"游戏结束"<<endl;///////////////////////////////////////////////////
}
if(mine[a][b].HaveBomb()==false)
{
mine[a][b].HaveOpend()==true;
for(p=0;p<Long;p++)
{
for(q=0;q<Width;q++
)
{
if(mine[p][q].HaveOpend()==true)
{cout<<" √ " <<endl; }
else
cout<<" ■ "<<endl;
cout<<"\n"<<endl;
}
}
}
}*/
/*void Deal::flag()
{
int a,b;
int x,y;
if((mine[a][b].HaveMarked()==true)||mine[a][b].HaveOpend()==true)
return ;
if(mine[a][b].HaveMarked()==false)
{
for(x=0;x++;x<Long)
{
for(y=0;y++;y<Width)
{
if(x==a&&y==b) cout<<" & "<<endl;
else
cout<<" ■ "<<endl;
cout<<"\n"<<endl;
}
}
}
}
void Deal::opendisplay()
{
int a,b;
int x,y;
for(x)
}
void Deal::bombdisplay()
{
int a,b;
}*/
int main()
{
cout<<"扫雷界面如下:\n"<<endl;
Mine mine[Long][Width];
mine[Long][Width].setBomb(Bombnumbers);
mine[Long][Width].rules();
mine[Long][Width].start();
// mine[Long][Width].Display();
return 0;
}
[此贴子已经被作者于2018-1-11 18:52编辑过]