C语言实现扫雷

目录

一.C 语言扫雷游戏头文件代码

1.简介

2.功能

3.头文件的包含

4. 常量和宏定义

5.函数声明

二.整体结构概述​

1.简介

2.函数分析​

3、menu函数(打印菜单)

4、main函数分析​

三.C 语言扫雷游戏核心代码

1.整体功能概述

2.头文件包含

3. 棋盘初始化函数 board

4. 棋盘显示函数 inboard

5. 地雷布置函数 set

6. 计算周围地雷数量函数 howmuch

7. 排雷操作函数 outset


一.C 语言扫雷游戏头文件代码

1.简介

在开发一个完整的程序时,模块化设计是非常重要的。头文件(.h 文件)在 C 语言中扮演着关键的角色,它可以对函数进行声明,定义常量和宏等,从而提高代码的可读性和可维护性。本文将对一个用于扫雷游戏的头文件代码进行详细分析。

2.功能

此头文件为扫雷游戏的开发提供了必要的声明和定义,涵盖了常量、宏以及函数声明,这些内容会在后续的源文件中被具体实现。

3.头文件的包含

#include 
#include 
#include 

  • #include :引入标准输入输出库,该库提供了像 printf 和 scanf 这类常用的输入输出函数,在扫雷游戏里,这些函数可用于显示游戏界面和获取玩家输入。

  • #include :引入标准库,其中包含了 rand 和 srand 等函数,rand 用于生成随机数,srand 用于设置随机数种子,在扫雷游戏中,这两个函数可用于随机布置雷。
  • #include :引入时间库,此库提供了 time 函数,该函数能返回当前的时间戳,常被用作 srand 函数的参数,以此保证每次运行游戏时生成的随机数序列不同。

4. 常量和宏定义

#define EASY 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

  • #define EASY 10:定义了一个常量 EASY,其值为 10。在扫雷游戏中,这个常量代表简单难度下雷的数量。
  • #define ROW 9 和 #define COL 9:分别定义了扫雷游戏棋盘的行数和列数,这里设置为 9 行 9 列。
  • #define ROWS ROW+2 和 #define COLS COL+2:定义了扩展后的行数和列数。在扫雷游戏里,为了方便处理边界情况,通常会在实际棋盘的周围添加一圈额外的格子,因此 ROWS 和 COLS 比实际的 ROW 和 COL 多 2。

5.函数声明

void board(char mine[ROWS][COLS], int rows, int cols, char ret);
void inboard(char mine[ROWS][COLS], int row, int col);
void set(char mine[ROWS][COLS], int row, int col);
void outset(char mine[ROWS][COLS], char othermine[ROWS][COLS], int row, int col);
  • void board(char mine[ROWS][COLS], int rows, int cols, char ret);:声明了一个名为 board 的函数,该函数接收一个二维字符数组 mine、行数 rows、列数 cols 以及一个字符 ret 作为参数,其返回值为 void。此函数用于初始化扫雷游戏的棋盘。
  • void inboard(char mine[ROWS][COLS], int row, int col);:声明了一个名为 inboard 的函数,它接收一个二维字符数组 mine、实际的行数 row 和列数 col 作为参数,返回值为 void。该函数用于打印扫雷游戏的棋盘。
  • void set(char mine[ROWS][COLS], int row, int col);:声明了一个名为 set 的函数,接收一个二维字符数组 mine、实际的行数 row 和列数 col 作为参数,返回值为 void。此函数用于在扫雷游戏的棋盘上随机布置雷。
  • void outset(char mine[ROWS][COLS], char othermine[ROWS][COLS], int row, int col);:声明了一个名为 outset 的函数,接收两个二维字符数组 mine 和 othermine、实际的行数 row 和列数 col 作为参数,返回值为 void。该函数用于处理玩家的排雷操作。

二.整体结构概述​

1.简介

主要由三个函数构成,分别是game函数、menu函数和main函数。main函数作为程序的入口,负责控制游戏的流程,包括显示菜单、获取玩家输入并根据输入调用相应的函数。menu函数用于在控制台打印游戏的操作菜单,为玩家提供游戏开始和退出的选项。game函数则是整个游戏的核心逻辑实现部分,涵盖了棋盘初始化、雷的布置、棋盘显示以及排雷等关键功能。​

