#include "stdafx.h"
#include <time.h>
#include <cstdlib>
#include <iostream>
using namespace std;
int map[12][12];// 为避免边界的特殊处理,故将二维数组四周边界扩展1
int fx[3]={0,1,-1};//方向数组
void render()
{
for(int i=1;i<10;i++)//输出9*9雷盘
{
for(int j=1;j<10;j++)
{
cout<<"■";
}
cout<<endl;
}
cout<<endl;
}
void gameover()
{
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
{
if(map[i][j]==9)
cout<<"●";
else if(map[i][j]==0)
cout<<"□";
else if(map[i][j]==1)
cout<<" 1";
else if(map[i][j]==2)
cout<<" 2";
else if(map[i][j]==3)
cout<<" 3";
else if(map[i][j]==4)
cout<<" 4";
else
cout<<"■";
}
cout<<endl;
}
}
int calculate(int x,int y )// 统计以(x,y)为中心的四周的雷数目
{
int counter=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if (map[x+fx[i]][y+fx[j]] == 9 )
counter++;
}
}
return counter;
}
void game(int x,int y )//递归函数模拟游戏过程,若点到一个空白,则系统自动向外扩展
{
if(calculate(x,y)==0)//若返回值counter为0,那么就是周围一个雷没有
{
map[x][y]=0;//将现在的(x,y)渲染为0,即为空白区域
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)// 条件一是递归不能出界!二是不可以让两个方向坐标同时为0,否则递归调用本身!三是要保证不返回调用。
if((x+fx[i]<=9)&&(y+fx[j]<=9)&&(x+fx[i]>=1)&&(y+fx[j]>=1)&&!(fx[i]==0&&fx[j]==0)&&(map[x+fx[i]][y+fx[j]]==-1))
game(x+fx[i],y+fx[j]);
}
}
else
map[x][y] = calculate(x,y);
}
void print()
{
for(int i=1;i<10;i++)
{
for(int j =1;j<10;j++)
{
if(map[i][j]==-1||map[i][j]==9)
cout<<"■";
else if(map[i][j]==0)
cout<<"□";
else if(map[i][j]==1)
cout<<" 1";
else if(map[i][j]==2)
cout<<" 2";
else if(map[i][j]==3)
cout<<" 3";
else if(map[i][j]==4)
cout<<" 4";
else
cout<<map[i][j];
}
cout<<endl;
}
}
bool check ()
{
int counter=0;
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
if ((map[i][j]!=-1)&&(map[i][j]!=0)&&(map[i][j]!=1)&&(map[i][j]!=2)&&(map[i][j]!=3)&&(map[i][j]!=4))
counter++;
}
if(counter==10)
return true;
else
return false;
}
int main ()
{
int x,y;
char ch;
srand(time(0));//就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数
do
{
memset(map,-1,sizeof(map)); // 将map全部初始化为-1,以后用-1表示未涉及的区域
for(int i=0;i<10;i++)
{
x=rand()%9+1;//产生1-9之间的随机数
y=rand()%9+1;
if (map[x][y]!=9)//若随机的数不是9,那么让其等于9
{
map[x][y]=9;//9代表雷的位置
}
}//产生了雷的随机位置
render();//输出9*9雷盘
cout<<"请输入坐标:";
while(cin>>x>>y)//输入要点击位置的坐标
{
if(map[x][y]==9)//点中雷之后游戏结束,并且输出雷的位置
{
cout<<"Game over!"<<endl;
gameover();
break;
}
game(x,y);
print();
if(check())
{
cout<<"你赢了"<<endl;
break;
}
}
cout<<"再来一局请按y,否则请按任意键结束"<<endl;
cin >> ch;
cout <<endl<<endl;
}
while (ch=='y');
return 0;
}
#include <time.h>
#include <cstdlib>
#include <iostream>
using namespace std;
int map[12][12];// 为避免边界的特殊处理,故将二维数组四周边界扩展1
int fx[3]={0,1,-1};//方向数组
void render()
{
for(int i=1;i<10;i++)//输出9*9雷盘
{
for(int j=1;j<10;j++)
{
cout<<"■";
}
cout<<endl;
}
cout<<endl;
}
void gameover()
{
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
{
if(map[i][j]==9)
cout<<"●";
else if(map[i][j]==0)
cout<<"□";
else if(map[i][j]==1)
cout<<" 1";
else if(map[i][j]==2)
cout<<" 2";
else if(map[i][j]==3)
cout<<" 3";
else if(map[i][j]==4)
cout<<" 4";
else
cout<<"■";
}
cout<<endl;
}
}
int calculate(int x,int y )// 统计以(x,y)为中心的四周的雷数目
{
int counter=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if (map[x+fx[i]][y+fx[j]] == 9 )
counter++;
}
}
return counter;
}
void game(int x,int y )//递归函数模拟游戏过程,若点到一个空白,则系统自动向外扩展
{
if(calculate(x,y)==0)//若返回值counter为0,那么就是周围一个雷没有
{
map[x][y]=0;//将现在的(x,y)渲染为0,即为空白区域
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)// 条件一是递归不能出界!二是不可以让两个方向坐标同时为0,否则递归调用本身!三是要保证不返回调用。
if((x+fx[i]<=9)&&(y+fx[j]<=9)&&(x+fx[i]>=1)&&(y+fx[j]>=1)&&!(fx[i]==0&&fx[j]==0)&&(map[x+fx[i]][y+fx[j]]==-1))
game(x+fx[i],y+fx[j]);
}
}
else
map[x][y] = calculate(x,y);
}
void print()
{
for(int i=1;i<10;i++)
{
for(int j =1;j<10;j++)
{
if(map[i][j]==-1||map[i][j]==9)
cout<<"■";
else if(map[i][j]==0)
cout<<"□";
else if(map[i][j]==1)
cout<<" 1";
else if(map[i][j]==2)
cout<<" 2";
else if(map[i][j]==3)
cout<<" 3";
else if(map[i][j]==4)
cout<<" 4";
else
cout<<map[i][j];
}
cout<<endl;
}
}
bool check ()
{
int counter=0;
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
if ((map[i][j]!=-1)&&(map[i][j]!=0)&&(map[i][j]!=1)&&(map[i][j]!=2)&&(map[i][j]!=3)&&(map[i][j]!=4))
counter++;
}
if(counter==10)
return true;
else
return false;
}
int main ()
{
int x,y;
char ch;
srand(time(0));//就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数
do
{
memset(map,-1,sizeof(map)); // 将map全部初始化为-1,以后用-1表示未涉及的区域
for(int i=0;i<10;i++)
{
x=rand()%9+1;//产生1-9之间的随机数
y=rand()%9+1;
if (map[x][y]!=9)//若随机的数不是9,那么让其等于9
{
map[x][y]=9;//9代表雷的位置
}
}//产生了雷的随机位置
render();//输出9*9雷盘
cout<<"请输入坐标:";
while(cin>>x>>y)//输入要点击位置的坐标
{
if(map[x][y]==9)//点中雷之后游戏结束,并且输出雷的位置
{
cout<<"Game over!"<<endl;
gameover();
break;
}
game(x,y);
print();
if(check())
{
cout<<"你赢了"<<endl;
break;
}
}
cout<<"再来一局请按y,否则请按任意键结束"<<endl;
cin >> ch;
cout <<endl<<endl;
}
while (ch=='y');
return 0;
}