当前位置:网站首页>详解扫雷游戏(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);
}
六、总结
整体代码思路就是这样的,有什么不懂的可以评论或者私我,看见必回。
成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持
加油!加油!加油!
非常感谢您的点赞!比心
边栏推荐
- With MVC, why DDD?
- Linux的mysql报ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘ (using password NOYSE)
- DVWA installation tutorial (understand what you don't understand · in detail)
- MySQL(更新中)
- Unity Framework Design Series: How Unity Designs Network Frameworks
- C语言指针详解
- 为什么要用Flink,怎么入门使用Flink?
- 再见了繁琐的Excel,掌握数据分析处理技术就靠它了
- 剑指offer基础版 ---- 第26天
- Anaconda configure environment directives
猜你喜欢
剑指offer基础版 --- 第22天
分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
Redis Advanced - Cache Issues: Consistency, Penetration, Penetration, Avalanche, Pollution, etc.
剑指offer专项突击版 ---- 第1天
Anaconda configure environment directives
分布式事务处理方案大 PK!
Interviewer, don't ask me to shake hands three times and wave four times again
Summary of MySQL common interview questions (recommended collection!!!)
Quickly master concurrent programming --- the basics
【JS面试题】面试官:“[1,2,3].map(parseInt)“ 输出结果是什么?答上来就算你通过面试
随机推荐
Flink sink redis 写入Redis
一文了解大厂的DDD领域驱动设计
MYSQL下载及安装完整教程
数据库上机实验1 数据库定义语言
110 MySQL interview questions and answers (continuously updated)
【MQ我可以讲一个小时】
剑指offer专项突击版 --- 第 3 天
MySQL_关于JSON数据的查询
tf.keras.utils.get_file()
TOGAF之架构标准规范(一)
Unity Framework Design Series: How Unity Designs Network Frameworks
torch.normal function usage
torch.normal函数用法
MySQL(更新中)
剑指offer专项突击版 ---- 第 6 天
C语言指针详解
对list集合进行分页,并将数据显示在页面中
数据库上机实验2 单表查询和嵌套查询
面试官:生成订单30分钟未支付,则自动取消,该怎么实现?
The monitoring of Doris study notes