今天我们将一起用C语言实现一个经典的小游戏——扫雷
导语
扫雷游戏是一款经典的休闲益智游戏,曾经风靡全球。在这篇博客中,我将通过使用C语言来教你编写一个简单的扫雷游戏。我将一步一步地创建游戏的各个功能,包括初始化棋盘、布置雷、显示雷盘、排查雷等。让我们开始吧!
1.简介
首先,让我们了解一下扫雷游戏的基本规则。扫雷游戏通常在一个矩形雷盘上进行,其中包含隐藏的雷。玩家需要依次选择格子,并尝试避免踩中雷。当玩家选择了一个不含雷的格子时,该格子将显示周围雷的数量。游戏的目标是揭示所有非雷格子而不触雷。
扫雷游戏
2.准备工作
在开始编写代码之前,我们需要创建三个代码文件:game.h、game.c和test.c。
game.h:这个头文件包含了函数的声明和一些宏定义。头文件中的宏定义用于设置雷盘的行数、列数和雷的数量等常量。
game.c:这个源文件包含了函数的具体实现。它实现了在头文件中声明的各个函数,包括初始化棋盘、布置雷、打印雷盘、排查雷等功能。
test.c:在这个文件中,我们可以实现游戏的主循环、菜单显示、玩家输入等功能。
3.实现功能
1.首先,我们在game.h中定义一些宏和函数的声明,以供其他源文件使用:
代码如下(示例):
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define MINE_COUNT 10
//初始化棋盘
void BoardInit(char board[ROWS][COLS], int rows, int cols, char set);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//打印雷盘
void BoardPrint(char board[ROWS][COLS], int row, int col);
- 接下来,在game.c文件中实现这些函数的功能:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盘
void BoardInit(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set; //set表示要初识化的字符
}
}
}
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = MINE_COUNT;
while (count)
{
int x = rand() % row + 1; //随机生成雷的坐标
int y = rand() % col + 1;
if (board[x][y] == '0') //检查该位置是否已经有雷
{
board[x][y] = '1';
count--;
}
}
}
//打印雷盘
void BoardPrint(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("------扫雷游戏------\n");
for (i = 0; i <= row; i++) //打印行号
printf("%d ", i);
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i); //打印列号
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("------扫雷游戏------\n");
}
//标记雷的位置
void MarkMine(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入你想要标记位置的坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) //判断该坐标是否合法
{
if (board[x][y] == '*') //判断该坐标是否被排查
{
board[x][y] = '!';
break;
}
else
{
printf("该位置不能被标记,请重新输入!\n");
}
}
else
{
printf("输入错误,请重新输入!\n");
}
}
}
//获取坐标周围雷的个数
int GetMineCount(char board[ROWS][COLS], int x, int y)
{
int i = 0;
int j = 0;
int count = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (board[i][j] == '1')
{
count++;
}
}
}
return count;
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0; //用来标记是否取得胜利
int* pw = &win;
char ch = 0; //用来接受是否需要标记雷
while (win < row * col - MINE_COUNT)
{
printf("请输入你想要排查的坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) //判断坐标合法性
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");
BoardPrint(mine, row, col); //被炸死了就打印mine数组,让用户知道自己怎么死的
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
BoardPrint(show, ROW, COL);
win++;
}
}
else
{
printf("输入错误,请重新输入!\n");
}
}
if (win == row * col - MINE_COUNT)
{
system("cls");
printf("恭喜你,排雷成功!\n");
BoardPrint(show, row, col);
return;
}
}
3.最后,在test.c中编写主程序来实现游戏的流程
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*****************************************\n");
printf("********* 1.play 0.exit *********\n");
printf("*****************************************\n");
}
void game()
{
//定义用于存放雷和显示雷的数组
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化棋盘
BoardInit(mine, ROWS, COLS, '0');
BoardInit(show, ROWS, COLS, '*');
//布置雷
SetMine(mine, ROW, COL);
//打印雷盘
BoardPrint(show, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
//设置随机数的种子
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();//菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
4.运行效果
将这三个文件编译并链接成一个可执行程序,你将得到一个简单的C语言扫雷游戏。运行游戏后,你可以通过选择坐标来排查雷,直到游戏胜利或踩中雷结束游戏。
以上是游戏的运行效果(运行环境VS2022)
总结
通过这篇文章,我们学习了如何使用C语言编写一个简单的扫雷游戏。通过模块化编程,我们将代码分割成多个文件,并在主程序中调用这些函数来实现游戏的各个功能。总体来说,将代码分为多个文件的目的是提高代码的组织结构和可维护性,希望这个例子对你理解C语言的函数和模块化编程有所帮助。