第九节 二维数组的应用——扫雷游戏mine sweeping

1、创建项目文件,添加基本框架

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    return 0;
}

2、创建开始菜单,菜单中选择1:玩游戏,选择0:退出。如果选择的是其他内容,重新选择。可将此功能写成一个函数menu

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//声明函数
void  menu();
int main()
{  do
   {//调用函数
    menu;
    }while(1)
    return 0;
}
//游戏界面(开始菜单)
 void  menu()
{
    printf("----------------\n");
    printf("1:play game\n");
    printf("0:exit\n")
    printf("----------------\n");
    printf("请选择:");
    int select;
    scanf("%d",&select);
    switch(select)
    {
        case 1:
            //玩游戏
            break:
        case 0:
            printf("再见,欢迎下次你再玩🤞🏻\n");
            exit(0);
        default:
            printf("选择错误,请重新选择");
    }
}

3、编写玩游戏的功能playgame()

 1>使用(9*9)二维数组创建雷区

2>向网格中进行布雷,使用随机函数产生行和列,然后在指定的地方添加雷

扫雷代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 9
#define COLUMNS 9
#define MINE_ROWS 11
#define MINE_COLUMNS 11
#define COUNT 15//雷的数量
//声明函数
void menu();
void playgame();
void init_sweeping_arr(char arr[MINE_ROWS][MINE_COLUMNS], int rows, int columns, char fill);
void show_sweeping_arr(char arr[MINE_ROWS][MINE_COLUMNS], int rows, int columns);
void show(int minefield[MINE_ROWS][MINE_COLUMNS], int covering[MINE_ROWS][MINE_COLUMNS]);
void layout_mine(char minefield[MINE_ROWS][MINE_COLUMNS], int rows, int columns);
void clearance_mine(char minefield[MINE_ROWS][MINE_COLUMNS], char covering[MINE_ROWS][MINE_COLUMNS]);
int main() {
 do {
  menu();
 } while (1);
 return 0;
}
//生成菜单
void menu() 
{
    printf("-------------mine sweeping-------------\n");
    printf("选择 1:开始游戏\n");
    printf("选择 0:退出游戏\n");
    printf("---------------------------------------\n");
    printf("请开始你的选择:");
    int select;
    scanf("%d", &select);
    //根据客户的选择进行相关操作
    switch (select) {
    case 1:
        playgame();
        break;
    case 0:
        printf("再见\n");
        exit(EXIT_SUCCESS);
        break;
    default:
    printf("请重新选择!\n");
 }
}
//游戏的功能
void playgame() 
{
    //创建一个11*11的雷区
    char minefield[MINE_ROWS][MINE_COLUMNS] = { 0 };
    init_sweeping_arr(minefield, MINE_ROWS, MINE_COLUMNS, '0');
    //创建一个覆盖层(用*)
    char covering[MINE_ROWS][MINE_COLUMNS] = { 0 };
    init_sweeping_arr(covering, MINE_ROWS, MINE_COLUMNS, '*');
    //打印雷区覆盖层
    //布雷
    layout_mine(minefield, ROWS, COLUMNS);
    show(minefield, covering);
    //排雷
    clearance_mine(minefield, covering);
}
//初始化二维数组
void init_sweeping_arr(char arr[MINE_ROWS][MINE_COLUMNS], int rows, int columns, char fill) {
 for (int i = 0; i < rows; i++) {
  for (int j = 0; j < columns; j++) {
   arr[i][j] = fill;
  }
 }
}
//打印数据
void show_sweeping_arr(char arr[MINE_ROWS][MINE_COLUMNS], int rows, int columns) {
 for (int i = 0; i <= rows; i++) {
  if (i == 0) 
  {
   printf("     ");
  }
  else 
  {
  printf("%-4d",i);
  }
    }
 printf("\n\n");
 for (int i = 0; i < rows; i++) 
 {  printf("%-4d", i + 1);
    for(int j = 0; j < columns; j++)
    {
        printf("%-4c", arr[i][j]);
    }
        printf("\n");
 }
}
//显示功能
void show(int minefield[MINE_ROWS][MINE_COLUMNS], int covering[MINE_ROWS][MINE_COLUMNS]) {
 printf("sweeping\n");
 show_sweeping_arr(minefield, MINE_ROWS, MINE_COLUMNS);
 printf("-----------------------------------\n");
 printf("covering\n");
 show_sweeping_arr(covering, MINE_ROWS, MINE_COLUMNS);
}
//布雷
void layout_mine(char minefield[MINE_ROWS][MINE_COLUMNS], int rows, int columns)
{
    srand((unsigned int)time(NULL));
    //创建一个变量,表示已经布雷的数量
    int count = 0;
    while (count < COUNT) {
    int row = rand() % 9 + 1;
    int column = rand() % 9 + 1;
    if(minefield[row][column] == '1') 
    {
        continue;
    }
  else  
   {
         minefield[row][column] = 49;
        count++;
    }
 }
}
//排雷
void clearance_mine(char minefield[MINE_ROWS][MINE_COLUMNS], char covering[MINE_ROWS][MINE_COLUMNS]) {
    int count = 0;
    while (count < ROWS * COLUMNS - COUNT) {
    int row = 0;
    int column = 0;
    //清空缓冲区的数据
    rewind(stdin);
    printf("请输入点击的坐标:");
    scanf("(%d,%d)", &row, &column);
    if (row > 0 && row <= ROWS && column > 0 && column < COLUMNS) {
    if(covering[row][column] != '*')
    {
    continue;
    }
   else if(minefield[row][column]!='1') {
    int sum = 0;
    sum = sum + minefield[row - 1][column - 1] - '0';
    sum = sum + minefield[row - 1][column] - '0';
    sum = sum + minefield[row - 1][column + 1] - '0';

    sum = sum + minefield[row + 1][column - 1] - '0';
    sum = sum + minefield[row + 1][column] - '0';
    sum = sum + minefield[row + 1][column + 1] - '0';

    sum = sum + minefield[row][column - 1] - '0';
    sum = sum + minefield[row][column + 1] - '0';
    covering[row][column] = sum + '0';
    count++;
    show(minefield, covering);
   }
   else {
    printf("被炸死 游戏结束。\n");
    break;
   }
  }
  else {
  printf("请重新输入!\n");
  }
 }
 if (count = ROWS * COLUMNS - COUNT) {
  printf("恭喜你,扫雷成功!\n");
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值