当前位置:网站首页>详解扫雷游戏(C语言)
详解扫雷游戏(C语言)
2022-07-31 05:09:00 【爱编程的秀秀】
目录
一.代码搭建:
使用的vs2019编译器进行编译
test.c文件实现整个游戏框架,game.c文件实现整个游戏的具体游戏功能,game.h文件实现整个游戏需要的声明和头文件。

二.代码思路:
从现在基本流行的扫雷游戏中可以发现 实现扫雷需要的几种思路
1.首先是棋盘的打印 然后是选择坐标进行扫雷排查
2.其次就是输入坐标后 坐标上有无雷 没有雷,坐标周围一圈是否有雷,有雷的话,在输入坐标的位置打印上周围雷的数量
3.然后如果输入坐标周围没有雷,就围着坐标一圈进行扩散排查,找到周围有雷的地方停下 并打印出周围雷的数量(为了快速的进行游戏)
4.最后判断输赢。
三、代码实现:
1.框架搭建:
基本框架:用do while()实现游戏的循环,确保一局游戏结束后下一局游戏的进行;menu()菜单函数;switch 进行项目的选择 ;game()函数确保了游戏的实现。

2.菜单实现:
编写一个简单的menu()函数,进行菜单的简单实现,


3.游戏实现:
使用game()函数,进行了游戏的实现,首先根据大概思路先 初始化棋盘;其次打印棋盘、布置雷、排查雷

四、各种函数的实现:
1.初始化棋盘:

2.打印棋盘:

3.布置雷:

4.排查雷后计算坐标周围雷的个数:

5.递归拓展已选位置周围的区域:

6.排查雷并判断输赢:

五、整体代码:
1.game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void InitQiPan(char board[ROWS][COLS], int rows, int cols, char ret);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitQiPan(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
printf("-------------扫雷游戏-------------\n");
for (i = 0; i <= row; i++)
{
printf(" %d ", i);
if (i < row)
{
printf("|");
}
}
printf("\n");
//控制分割线
for (i = 0; i <= row; i++)
{
printf("---");
if (i < row)
{
printf("|");
}
}
printf("\n");
//打印数据及控制分隔线
for (i = 1; i <= row; i++)
{
printf(" %d |", i);
for (j = 1; j <= col; j++)
{
printf(" %c ", board[i][j]);
if (j < col)
{
printf("|");
}
}
printf("\n");
if (i < row)
{
for (int k = 0; k <= col; k++)
{
printf("---");
if (k < col)
{
printf("|");
}
}
}
printf("\n");
}
printf("-------------扫雷游戏-------------\n");
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
//布置10个雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int get_mine_count(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 boom_broad(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int* win)
{
int count = get_mine_count(mine, x, y);
if (count == 0)
{
show[x][y] = ' ';//没有雷的坐标赋值为空格
(*win)++;
//递归周围的八个格子
if (show[x - 1][y - 1] == '*' && x - 1 > 0 && x - 1 < ROWS && y - 1 > 0 && y - 1 < COLS)
boom_broad(mine, show, x - 1, y - 1, win);
if (show[x - 1][y] == '*' && x - 1 > 0 && x - 1 < ROWS && y > 0 && y < COLS)
boom_broad(mine, show, x - 1, y, win);
if (show[x - 1][y + 1] == '*' && x - 1 > 0 && x - 1 < ROWS && y + 1 > 0 && y + 1 < COLS)
boom_broad(mine, show, x - 1, y + 1, win);
if (show[x][y - 1] == '*' && x > 0 && x < ROWS && y - 1 > 0 && y - 1 < COLS)
boom_broad(mine, show, x, y - 1, win);
if (show[x][y + 1] == '*' && x > 0 && x < ROWS && y + 1 > 0 && y + 1 < COLS)
boom_broad(mine, show, x, y + 1, win);
if (show[x + 1][y - 1] == '*' && x + 1 > 0 && x + 1 < ROWS && y - 1 > 0 && y - 1 < COLS)
boom_broad(mine, show, x + 1, y - 1, win);
if (show[x + 1][y] == '*' && x + 1 > 0 && x + 1 < ROWS && y > 0 && y < COLS)
boom_broad(mine, show, x + 1, y, win);
if (show[x + 1][y + 1] == '*' && x + 1 > 0 && x + 1 < ROWS && y + 1 > 0 && y + 1 < COLS)
boom_broad(mine, show, x + 1, y + 1, win);
}
else
{
show[x][y] = count + '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 (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
boom_broad(mine, show, x, y,&win);
show[x][y] = get_mine_count(mine, x, y) + '0';
/*int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';*/
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
3.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("******************************\n");
printf("******** 1. play ******\n");
printf("******** 0. eixt ******\n");
printf("******************************\n");
}
//扫雷 9 * 9
void game()
{
char mine[ROWS][COLS] = { 0 }; //mine 地雷 -- 布雷区
char show[ROWS][COLS] = { 0 };// show ---- 显示区
//初始化棋盘
InitQiPan(mine, ROWS, COLS, '0');
InitQiPan(show, ROWS, COLS, '*');
//打印棋盘
DisplayBoard(show, ROW, COL);
//布置雷
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入您要选择的项目\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}六、总结
整体代码思路就是这样的,有什么不懂的可以评论或者私我,看见必回。
成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持
加油!加油!加油!
非常感谢您的点赞!比心
边栏推荐
猜你喜欢

ES source code API call link source code analysis

C语言实验一 熟悉C程序的环境

Quickly master concurrent programming --- the basics

面试官,不要再问我三次握手和四次挥手

Unity Framework Design Series: How Unity Designs Network Frameworks
【一起学Rust】Rust的Hello Rust详细解析

面试官问我TCP三次握手和四次挥手,我真的是

分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ

C语言实验三 选择结构程序设计

Object Detection Study Notes
随机推荐
DVWA shooting range environment construction
ABC D - Distinct Trio (Number of k-tuples
MySQL (updating)
数据库上机实验1 数据库定义语言
.NET-6.WinForm2.NanUI learning and summary
STM32 - DMA
关于LocalDateTime的全局返回时间带“T“的时间格式处理
工作流编排引擎-Temporal
docker安装postgresSQL和设置自定义数据目录
C语言教程(二)-printf及c自带的数据类型
<urlopen error [Errno 11001] getaddrinfo failed>的解决、isinstance()函数初略介绍
面试官问我TCP三次握手和四次挥手,我真的是
面试Redis 高可靠性|主从模式、哨兵模式、Cluster集群模式
分布式事务处理方案大 PK!
Anaconda配置环境指令
12 reasons for MySQL slow query
SQL statement to range query time field
Flask 的初识
About the problems encountered by Xiaobai installing nodejs (npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)
一文了解大厂的DDD领域驱动设计