今天来简单的实现一下一个扫雷游戏。
这里就需要大家有基础的c语言知识了。
头文件:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
首先开一个头文件,用于包含标准库的头文件和所要使用的函数的声明。
用define来定义行row,列col的数量。
此外,再定义一个clos和rows用于表示行与列的最大边界。
接着来编写主函数所需要的函数。
函数:
在该文件中,我们来编写函数,以供main函数使用。
#include "game.h"
函数中包含上面所提到的头文件。
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
board[i][j] = set;
}
}
}
InitBoard函数首先用于初始化数组board,将board作为扫雷中的棋盘,以供玩家选择扫雷的地点。
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
int i, j;
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 ", board[i][j]);
}
printf("\n");
}
}
DisplayBoard函数用于展示当前扫雷棋盘。
首先打印列数以便玩家标识。
接着使用俩次循环来输出扫雷的棋盘,并且在每行前输出行数。
void SetMine(char board[ROWS][COLS], int row, int col) {
int count = EASY_COUNT;
while (count) {
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0') {
board[x][y] = '1';
count--;
}
}
}
接着便需要在扫雷棋盘中布置地雷了,由于在头文件中define了EASY_COUNT,便将EASY_COUNT作为地雷的数量,用count来接收EASY_COUNT。
接着使用循环来布置地雷,使用rand函数来随机一个数并且该数对行数row和列数col取模,以取得下一个地雷的布点。
若当前随机的地点已经被布置了地雷,则重新选择一个布点:反之,将board数组中的该点设置为1。
int get_mine_count(char mine[ROWS][COLS], int x, int y) {
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0';
}
由于扫雷游戏中,若当前点位不含地雷,则会在当前点显示周围八格中地雷的数量。
同理,此函数也是用于标明当前点位周围八格有几个地雷。
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x, y, win = 0;
while (win < row*col - EASY_COUNT)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (mine[x][y] == '1') {
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, row, col);
break;
}
else {
int count = get_mine_count(mine, x, y);
//unfold(show, mine,row, col, count); //展开
show[x][y] = count + '0';
win++;
DisplayBoard(show, x, y);
}
}
else {
printf("输入值非法\n");
}
}
if (win == row * col - EASY_COUNT) {
printf("\n恭喜你,排雷成功!\n");
DisplayBoard(mine, row, col);
}
}
FindMine函数则是循环让玩家输入坐标排查地雷。
当所以安全的点位都被找出时,即得到了地雷的准确位置,所以输出排雷成功的信息。
当安全点位还有未被找到时,则继续游戏,让玩家继续输入坐标点来排查安全点位。若玩家输入的坐标点不合法时,则提示玩家输入的坐标点非法并且让玩家重新输入坐标点。当玩家输入的坐标点是合法的,则判断该坐标点是否有地雷,若有地雷,则提示玩家猜到了地雷,游戏结束。若没有地雷,则在该坐标点标明周围八格的地雷数量。
主函数:
void menu() {
printf("--------------扫雷-----------\n");
printf("-------1. Play 0. Exit-------\n");
printf("-----------------------------\n");
}
最简单的菜单,用于提醒玩家是否玩游戏。
void game() {
//雷的信息存储
//1. 布置好的雷的信息
char mine[ROWS][COLS] = { 0 };
//2. 排查出的雷的信息
char show[ROWS][COLS] = { 0 };
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
DisplayBoard(show, ROW, COL);
printf("\n");
//布置雷
SetMine(mine, ROW, COL);
//扫雷
FindMine(mine, show, ROW, COL);
}
若玩家在菜单中选择玩游戏,则初始化地雷棋盘并且随机布置地雷。
void test() {
int num;
do {
menu();
srand((unsigned int)time(NULL));
printf("请选择:");
scanf("%d", &num);
switch (num)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入非法\n");
break;
}
} while (num);
}
调用菜单的函数,并且让玩家选择是否玩游戏并且判断玩家的选择是否合法。
最后是主函数:(也是最简单的)
int main() {
test();
return 0;
}
主函数调用test函数即可。
如果我的文章对你有所帮助,不妨给我个关注何点赞吧