从零开始写扫雷

#从零开始写扫雷
1.扫雷游戏的功能说明
使用控制台实现经典扫雷游戏
2.游戏可以通过菜单实现继续玩或者退出游戏
3.可以设置棋盘的大小
4.默认随机布置雷的个数
5.可以做到排查雷的个数

-游戏的分析和设计
我们首先需要创建一个9*9的数组来存放信息;
在这里插入图片描述
如图所示这样就可以知道在这个九宫格内雷的个数

下面我们来探讨一下,关于显示周围雷的个数方法

假设我们在排查一个一致坐标周围的雷的个数时
主要是以其为中心相外展开的小九宫格
在这里插入图片描述
如图所示;
这样我们就难免还会知道;当我们排查周围的雷的个数时会导致可能产生越界;
所以为防止越界;就可以在周围加一圈防止越界
好,到这里我们已经大致知道了,这是一个关于二维数组的创建

char mine[11][11]={0};//用来存放布置好的雷的信息
char show[11][11]={0];//用来存放排查出的雷的个数信息

test.c//在文件中写出雷的测试逻辑
game.c//文件中写游戏中的函数实现
game.c//文件中写游戏需要的数据类型和函数声明等

#pragme once//可有可无
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define EASY_COUNT 10
#define ROW 9
#define COL 9//进行重定义这样在下面函数可以方便
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS],int row,int col);
void SetMine(char board[ROWS][COLS],int row,int col);
void FindMIne(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
```

```c
#include "game.h"
void Initboard(char board[ROWS][COLS],int rows,int cols,char set)
{
     int i=0;
     for(i=0;i<rows;i++)
     {
        int j=0;
        for(j=0;j<cols;j++)
        {
           board[i][j]=set;
           }
       }
}
void Display(char board[ROWS][COLS],int rows,int cols)
{
    int i=0;
    printf("---------扫雷游戏-------");
    for(i=0;i<=col;i++)
    {
       printf("%d ",i);
       }
       printf("\n");
       for(i=1;i<=rows;i++)
       {
         printf("%d ",i);
         int j=0;
         for( j=1;j<=col;j++)
         {
             printf("%c ",board[i][j]);
             }
             printf("\n");
             }
        }
void SetMine(char board[ROWS][COLS],int row,int col)//布置十个雷//随机生成坐标
{
    int count =EASY_COUNT;
    while(count)
    {
       int x=rand()%row+1;
       int y=rand()%col+1;
       if(board[x][y]=='0')
       { 
          borad[x][y]='1';
          count--;
          }
        }
      }
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{
          return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1]-8*'0');
          }
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
     int x=0;
     int y=0;
     int win=0;
     while(win<row*col-EASY_COUNT)
     {
        printf("请输入要排查的坐标:>");
        scanf("%d %d,&x,&y);
        if(x>=1&&x<=row&&y>=1&&y<=col)
        {
            if(mine[x][y]=='1')
            {
               printf("很遗憾,你被炸死了\n");
               DisplayBoard(mine,ROW,COL);
               break;
               }
               else
               {
                  //该位置不是雷,就是统计这个坐标周围有几颗雷
                  int count=GetMineCount(mine,x,y);
                  show[x][y]=count+'0';
                  DisplayBoard(show,ROW,COL);
                  Win++;
                  }
             }
             else
             {
               printf("坐标非法,重新输入\n");
               }
          }
          if(win==row*col-EASY_COUNT)
          {
              printf("恭喜你,排雷成功\n");
              DisplayBoard(mine,ROW,COL);
              }
   }
  #include "game.h"
  void menu()
  {
       printf("*********************\n");
       printf("******1.play*********\n");
       printf("******0.exit*********\n");
       printf("*********************\n");
   }
   void game()
   {
       char mine[ROWS][COLS];//存放布置好的雷
       char show[ROWS][COLS];//存放排查出的雷的信息
       InitBoard(mine,ROWS,COLS,'0');//初始化棋盘
       //1.mine数组最开始全是‘0’
      //2.shows数组最开始全是‘*’
       InitBoard(show,ROWS,COLS,'0');
       DisplayBoard(show,ROW,COL);
       SetMine(mine,show,ROW,COL);//布置雷
       FindMine(mine,show,ROW,COL);//排查雷
    }
int main()
{
      int input=0;
      srand((unsigned int )time(NULL));
      do
      {
           menu();
           printf("请选择:>");
           scanf(input)
           {
              case 1:
              game();
              break;
              case 0:
              printf("退出游戏\n");
              break;
              default:
              printf("选择错误,重新选择\n");
              break;
              }
          }whhile(input);
          return 0;
          }
           
    
              
```

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值