跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

扫雷小游戏-以C语言为例

文章目录 前言 一、游戏界面的生成 二、棋盘生成与初始化 (一)棋盘一 (二)棋盘二 三、棋盘展示 四、布置雷 五、寻找雷 总结 前言 下面将讲述扫雷游戏的撰写-以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网站上传的代码。

扫雷程序

相关文章