前言:当我们学习了循环、数组和函数以后,我们就可以做一个简易版的扫雷游戏(控制台扫雷)
1.扫雷游戏的制作思路和设计
游戏思路
相信大家对扫雷都有所了解,现在我来讲一下
1.实现游戏菜单:继续玩或者退出游戏
2.棋盘9*9
3.默认10个雷,并随机分布
4.如果这个位置不是雷,就显示周围有几个雷
5.如果位置是雷,炸死,游戏结束
6.如果正确锁定10个雷,并把所有位置排完,排雷成功,游戏结束
游戏界面
游戏结构
我们需要布置雷、排查雷等,这些信息需要储存,既然是9*9的棋盘,那么我们首先想到的就是用9*9的数组来存放这些信息
如果这个位置布置雷,我们就存放1,没有布置雷就存放0
假设我们要排查(3,3)这个坐标时,我们要统计周围一圈八个黄色位置
但是如果我们排查(8,3)这个位置时,我们会发现,没有足够的八个数组元素让我们排查,所有我们要给数组扩大一圈,这一圈不布置雷就行
我们再继续分析,我们一个有两个信息,一个是雷的信息,一个是非雷的信息,当我们排查完雷的时候我们要存储信息,但是对于我们雷的个数也是一个信息,那么为了不混淆它们的信息,我们可以这样:
我们先设置好一个棋盘,这个棋盘可以是任何统一的符号比如
(图1)
我们再设置一个棋盘
(图2)
我们在图1选择坐标后,把坐标传给图2,同时存放数据,这样我们就不容易混淆代码了
同时,为了不显示出雷,我们让图1作为初始化棋盘
2.扫雷游戏的代码实现
对于扫雷游戏,代码的实现不算特别简单,由此根据我们之前函数所学内容,我们可以分为多个文件,实现函数声明、定义、以及代码运行
test.c : 游戏代码的运行
game.c :游戏代码函数的实现
game.h : 游戏函数声明
下面,我将解释如何操作
制作菜单(test.c)
#include "game.h" void menu() { printf("***********************\n"); printf("**** 1. play ****\n"); printf("**** 0. exit ****\n"); printf("***********************\n"); }
对菜单操作(test.c)
#include <stdio.h> #include "game.h" void menu() { printf("***********************\n"); printf("**** 1. play ****\n"); printf("**** 0. exit ****\n"); printf("***********************\n"); } int main() { int input = 0; do { menu();//执行“void menu” printf("请输入:"); scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; }//break跳出switch语句 } while (input); return 0; }
do while语句 和 switch语句是最经典的菜单语句,希望大家可以熟练运用
运行结果(test.c)
创造游戏部分(test.c)
#include <stdio.h> #include "game.h" void menu() { printf("***********************\n"); printf("**** 1. play ****\n"); printf("**** 0. exit ****\n"); printf("***********************\n"); } void game()//游戏部分!!!!!!!!!!!!!!!!!!!!!!!! { } int main() { int input = 0; do { menu();//执行“void menu” printf("请输入:"); scanf("%d", &input); switch (input) { case 1: game();//注意这里的变化!!!!!!!!!!!!!!!!!!!!! break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; }//break跳出switch语句 } while (input); return 0; }
定义行列数(game.h)
ROW COL →9行
ROWS COLS →11行
引进两个数组(test.c)
char mine[ROW][COL] (布置雷) char show[ROW][COL] (初始化*)
初始化棋盘 initboard (test.c)
声明函数 initboard (game.h)
定义函数 initboard (game.c)
打印*棋盘displayboard(test.c)
展现出来的是 9*9 的棋盘(ROE COL)
声明函数displayboard
定义函数displayboard(game.c)
打印效果(test.c)
为辅助玩家,加上坐标号(game.c)
布置雷函数 setmine (test.c)
声明函数 setmine (game.h)
定义函数setmine(game.c)
生成随机数(test.c)
声明主要函数(game.h)
排查雷函数findmine(test.c)
声明函数findmine(game.h)
在mine中排查,把信息放到show里面
定义函数findmine(game.c)
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 - EASYCOUNT)//简单难度十个雷,再此不特别强调 { printf("请输入要排查的坐标:>\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y]=='1') { printf("很遗憾,你被炸死了\n"); displayboard(show, ROW, COL); break; } else { //如果该位置不是雷,扫描这个位周围有几个雷 int count = getminecount(mine, x, y); show[x][y] = count + '0'; displayboard(show, ROW, COL); win++; } } else { printf("坐标非法,请重新输入\n"); } } }
那么代码写到这也差不多了,但是这只是扫雷的简单版本,也不是唯一版本
扫雷拓展
游戏还可以继续设计
——简单(10颗雷),中等(40颗雷),困难(99颗雷)
——如果排查处不是雷,可以展开周围一片
——时间
——标记雷
等等
总结:游戏玩法千千万,这是需要动脑筋的,但不管怎样,希望这篇博客对你有帮助
作者留言:制作不易,本人是初学者,如有错误或不恰当的地方,欢迎大家指出!😊
创作时间:2023.11.29