C语言实现扫雷

我们今天要实现一个项目:扫雷。

我么要分析一下这个项目都需要哪些步骤:

(1)我们要有两个数组,一个用来显示给玩家,一个用来后台。就是说,我们有点开和未点开的样子,我们把点开的显示给用户,把未点开的留做后台数据。

(2)要初始化,我们做个10*10的表格,先定义两个宏:

#define max_row 10;         //定义行
#define max_col 10;         //定义列

在主函数里面定义两个二维数组:

char show_map[max_row][max_col];
char mine_map[max_row][max_col];

(3)初始化地图;

对于show_map来说,初始化为*;

对于mine_map来说,生成若干个雷;

(4)核心流程分析:

    a)打印地图;

    b)读取玩家的坐标并验证;

       1.若是地雷,结束游戏;

       2.翻开的坐标不是地雷,并且翻开的最后一个不是地雷,游戏胜利;

       3.翻开的坐标不是地雷,更新show_map

    c)循环进行

大概就是这样的,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 10
#define MAX_COL 10
#define minecount 10
void Init(char show_map[MAX_ROW][MAX_COL], char mine_map[MAX_ROW][MAX_COL]){
  srand(time(0));
  for (int i = 0; i < MAX_ROW; ++i){
    for (int j = 0; j < MAX_COL; ++j){
      show_map[i][j] = '*';
      mine_map[i][j] = '0';
    }
  }
  
  int count = 10; 
  while (count){                   //避免随机重复,不可直接for循环10次!
    int x = rand() % 10;
    int y = rand() % 10;
    if (mine_map[x][y] == '0')
    { mine_map[x][y] = 'X'; 
      count--;
    } 
  }
  for (int i = 0; i < MAX_ROW; ++i){
    for (int j = 0; j < MAX_COL; ++j){
      if (mine_map[i][j] != 'X'){
      int mine_count = 0;
      if (i - 1 >= 0 && j - 1 >= 0 && mine_map[i - 1][j - 1] == 'X'){
        ++mine_count;
      }
      if (i - 1 >= 0 && mine_map[i - 1][j] == 'X'){
        ++mine_count;
      }
      if (i - 1 >= 0 && j + 1 < MAX_ROW && mine_map[i - 1][j + 1] == 'X'){
        ++mine_count;
      }
      if (j - 1 >= 0 && mine_map[i][j - 1] == 'X'){
        ++mine_count;
      }
      if (j + 1 < MAX_COL && mine_map[i][j + 1] == 'X'){
        ++mine_count;
      }
      if (i + 1 < MAX_COL && j - 1 >= 0 && mine_map[i + 1][j - 1] == 'X'){
        ++mine_count;
      }
      if (i + 1 < MAX_ROW && mine_map[i + 1][j] == 'X'){
        ++mine_count;
      }
      if (i + 1 < MAX_ROW && j + 1 < MAX_COL && mine_map[i][j] == 'X'){
        ++mine_count;
      }

      mine_map[i][j] = mine_count + 48;

    }
    }
  }
  }
void print_map(char show_map[MAX_ROW][MAX_COL]){
  printf("   |");
  for (int i = 0; i < MAX_ROW; ++i){
    printf("%d  ", i);
  
  }
  printf("\n");
  printf("---+-------------------------------\n");
  for (int i = 0; i < MAX_ROW; ++i){
    printf("%d  |", i);
    for (int j = 0; j < MAX_COL; ++j){
    
      printf("%c  ", show_map[i][j]);
    }
    printf("\n");
  }



}
void GetPos(int *row, int *col, char show_map[MAX_ROW][MAX_COL]){
while (1){
  printf("请输入你的点开的位置(0-9):\n");
  scanf("%d %d", row, col);
  
    if (*row<0 || *row>=MAX_ROW || *col<0 || *col>=MAX_COL){
      printf("输入错误,请重新输入\n");
      continue;

    }
    if (show_map[*row][*col] != '*'){
      printf("你输入的地方已被选取,请重新输入\n");
      continue;
    }
    break;



  }
}

