企业网站的首页设计模板,php网站授权,网站空间200m,淄博周村学校网站建设报价大家好啊#xff0c;我是小象٩(๑ω๑)۶ 我的博客#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家#xff0c;希望能够和大家一起交流学习#xff0c;共同进步。 这一节课我们不学习新的知识#xff0c;我们来做一个扫雷小游戏 目录 扫雷小游戏概述一、扫雷游戏分析… 大家好啊我是小象٩(๑òωó๑)۶ 我的博客Xiao Xiangζั͡ޓއއ 很高兴见到大家希望能够和大家一起交流学习共同进步。 这一节课我们不学习新的知识我们来做一个扫雷小游戏 目录 扫雷小游戏概述一、扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 设计思路总结 二、扫雷游戏代码的实现game.hgame.ctest.c 三、扫雷游戏的扩展四、结尾 扫雷小游戏概述
扫雷是一款极具趣味性和挑战性的逻辑解谜游戏玩家需要在一个布满方块的网格中根据数字提示推理出隐藏地雷的位置并标记或避开它们。这款游戏历史悠久许多操作系统都将其作为自带游戏因其简单易上手却又充满策略性而深受玩家喜爱。
一、扫雷游戏分析和设计
1.1 扫雷游戏的功能说明 • 使用控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格子 • 默认随机布置10个雷 • 可以排查雷 ◦ 如果位置不是雷就显示周围有几个雷 ◦ 如果位置是雷就炸死游戏结束 ◦ 把除10个雷之外的所有非雷都找出来排雷成功游戏结束
1.2 设计思路总结
首先利用控制台打造经典扫雷游戏含菜单可选择继续或退出。棋盘为 9×9默认随机布置 10 个雷。玩家排查雷若选中非雷位置显示周围雷数选中雷则游戏结束找出所有非雷位置游戏胜利。 然后我们可以采用两个 11×11 的字符数组mine数组存放布置好的雷信息初始为’0’布置雷处改为’1’show数组存放排查出的雷的信息初始为’* 以此避免信息混淆同时扩大数组防止排查雷时越界。 最后再通过多文件形式开发test.c编写测试逻辑game.c实现游戏函数game.h声明数据类型和函数使代码结构清晰便于维护。
二、扫雷游戏代码的实现
之前学习了多文件的形式对函数的声明和定义这里我们实践⼀下我们设计三个文件
test.c //⽂件中写游戏的测试逻辑
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等game.h
#pragma once
#include stdio.h
#include stdlib.h
#include time.h
#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW2
#define COLS COL2//初始化棋盘void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘void DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷void SetMine(char board[ROWS][COLS], int row, int col);//排查雷void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);这是一个头文件主要用于声明函数和定义常量为其他源文件提供必要的接口和信息以实现模块化编程。 前面包含了标准输入输出库 stdio.h、标准库 stdlib.h 和时间库 time.h这些库提供了后续代码中使用的基本函数如 printf、scanf、rand 和 time 等。 宏定义EASY_COUNT 定义了简单难度下雷的数量为 10 个。 ROW 和 COL 分别定义了游戏棋盘的实际行数和列数这里是 9x9的棋盘。 ROWS 和 COLS 分别是在实际棋盘基础上增加了两行两列的扩展棋盘大小用于方便处理边界情况。 声明了四个函数这些函数的具体实现将在 game.c 文件中完成。 InitBoard 用于初始化棋盘将棋盘的每个元素设置为指定的字符。 DisplayBoard 用于打印棋盘方便玩家查看游戏状态。 SetMine 用于在棋盘上随机布置雷。 FindMine用于玩家排查雷根据玩家输入的坐标判断是否踩到雷并更新游戏状态。 game.c
#include stdlib.h
#include time.h
#include game.hvoid InitBoard(char board[ROWS][COLS], int rows, int cols, char set){int i 0;for (i 0; i rows; i){int j 0;for (j 0; j cols; j){board[i][j] set;}}}void DisplayBoard(char board[ROWS][COLS], int row, int col){int i 0;printf(--------扫雷游戏-------\n);for (i 0; i col; i){printf(%d , i);}printf(\n);for (i 1; i row; i){printf(%d , i);int j 0;for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}}void SetMine(char board[ROWS][COLS], int row, int col){//布置10个雷//⽣成随机的坐标布置雷int count EASY_COUNT;while (count){int x rand() % row 1;int y rand() % col 1;if (board[x][y] 0){board[x][y] 1;count--;}}}int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] mine[x - 1][y - 1] mine[x][y - 1] mine[x 1][y-1] mine[x 1][y] mine[x 1][y 1] mine[x][y 1] mine[x - 1][y 1] - 8 * 0);
}
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 - EASY_COUNT){printf(请输⼊要排查的坐标:);scanf(%d %d, x, y);if (x 1 x row y 1 y col){if (mine[x][y] 1){printf(很遗憾你被炸死了\n);DisplayBoard(mine, ROW, COL);break;}else{//该位置不是雷就统计这个坐标周围有⼏个雷int count GetMineCount(mine, x, y);show[x][y] count 0;DisplayBoard(show, ROW, COL);win;}}else{printf(坐标⾮法重新输⼊\n);}}if (win row * col - EASY_COUNT){printf(恭喜你排雷成功\n);DisplayBoard(mine, ROW, COL);}
}
这是一个源文件主要实现了 game.h 中声明的函数是扫雷游戏的核心功能实现文件。 InitBoard 函数使用双重循环遍历棋盘的每个元素将其初始化为指定的字符 set。 DisplayBoard 函数打印棋盘的行列编号并输出棋盘的每个元素方便玩家查看游戏状态。 SetMine 函数利用 rand 函数生成随机坐标在棋盘上随机布置 EASY_COUNT 个雷直到布置完成。 GetMineCount 函数计算指定坐标周围 8 个格子中雷的数量通过字符 ‘1’ 和 ‘0’ 的 ASCII 码差值来统计。 FindMine 函数处理玩家排查雷的操作根据玩家输入的坐标判断是否踩到雷。如果踩到雷游戏结束否则统计周围雷的数量并更新显示棋盘直到所有非雷格子都被排查完玩家获胜。
test.c
#include game.hvoid menu(){printf(***********************\n);printf(***** 1. play *****\n);printf(***** 0. exit *****\n);printf(***********************\n);}void game(){char mine[ROWS][COLS];//存放布置好的雷char show[ROWS][COLS];//存放排查出的雷的信息//初始化棋盘//1. mine数组最开始是全0//2. show数组最开始是全*InitBoard(mine, ROWS, COLS, 0);InitBoard(show, ROWS, COLS, *);//打印棋盘//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//1. 布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//2. 排查雷FindMine(mine, show, ROW, COL);}int main(){int input 0;srand((unsigned int)time(NULL));do{menu();printf(请选择:);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(选择错误重新选择\n);break;}} while (input);return 0;}
这也是一个源文件主要负责游戏的流程控制和用户交互是游戏的入口文件。 主函数main是程序的入口点使用 srand 函数初始化随机数种子以确保每次游戏的雷布局不同。通过 do-while 循环不断显示菜单根据用户的选择调用相应的函数直到用户选择退出游戏。
综上所述game.h 提供了游戏的接口和常量定义game.c 实现了游戏的核心功能test.c 负责游戏的流程控制和用户交互三个文件协同工作实现了一个简单的扫雷游戏。
三、扫雷游戏的扩展
• 是否可以选择游戏难度 简单 99 棋盘10个雷 中等 1616棋盘40个雷 困难 30*16棋盘99个雷 • 如果排查位置不是雷周围也没有雷可以展开周围的一片 • 是否可以标记雷 • 是否可以加上排雷的时间显示
四、结尾
这一课的内容就到这里了下节课继续学习指针的其他一些知识 如果内容有什么问题的话欢迎指正有什么问题也可以问我