2.函数分析​

引用头文件

#include "game.h"
void game() {
	char mine[ROWS][COLS];
	char othermine[ROWS][COLS];
	//初始化棋盘
	board(mine, ROWS, COLS, '0');
	board(othermine, ROWS, COLS, '*');
	//打印棋盘
	//inboard(mine, ROW, COL);
	inboard(othermine, ROW, COL);
	//放雷
	set(mine, ROW, COL);
	//inboard(mine, ROW, COL);
	//排雷
	outset(mine, othermine, ROW, COL);
}
  1. 变量声明:在函数开始部分,声明了两个二维字符数组mine和othermine,用于存储雷区信息和玩家可见的棋盘信息。数组的大小由预处理宏ROWS和COLS决定,这两个宏在代码中应该有定义,以确定棋盘的行数和列数。​
  2. 棋盘初始化:调用board函数对两个棋盘进行初始化。对于mine棋盘,使用字符'0'进行初始化,这里的'0'代表该位置尚未布置雷。而othermine棋盘则使用'*'进行初始化,'*'用于在游戏开始时覆盖雷区,不向玩家暴露雷的位置。​
  3. 棋盘打印:注释掉了对mine棋盘的打印操作,只打印了othermine棋盘。因为mine棋盘包含雷的真实位置,不应该在游戏开始时展示给玩家,而othermine棋盘的'*'布局是玩家初始看到的状态。​
  4. 雷的布置:通过set函数在mine棋盘上随机布置雷。函数的具体实现应该包含生成随机坐标,并在这些坐标位置将mine棋盘上的元素设置为代表雷的字符。
  5. 排雷操作:outset函数负责处理玩家的排雷过程。它以mine棋盘和othermine棋盘以及棋盘的行列数作为参数,在玩家输入坐标后,根据mine棋盘上的真实雷分布情况,更新othermine棋盘,向玩家揭示非雷区域的信息,或者判断玩家是否触雷。​

3、menu函数(打印菜单)

void menu() {
	printf("****************************\n");
	printf("********   1.play   ********\n");
	printf("********   0.exit   ********\n");
	printf("****************************\n");

}

menu函数的功能非常简单直接,通过printf函数在控制台打印出一个包含游戏开始(选项 1)和退出(选项 0)的菜单界面。清晰明了的菜单设计方便玩家快速了解游戏的操作选项。​

4、main函数分析​

int main() {
	int input;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请玩家做出选项:>");
		scanf("%d", &input);
		switch (input) {
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误请重新选择\n");
		}
	} while (input);
	return 0;
}

  1. 变量声明与随机数种子设置:声明一个整型变量input用于存储玩家从菜单中选择的选项。通过srand((unsigned int)time(NULL))设置随机数种子,以确保每次运行游戏时雷的分布都是随机的。time(NULL)函数返回当前时间的秒数,将其作为随机数种子,使得每次游戏开始时,雷的布置都不同。​
  2. 游戏循环:使用do - while循环来控制游戏流程。在循环内部,首先调用menu函数显示菜单,然后提示玩家输入选项。通过scanf函数获取玩家输入并存入input变量。​
  3. 选项处理:使用switch语句根据玩家的输入进行不同的处理。如果玩家选择 1,调用game函数开始游戏;如果选择 0,则退出循环,结束程序;对于其他输入,提示玩家选择错误并要求重新选择。循环条件while (input)确保只要玩家不选择 0(退出选项),游戏就会持续运行,玩家可以多次进行游戏。

三.C 语言扫雷游戏核心代码

1.整体功能概述

这段代码实现了扫雷游戏的主要功能,包括棋盘初始化、棋盘显示、地雷布置、排雷操作等。它通过多个函数的协同工作,为玩家提供了一个基本的扫雷游戏体验。

2.头文件包含

#include "game.h"

这行代码包含了自定义的头文件 game.h,该头文件中可能定义了常量、宏以及函数声明等,为后续代码的使用提供了必要的基础。

3. 棋盘初始化函数 board

