初阶c语言:趣味扫雷游戏
目录
前言
制作菜单
构建游戏选择框架
实现游戏功能
模块化编程:查看前节三子棋的内容
初始化雷区
编辑
优化棋盘
随机埋入地雷
点击后的决策
实现此功能代码
game();的安排
前言
《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非地雷的格子,同时避免踩到地雷,踩到一个地雷全盘皆输。
玩家需要在雷区中,将所有地雷一一排查出来:9x9规格
test.c - - - - 测试游戏的逻辑
game.c - - - - 游戏代码的实现
game.h - - - - 游戏代码的声明 ( 函数声明,符号定义 )
制作菜单
在玩游戏时,我们在进入游戏都会有菜单选项,选择开始游戏,推出游戏等这些指令,说到选择,那么我们可以依据我们所学的循环和分支语句来先完成基本框架的设计。
首先我们进入游戏都是先显示选项,做出选择,并且在玩游戏时玩一局,还想玩怎么办(想一想我们前边的知识哪种结构符合先进入游戏出现菜单再循环这一需求)那肯定是do…while的循环结构更符合,那么我们就先使用函数来打印输出一个菜单选项
void menu() { printf("*****************************\n"); printf("*****************************\n"); printf("**********1.play^************\n"); printf("**********0.exit^************\n");//菜单 printf("*****************************\n"); printf("*****************************\n"); } int main() {int a = 0; do { menu(); printf("请选择:"); scanf("%d",&a); }while(); return 0; }
构建游戏选择框架
游戏菜单已在屏幕上显示完成,现在需要完成选择,并且在玩游戏时玩一局,还想玩怎么办。
这时候需要应用博主之前阐述的switch语句来实现:
int main() { int input = 0; do { menu(); printf("PLEASE SELECT:"); scanf("%d", &input); switch(input) { case 1: game(); //以上为界面的选择 break; case 0: printf("Exit\n"); break; default: printf("ERRO,PLEASE CHOOSE AGAIN\n"); break; } } while (input);//while循环可以利用0为假,其余为来实现用户可反复选择 //直到选到合适为止 return 0; }
实现游戏功能
模块化编程:查看前节三子棋的内容
test.c:是用来实现游戏逻辑 game.c:用来实现游戏功能的函数 game.h:用来申明游戏功能函数(可引用)
使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等!
此为game.h的文件
#pragma once #define _CRT_SECURE_NO_WARNINGS//使用scanf函数的报错处理方式 #include //打印函数的使用工具箱 #include//颜色函数和清屏指令的工具箱 #include//在使用rand的时候需要用到srand, srand((unsigned int)time(NULL))随机函数,调用一次就可以 #include #define row 9//常量 #define col 9 #define cols col+2//定义常量 #define rows row+2 void initboard(char board[rows][cols],int hang, int lie,char set);//形参数 void displayboard(char board[rows][cols], int hang, int lie);//只设置9*9格子 void setmine(char board[rows][cols], int hang, int lie);//埋入地雷 void panduan(char show[rows][cols], char mine[rows][cols],int hang, int lie);
后边会逐个剖析 :
用来引用在test.c文件中
初始化雷区
首先映入眼帘的一定是 9×9 的雷区,这 81 个被遮盖的格子,
当我们随机的点击其中的格子时,会出现以下二种情况:
① 当翻开的格子是地雷时,玩家被炸“死”,游戏结束;
② 当翻开的格子不是地雷时,该格子会显示周围的 8 个格子存在的地雷的个数;
由图例可以得出结论,实现 9×9 的扫雷游戏,创建一个 9 行 9 列的二维数组并不合适。
既然对 9 行 9 列的二维数组的边界元素进行操作时,会导致数组越界访问,那我们干脆就直接将二维数组扩大一圈,将那些会导致越界访问的范围包括在数组内,从源头上解决问题,这是一个非常巧妙的办法!
所以需要设置两个数组(二维数组)
(1)一个为储存埋雷数据的(用于判断是否踩雷)
(2)一个为展示给玩家的棋盘(类似于上面的蓝色未知方块,点开后显示周围8格雷数)
需要将两个数组同时初始化initboard子函数
void initboard(char board[rows][cols], int hang, int lie,char set) { int i = 0; int j = 0; for (i = 0; i优化棋盘
由于雷区行号较长,所以需要给每行列标注序号displayboard子函数
void displayboard(char board[rows][cols], int hang, int lie) { int i = 0; int j = 0; printf("---------------------------------------\n"); for(j = 0; j = 1 && x = 1 && y
还没有评论,来说两句吧...