文章目录 前言 一、游戏界面的生成 二、棋盘生成与初始化 (一)棋盘一 (二)棋盘二 三、棋盘展示 四、布置雷 五、寻找雷 总结 前言 下面将讲述扫雷游戏的撰写-以C语言为例。
一、游戏界面的生成 首先我们可以简单生成一个游戏界面,我们将游戏界面代码全放在meum函数中,这样可以使整个程序更加简洁明了。
具体代码如下。
当用户输入1时候,游戏开始,输入0游戏结束,输入其他值时候得重新输入。
void meum(void) {
printf("*************************\n");
printf("*******1 play************\n");
printf("*******0 exit************\n");
printf("*************************\n");
int choose = 0;
scanf("%d", &choose);
do { //不用先对用户输入做出审查
switch (choose)
{
case 1:
printf("游戏开始\n");
game();
choose--;
break;
case 0:
break;
default:
printf("非法输入,请重新输入你的选择\n"); //检测有问题
scanf("%d", &choose);
break;
}
} while (choose);
}
具体游戏开始界面如下图所示。
二、棋盘生成与初始化 在生成游戏界面后,我们需要布置棋盘以及初始化棋盘。
我们以9*9棋盘举例。
(一)棋盘一 首先我们可以生成一个棋盘一,用来存放雷信息,例如0表示不是雷,1表示该地方是雷
图1 棋盘一 (二)棋盘二 我们可以生成一个棋盘二,当用户输入扫雷的坐标后,会在坐标位置生成周围雷的个数。
图2 棋盘二 对应生成棋盘和初始化棋盘的代码如下所示。
ROWS表示棋盘实际的行数+2,COLUMNS表示棋盘实际的列数+2。
具体说明将会在第五部分中说明。
char board_set_mine[ROWS][COLUMNS] ; //生成棋盘一
char board_find_mine[ROWS][COLUMNS] ;//生成棋盘二
InitBoard(board_set_mine, ROWS, COLUMNS, '0');//初始化棋盘一
InitBoard(board_find_mine, ROWS, COLUMNS, '*');//初始化棋盘二
//初始化代码
void InitBoard(char arr[ROWS][COLUMNS], int row,int column,char set) { //初始化棋盘
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < column; j++) {
arr[i][j] = set;
}
}
}
三、棋盘展示 当我们生成并且初始化棋盘之后,我们要看看程序棋盘长啥样,因此我们需要写一个函数专门打印棋盘。
具体代码如下。
void ShowBoard(char arr[ROWS][COLUMNS]) { //打印棋盘
int i = 0;
int j = 0;
for (i = 0; i <= ROW; i++) {
printf("%d", i);
}
printf("\n");
for (i = 1; i <= ROW; i++) {
printf("%d",i);
for (j = 1; j <= COLUMN; j++) {
printf("%c", arr[i][j]);
}
printf("\n");
}
}
程序打印的棋盘如下。
四、布置雷 在生成后棋盘后,我们要开始布置雷了,我们可以采用C语言中的随机函数来生成对应数量的雷。
具体代码如下。
void Setmine(char arr[ROWS][COLUMNS]) {
int count = mine_num;
//设置一次雷
while (count > 0) {
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (arr[x][y] == '0') {
arr[x][y] = '1';
count--;
}
else {
continue;
}
}
}
生成雷的效果如下所示。
字符1代表是雷,字符0代表无雷。
五、寻找雷 在设置好雷之后,我们需要寻雷了。
当我们输入对应坐标之后,该坐标如果是雷,则游戏结束,如果不是雷,则返回周围8个格子雷的个数。
在矩阵边缘的坐标附近没有8个格子该怎么办,按照传统的方案,要写大量的判断条件来判断用户输入的值是否是边缘坐标,对边缘坐标写一套另外的返回雷数的规则,这样写起来非常麻烦。
因此我们可以在雷矩阵上下各增加一行,左右各增加一列,这样就很好处理了边缘坐标的问题。
处理效果如下图所示。
对应寻雷和返回雷的代码如下所示。
int returnmine(char arr[ROWS][COLUMNS], int x, int y) {
return arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] +
arr[x][y - 1] + arr[x][y + 1] +
arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1]-8*'0';
}
void find(char arr1[ROWS][COLUMNS], char arr2[ROWS][COLUMNS]) {
int x = 0;
int y = 0;
int count = 81 - mine_num;
while (count > 0) {
printf("请输入坐标");
scanf("%d %d", &x,&y);
if (arr1[x][y] == '1') {
printf("踩雷,游戏结束");
break;
}
else {
arr2[x][y] = returnmine(arr1, x, y) + '0';
ShowBoard(arr2);
count--;
}
}
if (count == 0) {
printf("恭喜你,扫雷通关了");
}
}
总结 本文章主要讲述了如何使用C语言来设计一个简单的扫雷游戏,其中最核心的问题如下。
①如何处理雷的信息和返回雷数量信息 ②雷矩阵边缘坐标该怎么处理 代码中涉及到的一些参数如下。
#pragma once
#include
#define ROW 9
#define COLUMN 9
#define COLUMNS COLUMN+2
#define ROWS ROW +2
#define mine_num 10
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
void ShowBoard(char arr[ROWS][COLUMNS]);//展示
void InitBoard(char arr[ROWS][COLUMNS], int row, int column, char set);//初始化
void Setmine(char arr[ROWS][COLUMNS]);//设置雷
int returnmine(char arr[ROWS][COLUMNS], int x, int y);//返回雷的数量
void find(char arr1[ROWS][COLUMNS], char arr2[ROWS][COLUMNS]);//寻雷
整个扫雷程序的代码文件可参考本人的Gitee网站上传的代码。
扫雷程序
