21xrx.com
2024-12-22 20:03:32 Sunday
登录
文章检索 我的文章 写文章
扫雷C++代码:让你轻松打造经典游戏!
2023-07-12 14:00:02 深夜i     --     --
C++ 扫雷 代码 经典游戏 打造

扫雷是一款经典的单机游戏,深受广大玩家的喜爱。然而,很多人可能不知道如何创建自己的扫雷游戏。其实,在学习C++语言后,就可以轻松地编写扫雷程序了!

下面,我们来分享一下一个简单的扫雷C++代码。

首先,在程序中需要引入一些头文件和命名空间:


#include<iostream>

#include<time.h>

#include<stdlib.h>

using namespace std;

这里引入了iostream、time.h以及stdlib.h三个头文件,并使用了std命名空间。

接着,定义一些常量和变量:


const int maxn=20 + 5;//定义地图大小

const int dx[8]= 1,dy[8]= 1;//方向数组

int ontomap[maxn][maxn],openmap[maxn][maxn];//ontomap存储原始地图,openmap存储打开后地图

bool flag,win;//用于判断游戏是否结束、胜利

int mine;//存储地雷数

这里的maxn定义了地图大小,dx和dy是用于记录方向的数组。ontomap是原始的地图数组,openmap是打开后的地图数组。flag和win则是用于判断游戏是否结束和是否胜利的标识符。mine则是存储地雷的数量。

接着,定义一些函数:


void init();//初始化地图

void print();//打印地图状态

void openzero(int x,int y);//打开周围为0的格子

void gameover();//游戏结束

void success();//游戏胜利

init函数用于初始化地图,print函数用于打印当前地图状态,openzero函数用于打开周围为0的格子,gameover函数用于在游戏结束时进行相关处理,success函数用于在游戏胜利时进行相关处理。

然后就是最重要的主函数了:


int main()

{

  srand(int (time(0)));

  init();

  while(!flag && !win)

  {

    print();

    char c;

    int x,y;

    cin>>c>>x>>y;

    if(c=='o')

    {

      if(ontomap[x][y]==9)

      {

        flag=true;

        openmap[x][y]=9;

        print();

        gameover();

      }

      else if(ontomap[x][y]>0&&ontomap[x][y]<9)

      {

        openmap[x][y]=ontomap[x][y];

      }

      else if(ontomap[x][y]==0)

      {

        openzero(x,y);

      }

    }

    else if(c=='f')

    {

      if(openmap[x][y]==9)

      {

        mine++;

        openmap[x][y]=0;

      }

      else if(openmap[x][y]==0)

      {

        mine--;

        openmap[x][y]=9;

      }

      if(mine==0)

      {

        bool gg=true;

        for(int i=1; i<=maxn-2; i++)

          for(int j=1; j<=maxn-2; j++)

            if(ontomap[i][j]==9 && openmap[i][j]!=9) gg=false;

        if(gg)

        {

          win=true;

          success();

        }

      }

    }

  }

  return 0;

}

主函数中使用srand和time函数来产生随机数,调用init函数初始化地图。然后使用一个while循环来监听玩家的输入,进行相应的处理。如果玩家选择打开一个格子,则对应处理,如果是标记一个地雷,则对应处理。当flag或win标识器为真时,则表示游戏结束或胜利,跳出循环。

最后,实现以上定义的函数:

init函数:


void init()

{

  cout<<"Please inpurt the mines' number:";//输入地雷数

  cin>>mine;

  for(int i=0; i<=maxn-1; i++)

    for(int j=0; j<=maxn-1; j++)

      if(i==0||j==0||i==maxn-1||j==maxn-1) ontomap[i][j]=-2;

      else ontomap[i][j]=0;

  while(mine--)

  {

    int x,y;

    do

    {

      x=rand()%maxn+1,y=rand()%maxn+1;

    }

    while(ontomap[x][y]==9);

    ontomap[x][y]=9;

    for(int i=0; i<=7; i++)

      if(ontomap[x+dx[i]][y+dy[i]]!=9) ontomap[x+dx[i]][y+dy[i]]++;

  }

}

init函数首先要求玩家输入地雷数,然后初始化ontomap数组。对于数组边界,使用-2进行标记。然后使用随机数产生对应数量的地雷,并用9进行标记。接着遍历整个数组,统计每个非地雷格子周围地雷的数量。

print函数:


void print()

{

  system("cls");//清屏操作

  cout<<"   ";

  for(int i=1; i<=maxn-2; i++) cout.width(2),cout<<i<<" ";

  cout<<endl<<endl;

  for(int i=1; i<=maxn-2; i++)

  {

    cout.width(3),cout<<i<<" ";

    for(int j=1; j<=maxn-2; j++)

    {

      if(openmap[i][j]==0) cout<<"# ";

      else if(openmap[i][j]==9) cout<<"* ";

      else cout<<ontomap[i][j]<<" ";

    }

    cout<<endl<<endl;

  }

}

print函数首先使用清屏操作进行屏幕清空,然后输出当前地图状态。如果openmap数组中对应位置是0,则输出“#”,表示还未打开的格子。如果是9,则表示是地雷,输出一个“*”。如果是其他数字,则是周围地雷数量,直接输出即可。

openzero函数:


void openzero(int x,int y)

{

  openmap[x][y]=0;

  for(int i=0; i<=7; i++)

  {

    int nx=x+dx[i];

    int ny=y+dy[i];

    if(nx<1||ny<1||nx>=maxn-1||ny>=maxn-1) continue;

    if(openmap[nx][ny]==0) continue;

    if(ontomap[nx][ny]>0&&ontomap[nx][ny]<9) openmap[nx][ny]=ontomap[nx][ny];

    else if(ontomap[nx][ny]==0) openzero(nx,ny);

  }

}

openzero函数用于打开某个格子周围为0的格子。使用dfs搜索将周围为0的格子全部打开。

gameover函数:


void gameover()

  cout<<"Game Over!"<<endl;

gameover函数用于在游戏结束时输出提示信息。

success函数:


void success()

  cout<<"Congratulation!"<<endl;

success函数用于在游戏胜利时输出提示信息。

至此,一个简单的扫雷C++代码就完成了。通过学习和实践,希望大家可以熟练掌握C++语言编程,打造出更多经典的游戏!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复