扫雷程序

/*=====================================================================*/
//======================== 扫雷程序 开源代码 ==========================//
//========================   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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值