void update(char show_map[MAX_ROW][MAX_COL], char mine_map[MAX_ROW][MAX_COL],int row,int col){
  int mine_count = 0;
  if (row - 1 >= 0 && col - 1 >= 0 && mine_map[row - 1][col - 1] == 'X'){
    ++mine_count;
  }
  if (row - 1 >= 0 && mine_map[row - 1][col] == 'X'){
    ++mine_count;
  }
  if (row - 1 >= 0 && col + 1 < MAX_ROW && mine_map[row - 1][col + 1] == 'X'){
    ++mine_count;
  }
  if (col - 1 >= 0 && mine_map[row][col - 1] == 'X'){
    ++mine_count;
  }
  if (col + 1 < MAX_COL && mine_map[row][col + 1] == 'X'){
    ++mine_count;
  }
  if (row+ 1 < MAX_COL && col - 1 >= 0 && mine_map[row + 1][col - 1] == 'X'){
    ++mine_count;
  }
  if (row + 1 < MAX_ROW && mine_map[row + 1][col] == 'X'){
    ++mine_count;
  }
  if (row + 1 < MAX_ROW && col + 1 < MAX_COL && mine_map[row+1][col+1] == 'X'){
    ++mine_count;
  }

  show_map[row][col] = mine_count + 48; 
}
/*void spread(char show_map[MAX_ROW][MAX_COL], char mine_map[MAX_ROW][MAX_COL], int row, int col){
  int i = row;
  int j = col;
  while (mine_map[i][j] == '0' && i - 1 >= 0 && j - 1 >= 0){
    show_map[i][j] = '0';
    i--;
    j--;
      
    }
  i = row;
  j = col;
  while (mine_map[i][j] == '0' && i - 1 >= 0){
    show_map[i][j] = '0';
    i--;

  }
  i = row;
  j = col;
  while (mine_map[i][j] == '0' && i - 1 >= 0 && j + 1 <MAX_COL){
    show_map[i][j] = '0';
    i--;
    j++;

  }
  i = row;
  j = col;
  while (mine_map[i][j] == '0'&& j - 1 >= 0){
    show_map[i][j] = '0';
    j--;

  }
  i = row;
  j = col;
  while (mine_map[i][j] == '0'&& j + 1 <MAX_COL){
    show_map[i][j] = '0';
    
    j++;

  }
  i = row;
  j = col;
  while (mine_map[i][j] == '0' && i + 1 <MAX_ROW && j - 1 >= 0){
    show_map[i][j] = '0';
    i++;
    j--;

  }
  i = row;
  j = col;
  while (mine_map[i][j] == '0' && i + 1<MAX_ROW ){
    show_map[i][j] = '0';
    i++;

  }
  i = row;
  j = col;
  while (mine_map[i][j] == '0' && i + 1 < MAX_ROW && j +1<MAX_COL){
    show_map[i][j] = '0';
    i++;
    j++;

  }


}*/






int main(){
  char show_map[MAX_ROW][MAX_COL];
  char mine_map[MAX_ROW][MAX_COL];
  Init(show_map,mine_map);
  int safe_mine = 0; 
  int row = 0;
  int col = 0;
  int x = 0;
  while (1){
  print_map(show_map);
  //print_map(mine_map);
  GetPos(&row,&col,show_map);
  if (mine_map[row][col] == 'X'){
    
    system("cls");
    print_map(mine_map);
    printf("游戏结束!\n");
    break;
  }
  ++safe_mine;
  if (safe_mine == MAX_COL*MAX_ROW - minecount){
    
    system("cls");
    print_map(mine_map);
    printf("你赢了\n");
    break;
  }
    update(show_map, mine_map,row,col);
  //spread(show_map, mine_map, row, col);
  system("cls");

}
  
  system("pause");
  return 0;

}

可以看得出来,这个代码比较容易实现,没有什么技术含量,这里就不解释说明了,关于spread()函数,我备注掉了,具体就是附近要是没有雷的话自动扩展,这个函数不是很完善,有兴趣老铁自行修改。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值