C语言 扫雷小游戏~

本文详细介绍了如何使用C语言通过二维数组构建和实现扫雷游戏,包括地图初始化、显示、玩家操作和地雷判定。通过实例演示了如何使用字符数组表示状态和地雷分布,以及关键的游戏流程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扫雷小游戏在C语言数组学习完成后就可以去进行编写了.
首先就是 创建一个二维数组来表示地图.

每一个格子要表示的信息:
1.未翻开的状态(草地),已翻开状态(数字).
2.该格子是地雷或者不是地雷.(#表示是地雷,0表示不是)

使用两个二维数组来分别表示以上的两组状态.
第一个二维数组,
char showMap[9][9];表示每个格子的翻开和未翻开的状态.
*表示未翻开, 字符’0’-'8’表示已翻开的数字.

第二个二位数字.
char mineMap;表示每个格子是否是地雷.
'#'表示是地雷,'0’表示不是地雷

游戏流程:
1.创建地图 并 初始化~
针对showMap 来说,初始化成全是*.
针对mineMap 来说,先把整个数组都初始化成全’0’,随机生成10个位置,作为地雷,设为’1’.

2.打印地图. 只打印showMap

3.让玩家输入坐标,表示要翻开的位置.

4.判定是否踩雷.

5.更新showMap,在翻开位置显示周围有多少个地雷.

6.判定玩家是否翻开了所有的位置~
(2-6进行循环)
(在我们编写代码前一定要先理解清楚需求~)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<Windows.h>

#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10

void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]){
     //mem => memory 内存
     //set:设置,集合
     //memset的功能就是把一段内存上的每个字节都设置成一个具体的值
     //二维数组的每个元素都是在一个连续的内存空间上布局的
     memset(showMap,'*',MAX_ROW * MAX_COL);
     memset(mineMap,'0',MAX_ROW * MAX_COL);
     //设置随机种子
     srand((unsigned int)time(0));
     //随机产生十个位置作为地雷.
     int mineCount = 0;
     while(mineCount < MINE_COUNT){ 
        int row = rand() % MAX_ROW;
        int col = rand() % MAX_COL;
        if(mineMap[row][col] == '#'){
           continue;
        }
        mineMap[row][col] = '#';
        mineCount++;
     }  
}
//用着一个函数同事具备打印两种地图的功能
//取决于实参填什么
void print(char theMap[MAX_ROW][MAX_COL]){
     for(int row = 0; row < MAX_ROW ;row++){
         for(int col = 0; col < MAX_COL;col++){
             printf("%c ",theMap[row][col]);
         }
         printf("\n");
     }
}

void update(char showMap[MAX_ROW][MAX_COL],char mineMap[MAX_ROW][MAX_COL],
int row,int col){
     // 表示周围地雷个数
     int count = 0;
     for(int r = row - 1; r <= row + 1;r++){
        for(int c = col - 1; c<= col + 1;c++){
            if(r < 0 || r >= MAX_ROW || c < 0 || c >=  MAX_COL){
            //此时r,c坐标超出棋盘范围,直接跳出
            continue;
            }
            if(r == row && c == col){
            // 中间位置 不需要判断,直接下次循环
               continue;
            }
            if(mineMap[r][c] == '#'){
               count++;
            }
        }
     }
     //如果直接赋值的话,此时假设count是2,
     //当前row col未知的元素就被设置成了ASCII 值为2的字符
     //而不是'2'
     //类似于这样的转换,只是c中这么写
     showMap[row][col] = '0' + count;
}  

int main(){
    //1.创建地图并初始化
    char showMap[MAX_ROW][MAX_COL] = { 0 };
    char mineMap[MAX_ROW][MAX_COL] = { 0 };
    init(showMap,mineMap);
    int openedCount = 0;
    while(1){
       system("cls");
       //2.打印地图
       print(showMap);
       //3.玩家输入坐标
       int row = 0;
       int col = 0;
       printf("请输入坐标(row col):");
       scanf("%d %d",&row,&col);
       //进行合法性判定
       if(row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){
          printf("您的输入有误!请重新输入!\n");
          Sleep(1000);
          continue;
       }
       if(showMap[row][col] != '*'){
          printf("您输入的位置上已经翻开了! 请重新输入!\n");
          Sleep(1000);
          continue;
       }
       // 4.判定是否踩雷
       if(mineMap[row][col] == '#'){
          printf("您踩雷了!!游戏结束!!\n");
          printf("地雷分布图:");
          print(mineMap);
          break;
       }
       //5.更新showMap ,显示当前位置 周围有多少雷
       update(showMap,mineMap,row,col);
       openedCount++;
       //6.进行游戏胜利的判定,统计当前一共翻开了多少个格子
       if(openedCount == MAX_ROW * MAX_COL - MINE_COUNT){
       printf("恭喜你 获胜了!\n");
       }
    }
       return 0;
}

谈到每个类型占几个字节,需加上一个前提:
在32位windos系统下~

char ,short 一般没有争议~
long 32位windows下 4, 64位windows 4, 64位linux 8
int 32位windows下 4, 64位windows 4, 64位linux 4. 16位系统下 2.

没有争议的还有 float 4 douoble 8

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值