当前位置: 首页 > news >正文

C语言数组和函数的实践———扫雷游戏

扫雷游戏的代码实现

game.h部分

//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//宏定义是为了方便以后修改棋盘的行和列
#define COL 9
#define ROWS ROW+2//排查边缘行的雷时需向外延伸一行,共2个边缘行
#define COLS COL+2//排查边缘列的雷时需向外延伸一行,共2个边缘列
#define  EASY_COUNT 10
//函数声明//初始化棋盘
void InitBoard(char board[ROWS][COLS], int r, int c, char set);
//打印棋盘信息
void DisplayBoard(char board[ROWS][COLS] ,int r,int c);
//布置雷
void SetMine(char mine[ROWS][COLS],int  r,int c );
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c);

game.c部分

#include"game.h"//调用自定义头文件,可以使用头文件里面的文件
void InitBoard(char board[ROWS][COLS], int r, int c,char set)//传参
{int i = 0;for (i = 0;i < r;i++){int j = 0;for (j = 0;j < c;j++) {board[i][j] = set;}}
}
void DisplayBoard(char board[ROWS][COLS], int r, int c)//打印棋盘
{int i = 0;printf("- - - - - -扫雷- - - - - -\n");//打印列号for (i = 0;i <= c;i++){printf("%d ", i);}printf("\n");for (i = 1;i <= r;i++){int j = 0;printf("%d ", i);for (j = 1;j <= r;j++){printf("%c ", board[i][j]);}printf("\n");}
}
void SetMine(char mine[ROWS][COLS], int r, int c)//布置雷
{int count = EASY_COUNT;while (count){//生成随机坐标//x的范围1~9,y的范围是1~9int x = rand() % r + 1;//调用函数(该函数包含在<stdlib.h>库中),随机生成数%行数+1,使得这个数在范围内int y = rand() % c + 1;if (mine[x][y] == '0'){mine[x][y] = '1';//布置雷count--;}}
}
static int GetMineCount(char mine[ROWS][COLS],int x,int y)//返回一个数,这个数是玩家所选位置周围雷的个数
{
//方法一:return 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] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';//方法二:
/*int i = 0;
int j = 0;
int c = 0;
for (i = -1;i <=1;i++)
{for (j = -1;j <= 1;j++){if (mine[x + i][y + j] == '1')c++;}
}
return c;*/
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c)//排查雷
{int x = 0;int y = 0;int win = 0;while (win<r*c-EASY_COUNT) {printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);//先判断坐标是否合法if (x >= 1 && x <= r && y >= 1 && y <= c){//再判断是否为雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, r, c);//失败后呈现所有雷的棋盘break;}else{//先看此位置是否被排除过if (show[x][y] =='*'){//统计mine数组中,x,y坐标周围有几个雷int c = GetMineCount(mine, x, y);show[x][y] = c + '0';DisplayBoard(show, ROW, COL);win++;}else{printf("该坐标已经被排查过,请重新输入坐标\n");}}}else{printf("输入的坐标非法,请重新输入\n");}}if (win == r * c - EASY_COUNT){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

test.c部分

#include"game.h"void menu()
{printf("*********************************\n");printf("************   1.play  **********\n");printf("************   0.exit  **********\n");printf("*********************************\n");
}
void game()
{char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息//棋盘初始化//mine全为‘0’,表示还没有设置雷,所有位置都不是雷//show全为‘*’,表示所有位置都没有被排查InitBoard(mine,ROWS,COLS,'0');//这里的字符一会儿会被传参过去InitBoard(show, ROWS, COLS,'*');SetMine(mine, ROW, COL);//布置雷//DisplayBoard(mine, ROW, COL);//布置的雷不想被看到,注释掉就不会打印DisplayBoard(show, ROW, COL);//打印棋盘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;
}

相关文章:

  • APP自动化测试(一)
  • 9-4 USART串口数据包
  • [HOT 100] 1377. T 秒后青蛙的位置
  • 在若依里创建新菜单
  • uniapp开发11-v-for动态渲染list列表数据
  • Beetle 树莓派RP2350 - 桌面时钟摆件
  • 探索Hello Robot开源移动操作机器人Stretch 3的技术亮点与市场定位
  • Banana Pi BPI-CM6 是一款八核 RISC-V 模块,兼容 Raspberry Pi CM 载板
  • POI创建Excel文件
  • Android setContentView()源码分析
  • [学习]RTKLib详解:rtkcmn.c与rtkpos.c
  • Java实现堆排序算法
  • 【省电级子印章系统建设方案】
  • 一款独立于游戏外的键盘源按键辅助工具他来了
  • 2025年AI视觉革命:Dual-Stream Diffusion如何让PS下岗?
  • 交换机 MUX VLAN
  • 雨云游戏云MCSM面板服使用教程我的世界Forge服务端开服教程
  • 通话篇:FreeBuds 6的正确打开方式!
  • 优化04-选择率和直方图
  • 小红书怎么看自己ip地址?小红书更改ip地址教学
  • 城阳网站制作/软文推广网站
  • 建设学习网站/如何做网销
  • 网站建设合同编号/优化网站
  • 电子商务网站开发书例子/宁波seo关键词排名
  • 自己做网站统计/百度seo代理
  • 网站程序哪个好/公司产品推广方案