目录
源码参考链接:PrimaryProjects: 初学时的简单项目集 - Gitee.com
扫雷是个非常简单的小游戏,相信大家在电脑自带的游戏里都有玩过, 今天我们来用c语言实现一下.
总体的思路
①先构造基本框架菜单等属性, 以及选择是否进入游戏等 .
②定义初始化棋盘操作.
③定义打印棋盘操作.
④定义随机布置雷的操作.
⑤定义排查雷的操作.
先是总体的框架代码(test.c)
#include "game.h" // 自定义的头文件.
// 自定义游戏菜单.
void menu() {
printf("*********************************\n");
printf("*********************************\n");
printf("************ 1. Play ************\n");
printf("************ 0. Exit ************\n");
printf("*********************************\n");
printf("*********************************\n");
}
void game() {
char show[ROWS][COLS]; // 存放摆好的地雷.
char mine[ROWS][COLS]; // 存排查的雷的数量.
// 初始化棋盘.
// show为全'*'.
InitBoard(show, ROWS, COLS, '*');
// mine为全'0'.
InitBoard(mine, ROWS, COLS, '0');
// 打印棋盘.
DisplayBoard(show, ROW, COL);
// 随机布置雷.
SetMine(mine, ROW, COL);
// 排查雷.
FindMine(mine, show, ROW, COL);
}
int main() {
int input = 0;
srand((unsigned int)time(NULL)); // 随机数生成种子.
do {
menu();
printf("请输入数字确认是否游戏>:");
scanf("%d", &input);
switch (input) {
case 1:
printf("进入游戏加载中...\n");
Sleep(1000);
game();
break;
case 0:
printf("退出游戏成功!\n");
system("pause");
break;
default:
printf("输入非法!请重新输入!\n");
break;
}
} while (input);
return 0;
}
接着是头文件定义着所有游戏实现的函数(game.h)
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义雷的数量简单模式为10个.
#define EASY_COUNT 10
// 定义行列.
#define ROW 9
#define COL 9
// 为了防止越界定义多2.
#define ROWS ROW + 2
#define COLS COL + 2
// 初始化棋盘.
void InitBoard(char board[ROWS][COLS], int row, int col, int 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);
// 获取周围雷的数量.
int GetMineCount(char mine[ROWS][COLS], int x, int y);
最后是游戏代码函数的实现(game.c)
#include "game.h"
// 初始化棋盘.
void InitBoard(char board[ROWS][COLS], int rows, int cols, int set) {
int i = 0;
for (i = 0; i < rows; ++i) {
int j = 0;
for (j = 0; j < cols; ++j) {
board[i][j] = set; // 全部初始化成set.
}
}
}
// 打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
int i = 0;
printf("--------扫雷游戏--------\n");
for (int i = 0; i <= col; ++i) {
printf("%d%c", i, " \n"[i == col]); // 如果i等于col就换行,否则是空格.
}
for (i = 1; i <= row; ++i) {
printf("%d ", i); // 每行开头先打印坐标.
int j = 0;
for (j = 1; j <= col; ++j) {
printf("%c%c", board[i][j], " \n"[j == col]);
}
}
}
// 布置雷
void SetMine(char mine[ROWS][COLS], int row, int col) {
// 随机生成10雷.
int count = EASY_COUNT;
// 这里代码规范最好写不等于0, 让别人知道这是整型变量.
while (count != 0) {
int x = rand() % row + 1; // 随机生成1到row.
int y = rand() % col + 1; // 随机生成1到col.
// 如果能放炸弹.
if (mine[x][y] == '0') {
mine[x][y] = '1';
--count; // 放完一个减去一个直到十个雷全被放完.
}
}
}
// 排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - EASY_COUNT) { // win代表排查的点, 当全部点被排查完
// 且没踩雷就获胜.
printf("请输入1代表排查操作, 2代表标记动作>:");
int opt = 0;
scanf("%d", &opt); // 选择排查这个点的雷还是标记这个点的雷.
if (opt == 1) {
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);
system("pause"); // 停顿.
system("cls"); // 清屏.
return; // 函数结束返回.
} else {
++win;
show[x][y] = GetMineCount(mine, x, y) + '0'; // 记录周围多少个雷.
// 整型数字想转换成字符的数字要加上'0'.
system("cls");
DisplayBoard(show, row, col);
}
} else {
printf("输入坐标非法!请重试!\n");
}
} else {
printf("请输入标记雷坐标>:");
scanf("%d%d", &x, &y);
printf("请输入标记符号:>:");
getchar(); // 读取掉换行以免被下面的flag接收.
char flag = '\0';
scanf("%c", &flag); // 标记成什么样的字符, 这样方便你取消和选择标记.
// 判断是否越界.
if (x >= 1 && x <= row && y >= 1 && y <= col) {
show[x][y] = flag;
system("cls");
DisplayBoard(show, row, col);
} else {
printf("输入坐标非法!请重试!\n");
}
}
}
printf("恭喜你!排除了所有的地雷!\n"); // win超过长乘宽减去雷的数量代表全排完了.
system("pause");
system("cls");
}
// 获取周围雷的数量.
int GetMineCount(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');
// 减去8个'0'是为了让char数字转成整型的数字.
}
总结
三子棋对初学者来说可能有一定的难度, 但是自己实现出来可以很好的巩固你的代码基础逻辑以及你的代码语法.