/*=====================================================================*/
//======================== 扫雷程序 开源代码 ==========================//
//======================== Make By LyLhw ==========================//
/*=====================================================================*/
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
//#include"Mine.h"
#define W 10
#define H 10
#define TEST true
#define PLAY false
#define MINE -1
#define END 99
#define CONTINUE 878
class Mine{
public:
Mine(){face='#';};
~Mine(){};
public:
char face;
private:
int x,y;
public:
int num;
void init(int x,int y,int num);
};
int game=CONTINUE;
bool mode;
char menu;
Mine mineboard[W][H];
int chessboard[W][H];
void display();
void click(int i,int j);
//bool initialise(int* x,int* y);
int main(int argc,char** argv)
{
int i,j,k,x(0),y(0);
cout<<"//======================================================================//"<<endl;
cout<<"//===== 这是一款在VC6.0集成开发环境虚拟控制台下运行的扫雷游戏 =====//"<<endl;
cout<<"//===== 希望本代码会给你的学习提供帮助,联系 604114552@qq.com =====//"<<endl;
cout<<"//===== 首先,你是在测试模式下运行还是在娱乐模式下运行呢? =====//"<<endl;
cout<<"//===== 测试模式将显示随机布雷与分析数据的过程,而且雷可视 =====//"<<endl;
cout<<"//======================================================================//"<<endl;
cout<<"[1] TEST MODE /n[0] PLAY MODE/n";
cin>>mode;
if(mode==TEST)cout<<"TEST MODE";
else cout<<"PLAY MODE";
cout<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
chessboard[i][j]=0;
}
}
int* a=new int[10];
int* b=new int[10];
cout<<"//======================================================================//"<<endl;
cout<<"//======= 现在利用系统时钟产生随机数来随机布雷,请稍等片刻 ===========//"<<endl;
cout<<"//======================================================================//"<<endl;
srand((int)time(0));
for(i=0;i<10;i++)
{
a[i]=(1+(int)(10.0*rand()/(W+1.0)))%10;
}
printf("/n");
{
char a;
cout<<"//======================================================================//"<<endl;
cout<<"//============ 请问, 你是男的还是女的 想清楚回答 =============//"<<endl;
cout<<"//======================================================================//"<<endl;
cout<<"[b] BOY/n[g] GIRL"<<endl;
cin>>a;
}
srand((int)time(0));
for(i=0;i<10;i++)
{
b[i]=(1+(int)(10.0*rand()/(W+1.0)))%10;
}
for(k=0;k<10;k++)
{
i=a[k];j=b[k];
chessboard[i][j]=MINE;
}
if(mode)
{
cout<<"//======================================================================//"<<endl;
cout<<"//========== 时钟系统产生随机数对,分配为雷区 ===========//"<<endl;
cout<<"//======================================================================//"<<endl;
for(k=0;k<10;k++)
{
cout<<a[k]<<","<<b[k]<<endl;
}
}
delete a;
delete b;
if(mode==TEST)
{
cout<<"//======================================================================//"<<endl;
cout<<"//=============== 雷图:*为雷,其余为安全区 ================//"<<endl;
cout<<"//======================================================================//"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<<" ";
if(chessboard[i][j]==MINE)cout<<'*';
else cout<<'o';
}
cout<<endl;
}
}
cout<<"//======================================================================//"<<endl;
cout<<"//============ 布雷完毕,开始初始化扫雷吗 ===============//"<<endl;
cout<<"//======================================================================//"<<endl;
int p[W][H];
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
p[i][j]=0;
if(i-1>=0&&j-1>=0&&chessboard[i-1][j-1]==MINE)
p[i][j]++;
if(j-1>=0&&chessboard[i][j-1]==MINE)
p[i][j]++;
if(i+1<10&&j-1>=0&&chessboard[i+1][j-1]==MINE)
p[i][j]++;
if(i-1>=0&&chessboard[i-1][j]==MINE)
p[i][j]++;
if(i+1<10&&chessboard[i+1][j]==MINE)
p[i][j]++;
if(i-1>=0&&j+1<10&&chessboard[i-1][j+1]==MINE)
p[i][j]++;
if(j+1<10&&j+1<10&&chessboard[i][j+1]==MINE)
p[i][j]++;
if(i+1<10&&j+1<10&&chessboard[i+1][j+1]==MINE)
p[i][j]++;
}
}
/* for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
p[i][j]=0;
if(chessboard[i-1][j-1]==MINE)
p[i][j]++;
if(chessboard[i][j-1]==MINE)
p[i][j]++;
if(chessboard[i+1][j-1]==MINE)
p[i][j]++;
if(chessboard[i-1][j]==MINE)
p[i][j]++;
if(chessboard[i+1][j]==MINE)
p[i][j]++;
if(chessboard[i-1][j+1]==MINE)
p[i][j]++;
if(chessboard[i][j+1]==MINE)
p[i][j]++;
if(chessboard[i+1][j+1]==MINE)
p[i][j]++;
}
}
*/
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(chessboard[i][j]!=MINE)
chessboard[i][j]=p[i][j];
}
}
if(mode==TEST)
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<< setw(2)<<chessboard[i][j];
}
cout<<endl;
}
}
for(i=0;j<W;i++)
{
for(j=0;j<H;j++)
{
mineboard[i][j].init(i,j,chessboard[i][j]);
}
}
/*======================================================================*/
//========================= 游戏处理 ==============================//
/*======================================================================*/
cout<<"//======================================================================//"<<endl;
cout<<"//========= 初始化完成,开始游戏!输入坐标(x行,y列) ===========//"<<endl;
cout<<"//========= 范围(0,0)-(9,9),即坐标从0开始,右下为正 ===========//"<<endl;
cout<<"//========= 看到的第一行实为第零行,这和数组存储有关 ===========//"<<endl;
cout<<"//========= 由于这是学习,就不将它人性化了,重在学习 ===========//"<<endl;
cout<<"//======================================================================//"<<endl;
k=1;
display();
while(game==CONTINUE)
{
cin>>x>>y;
click(x,y);
cout<<"第 "<<k<<"步"<<endl;
k++;
display();
}
cout<<"//======================================================================//"<<endl;
cout<<"//=============== 雷图:*为雷,其余为安全区 ================//"<<endl;
cout<<"//======================================================================//"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<<" ";
if(chessboard[i][j]==MINE)cout<<'*';
else cout<<'o';
}
cout<<endl;
}
cout<<"//======================================================================//"<<endl;
cout<<"//=========== 答案,-1为雷,其余为周围雷数 ! ===========//"<<endl;
cout<<"//======================================================================//"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<< setw(2)<<chessboard[i][j];
}
cout<<endl;
}
return 0;
}
void click(int i,int j)
{
if (chessboard[i][j]==-1)
{
cout<<"//======================================================================//"<<endl;
cout<<"//============ 踩到雷了,游戏结束! ===============//"<<endl;
cout<<"//======================================================================//"<<endl;
game= END;
return ;
}
if(chessboard[i][j]==0)
{
mineboard[i][j].face='o';
if(i-1>=0&&j-1>=0&&mineboard[i-1][j-1].face=='#') click(i-1,j-1);
if(j-1>=0&&mineboard[i][j-1].face=='#') click(i,j-1);
if(i+1<10&&j-1>=0&&mineboard[i+1][j-1].face=='#') click(i+1,j-1);
if(i-1>=0&&mineboard[i-1][j].face=='#') click(i-1,j);
if(i+1<10&&mineboard[i+1][j].face=='#') click(i+1,j);
if(i-1>=0&&j+1<10&&mineboard[i-1][j+1].face=='#') click(i-1,j+1);
if(j+1<10&&j+1<10&&mineboard[i][j+1].face=='#') click(i,j+1);
if(i+1<10&&j+1<10&&mineboard[i+1][j+1].face=='#') click(i+1,j+1);
}
/*=====================================================================*/
//============ 遇到0就翻一圈,是0再翻(递归) ==============//
/*=====================================================================*/
if(chessboard[i][j]==1)mineboard[i][j].face='1';
if(chessboard[i][j]==2)mineboard[i][j].face='2';
if(chessboard[i][j]==3)mineboard[i][j].face='3';
if(chessboard[i][j]==4)mineboard[i][j].face='4';
if(chessboard[i][j]==5)mineboard[i][j].face='5';
if(chessboard[i][j]==6)mineboard[i][j].face='6';
if(chessboard[i][j]==7)mineboard[i][j].face='7';
if(chessboard[i][j]==8)mineboard[i][j].face='8';
game= CONTINUE;
for(int a=0;a<10;a++)
{
for(int b=0;b<10;b++)
{
if(chessboard[a][b]>=0&&mineboard[a][b].face=='#')return;
}
}
cout<<"//======================================================================//"<<endl;
cout<<"//============ 你已胜利,游戏结束! ===============//"<<endl;
cout<<"//======================================================================//"<<endl;
game=END;
}
void display()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<<" "<<mineboard[i][j].face;
}
cout<<endl;
}
}
void Mine::init(int x,int y,int num)
{
this->x=x;
this->y=y;
this->num=num;
}