void board(char mine[ROWS][COLS], int rows, int cols, char ret) {
    int i, j;
    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            mine[i][j] = ret;
        }
    }
}

  • 功能:该函数用于初始化扫雷游戏的棋盘。它接收一个二维字符数组 mine 表示棋盘,以及棋盘的行数 rows、列数 cols 和一个字符 ret 作为参数。
  • 实现:通过两层嵌套的 for 循环遍历整个棋盘,将每个位置的值都设置为传入的字符 ret

4. 棋盘显示函数 inboard

void inboard(char mine[ROWS][COLS], int row, int col) {
    int i, j;
    printf("---------扫雷游戏--------\n");
    for (i = 0; i <= col; i++) {
        printf("%d ", i);
    }
    printf("\n");
    for (i = 1; i <= row; i++) {
        printf("%d ", i);
        for (j = 1; j <= col; j++) {
            printf("%c ", mine[i][j]);
        }
        printf("\n");
    }
    printf("---------扫雷游戏--------\n");
}

  • 功能:该函数用于显示扫雷游戏的棋盘。它接收一个二维字符数组 mine 表示棋盘,以及实际的行数 row 和列数 col 作为参数。
  • 实现:首先打印游戏标题,然后打印列号,接着逐行打印棋盘内容,每行前面打印行号,最后再次打印游戏标题。

5. 地雷布置函数 set

void set(char mine[ROWS][COLS], int row, int col) {
    int count = EASY;
    while (count) {
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (mine[x][y] == '0') {
            mine[x][y] = '1';
            count--;
        }
    }
}

  • 功能:该函数用于在扫雷游戏的棋盘上随机布置地雷。它接收一个二维字符数组 mine 表示棋盘,以及实际的行数 row 和列数 col 作为参数。
  • 实现:使用 while 循环,直到布置的地雷数量达到 EASY 所定义的数量。在每次循环中,通过 rand() 函数生成随机的行和列坐标,检查该位置是否已经有地雷,如果没有,则将该位置设置为地雷(字符 '1'),并减少剩余需要布置的地雷数量。

6. 计算周围地雷数量函数 howmuch

static int howmuch(char mine[ROWS][COLS], int x, int y) {
    return mine[x - 1][y - 1] +
           mine[x - 1][y] +
           mine[x - 1][y + 1] +
           mine[x][y - 1] +
           mine[x][y + 1] +
           mine[x + 1][y - 1] +
           mine[x + 1][y] +
           mine[x + 1][y + 1] - 8 * '0';
}

  • 功能:该函数用于计算指定位置周围的地雷数量。它接收一个二维字符数组 mine 表示棋盘,以及指定位置的行坐标 x 和列坐标 y 作为参数。
  • 实现:通过将指定位置周围 8 个位置的字符值相加,再减去 8 个字符 '0' 的值,得到周围地雷的数量。

7. 排雷操作函数 outset

void outset(char mine[ROWS][COLS], char othermine[ROWS][COLS], int row, int col) {
    int x, y;
    int count = 0;
    while (count < row * col - EASY) {
        printf("请输入坐标\n");
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col) {
            if (mine[x][y] == '1') {
                printf("很不幸你被炸死了\n");
                inboard(mine, ROW, COL);
                break;
            }
            else {
                int ret = howmuch(mine, x, y);
                othermine[x][y] = ret + '0';
                inboard(othermine, ROW, COL);
                count++;
            }
        }
        else {
            printf("输入错误请重新输入\n");
        }
    }
    if (count == row * col - EASY) {
        printf("恭喜你成功了\n");
        inboard(mine, ROW, COL);
    }
}

  • 功能:该函数用于处理玩家的排雷操作。它接收两个二维字符数组 mine 和 othermine 分别表示实际的地雷棋盘和玩家可见的棋盘,以及实际的行数 row 和列数 col 作为参数。
  • 实现:使用 while 循环,直到玩家找出所有非地雷的位置。在每次循环中,提示玩家输入坐标,检查坐标的合法性。如果坐标合法,判断该位置是否为地雷,如果是,则游戏失败,显示实际的地雷棋盘;如果不是,则计算该位置周围的地雷数量,并更新玩家可见的棋盘,同时增加已排查的非地雷位置数量。最后,如果已排查的非地雷位置数量等于总非地雷位置数量,则游戏成功,显示实际的地雷棋盘。

你可能感兴趣的:(c语言,开发语言)