当前位置:网站首页>详解扫雷游戏(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);
}
六、总结
整体代码思路就是这样的,有什么不懂的可以评论或者私我,看见必回。
成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持
加油!加油!加油!
非常感谢您的点赞!比心
边栏推荐
猜你喜欢
Object Detection Study Notes
MYSQL下载及安装完整教程
mysql uses on duplicate key update to update data in batches
Redis进阶 - 缓存问题:一致性、穿击、穿透、雪崩、污染等.
DVWA installation tutorial (understand what you don't understand · in detail)
MySQL transaction (transaction) (this is enough..)
再见了繁琐的Excel,掌握数据分析处理技术就靠它了
MySQL forgot password
面试官,不要再问我三次握手和四次挥手
About the problems encountered by Xiaobai installing nodejs (npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)
随机推荐
The monitoring of Doris study notes
Proteus 8 Professional安装教程
【MQ我可以讲一个小时】
Summary of MySQL common interview questions (recommended collection!!!)
一文了解大厂的DDD领域驱动设计
Goodbye to the cumbersome Excel, mastering data analysis and processing technology depends on it
Distributed transaction processing solution big PK!
Interviewer, don't ask me to shake hands three times and wave four times again
面试官问我TCP三次握手和四次挥手,我真的是
数据库学习笔记
MySQL-Explain详解
Centos7 install mysql5.7 steps (graphical version)
剑指offer基础版 ----- 第28天
The interviewer asked me TCP three handshake and four wave, I really
剑指offer基础版 --- 第24天
<urlopen error [Errno 11001] getaddrinfo failed>的解决、isinstance()函数初略介绍
可点击也可直接复制指定内容js
为什么要用Flink,怎么入门使用Flink?
matlab abel变换图片处理
基于web3.0使用钱包Metamask的三方登陆