1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C语言实现扫雷小游戏

C语言实现扫雷小游戏

时间:2021-05-12 00:47:39

相关推荐

C语言实现扫雷小游戏

扫雷

当我们学习到了数组的时候,我们可以尝试写出三子棋(见前文)和扫雷这两个小游戏,今天我就带来如何用c语言写出一份扫雷来

(不得不说,作为一个C语言差点挂科的人,写完扫雷成就感十足好吧!)

那么就开始吧!

首先,通过写完这两个小游戏,我发现其实写个程序的第一步就是构建好框架,分成不同的函数,然后逐个攻坚,最后,你就发现,you get it!

和三子棋一样,将整个工程分为game.c,game.h和mine sweeping.c三个文件。如下图

另外,对于扫雷这个程序,还有几点需要提前注意

1 为了能计算不为雷的地方周围八个空有几个雷,我们要保证在边界的字符周围也有八个字符,我们需要采用在一个大数组里面输出一个小数组,像下图,输出绿色框里的数组

所以,我们需要定义几个数,如下图

#define ROW 9#define COL 9#define ROWS 11#define COLS 11

2 在实现程序时,要考虑玩家,比如打印函数中要加上打印序列的功能,玩家认为的位置与其实际数组位置不同等

第一步

让我们先来看一下mine sweeping.c文件

#define _CRT_SECURE_NO_WARNINGS#include"game.h"int main(){srand((unsigned int)time(NULL));int input = 0;do{menu();//打印菜单函数scanf("%d",&input);switch (input){case 1:game();//游戏主函数break;case 0:printf("Exit game\n");default:printf("Input error,please input again\n ");}} while (input);}

这是一段很简单的代码,然后呢,大概框架写好后,我们就可以开始逐步实现game()函数了

第二步

先来简单看一下game中有些什么小函数及其作用。

void game(){char arr1[ROWS][COLS];//数组一负责真实记录雷的地方char arr2[ROWS][COLS];//数组二负责混淆玩家init(arr1, ROWS, COLS, '0');//因为数组一是用来记录雷的,所以我们简单采用字符'0'和'1'来记录,所以现将数组一初始化为'0'init(arr2, ROWS, COLS, '*');//因为数组二是用来记录雷的,所以我们将数组二初始化为'*'int minenum = 0;//这是玩家想要雷的数量setmine(arr1,arr2,ROW,COL,minenum);//这是负责放雷的函数//printboard(arr1, ROW, COL);这是打印函数,在写代码的时候可以用来测量代码块是否正确//printboard(arr2, ROW, COL);findmine(arr1,arr2, ROW, COL,minenum);//这是玩家找雷的函数。return ;}

第三步

让我们来逐个看一下小函数的代码

1 菜单函数

void menu(){printf("************************\n");printf("****** 1.play ******\n");printf("****** 0.exit ******\n");printf("************************\n");printf("PLease input 1/0 : ");}

2 初始化函数

void init(char arr[ROWS][COLS],int rows,int cols,char ch){int i = 0;for (; i < rows; i++){for (int j = 0; j < cols; j++){arr[i][j] = ch;}}}//很简单就是遍历初始化

3 打印函数

void printboard(char arr[ROWS][COLS], int row, int col){int i = 1;for(i = 0; i <= col; i++){printf("%d ", i);//打印第一排序列}printf("\n");for (i=1; i <=row; i++){printf("%d ",i);//打印第一列序列int j = 1;for (j=1; j <=col; j++){printf("%c ", arr[i][j]);}printf("\n");}}

4 放置雷的函数

void setmine(char arr1[ROWS][COLS],char arr2[ROWS][COLS],int row, int col,int minenum){int x, y,i;printf("How many mines you want to choose,please input (mine number is form 1 to 80): ");//1到80是因为我打印的是9*9的图scanf("%d",&minenum);for (i = 0; i < minenum; i++){x = rand() % row + 1;//随机数实现地雷随机y = rand() % col + 1;arr1[x][y] = '1';//将地雷设为字符'1'}printboard(arr2, ROW, COL);//打印数组二迷惑玩家}

5 找雷的函数

void findmine(char arr1[ROWS][COLS],char arr2[ROWS][COLS],int row, int col,int minenum){int x, y;int i = 0;while (i<ROW*COL-minenum)//玩家可操作次数是可以计算的{printf("Please input you coordinate : ");scanf("%d%d",&x,&y);if (arr1[x][y] == '0'){int i = 0; int j = 0;char ch = '0';for (i = x - 1; i < x + 2; i++){for (j = y - 1; j < y + 2; j++){if (arr1[i][j] == '1'){ch+=1;}}}//计算某个不为地雷的字符周围八个空有几个地雷arr2[x][y] = ch;//并将此值赋给数组二的该位置的值printboard(arr2,ROW,COL);//打印数组二}else{printf("You die\n");printboard(arr1, ROW, COL);return ;//return 的作用是结束代码}i++;}printf("You win\n");//若循环完毕仍没有失败,那么就赢了}

最后

最后到这,代码就完毕了,希望对看文章的你有所帮助,一起加油吧!(最后附上几张代码图和运行图以供参考)

好了,拜拜啦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。