当前位置:网站首页>C语言实现扫雷 附带源代码
C语言实现扫雷 附带源代码
2022-08-04 22:55:00 【暴躁小程序猿】
扫雷游戏C语言实现
我们绝大多数的人都玩过扫雷小游戏,但是扫雷游戏的原理是什么?如果你学过C语言但是没有思路设计这款游戏,那么这篇文章应该对你大有裨益;
一、扫雷游戏规则介绍
扫雷的玩法:在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。
二、test.c板块
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf(" 1. play \n");
printf(" 0. exit \n");
}
void game()
{
//设计2个数组存放信息
char mine[ROWS][COLS] = {
0 };
char show[ROWS][COLS] = {
0 };
//初始化棋盘
//mine初始化为全‘0’
//show初始化为全‘*’
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');
//打印棋盘
//display_board(mine, ROW, COL);
//display_board(show, ROW, COL);
//布置雷
set_mine(mine, ROW, COL);
//排雷
//display_board(mine, ROW, COL);
display_board(show, ROW, COL);
find_mine(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;
}
在test.c文件下,我们设计了游戏main函数,游戏的大体框架在这个文件中设计,主要包括初始化扫雷棋盘,采用了数组的形式来实现,就单独说简单模式的扫雷是9x9棋盘,但是角落的位置旁边的棋盘格和中间会形成差异,所以我们利用一个11x11的棋盘格,但是真正用的还是9x9,目的为了防止数组越界访问,还有打印棋盘,我们采用两个数组进行打印,一个用来放置雷,一个用来打印,其次还有雷的随机位置设定,排雷等功能,此处直接调用了函数,具体功能的实现在下面的game.c文件中。
三、头文件game.h的设计
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘
void display_board(char board[ROWS][COLS], int row, int col); //打印棋盘
void set_mine(char mine[ROWS][COLS], int row, int col); //布置雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); //排查雷
头文件中包含了宏定义以及功能函数的声明;
四、game.c——游戏功能的具体实现
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(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 display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void set_mine(char mine[ROWS][COLS], int row, int col)
{
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 find_mine(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");
display_board(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
display_board(show, ROW, COL);
win++;
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
display_board(mine, ROW, COL);
}
}
1.棋盘的初始化
代码如下:
void init_board(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;
}
}
}
这里将数组传入函数,同时将棋盘的行数列数传入,形式参数set则决定用什么内容对棋盘进行初始化,函数内部利用for循环,对数组进行初始化,最终实现棋盘的初始化。
2.棋盘的打印
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
为了方便确定位置,我们利用for循环对棋盘进行编号,然后打印棋盘。
3.雷的设置
void set_mine(char mine[ROWS][COLS], int row, int col)
{
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--;
}
}
}
我们是简单模式,一共有十个雷,确定一个随机的x和一个随机的y作为数组的下标,然后判断该位置是不是0,如果不是0就设置位1,判断的目的是防止多个雷出现在同一个位置上,设置一个雷变量count–,最终设置10个雷,功能完成。
4.排查雷
void find_mine(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");
display_board(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
display_board(show, ROW, COL);
win++;
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
display_board(mine, ROW, COL);
}
}
我们输入一个二维坐标来确定我们想打开哪一个位置,但是一个坐标只能排查一次,所以我们要先判断这个坐标是否已经排查过了,如果是就表示可以排查,结果为1就打印你被炸死了游戏结束,如果不为1就打印周围的雷数,如果该位置不为则表示这个位置已经探测过了。10个雷完全排除游戏胜利。
总结
扫雷的游戏主要依靠两个数组,一个数组用来放置雷,一个用来打印显示,同时考虑好如何随机的设置雷,以及游戏胜负的判定等功能如何实现,多次利用for循环的嵌套以及if,else的选择分支结构,希望大家可以有所收获,如果有收获麻烦关注+三连,私信看见必回!
边栏推荐
- 功耗控制之DVFS介绍
- 一点点读懂Thremal(二)
- 文献阅读十——Detect Rumors on Twitter by Promoting Information Campaigns with Generative Adversarial Learn
- postman接口测试
- [Mock Interview - 10 Years of Work] Are more projects an advantage?
- The Controller layer code is written like this, concise and elegant!
- 【模拟面试-10年工作】项目多一定是优势吗?
- VC bmp文件总结
- 期货开户哪个平台好,要正规安全的
- Kernel函数解析之kernel_restart
猜你喜欢

【游戏建模模型制作全流程】ZBrush蜥蜴模型雕刻教程

PowerBI scripture series
![[Cultivation of internal skills of string functions] strlen + strstr + strtok + strerror (3)](/img/96/946bbef52bd017ac6142c6b7485a86.png)
[Cultivation of internal skills of string functions] strlen + strstr + strtok + strerror (3)

最温馨的家园

【论文笔记KDD2021】MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems

【无标题】

历史上的今天:PHP公开发布;iPhone 4 问世;万维网之父诞生

功耗控制之DVFS介绍

SSM整合完整流程讲解

Pytest学习-Fixture
随机推荐
「津津乐道播客」#397 厂长来了:怎样用科技给法律赋能?
Qt中的常用控件
3D建模师为了让甲方爸爸过稿,还可以这么做,就是在赚血汗钱啊
剑指Offer | 数值的整数次方
[Mock Interview - 10 Years of Work] Are more projects an advantage?
基于事实的讨论
赶紧进来!!!教你C语言实现扫雷小游戏(文章最后有源码!!!)
期货开户哪个平台好,要正规安全的
现在学习次世代3D游戏建模还能找到高薪好工作吗
一点点读懂regulator(四)
【3D建模制作技巧分享】在zbrush中如何雕刻头发 ZBrush头发雕刻小技巧
Jbpm3.2 开发HelloWorld (简单请假流程)客户端
If you can't get your heart, use "distributed lock" to lock your people
自从新来了个字节20K出来的,就见识到了什么是天花板
智慧养老整体解决方案
go语言的time包介绍
【字符串函数内功修炼】strlen + strstr + strtok + strerror(三)
社区分享|腾讯海外游戏基于JumpServer构建游戏安全运营能力
[QNX Hypervisor 2.2用户手册]10.4 vdev hpet
I was rejected by the leader for a salary increase, and my anger rose by 9.5K after switching jobs. This is my mental journey