迟来的扫雷游戏

今天我们讲如何用C语言编写出一个简单扫雷,扫雷也算是一个比较原始的游戏了吧,那么我们今天就来实现他!

首先我们要来缕一缕游戏框架

我们在代码中我们肯定会写许多函数来实现扫雷,那么我们为了简便看出游戏的运行逻辑,我们创建一个test.c的源文件来进行大体代码主体的实现,那么我们再创建一个game.c来写各种游戏部分的功能函数,最后因为功能函数和其他库函数使用时都要声明函数和引头文件所以我们建立一个头文件game.h用来解决这些问题!!!如下!

首先我们从第一步开始布局,test.c为主体框架所以我们跟着test.c来进行讲解!首先我们先看完成的菜单选择,如下:

 do   while 循环里运用switch语句来完成!然后一一看看内容·!

menu菜单

因为简洁版我们就不弄那么复杂了!


void    game( ) 游戏大体功能

InitBorad(mine, ROWS, COLS, '0');
InitBorad(show, ROWS, COLS, '*');
Setmine(mine, ROW, COL);
Print(show, ROW, COL);
Print(mine, ROW, COL);
Findmine(mine, show, ROW, COL); 

这些函数都是放在game.c来编写实现的!!!


下面一一剖析

建立两个数组和 ROWS 和  COLS  及  ROW和 COL的原因

首先我们肯定是要运用数组知识来完成扫雷但为什么要建立两个数组呢?原因是---->一边我们要在数组中埋雷(即”1“)放在棋盘里,但我们刚开始和过程又必须要将棋盘的各各位置隐藏(即”*“)而且再扫雷过程中要显示无雷位置周围的雷数数字,所以我们必须用一个棋盘用作比对棋盘,另一个用作显示给玩家,所以我们建立两个数组即show和mine两个数组。然后是ROWS,COLS,ROW,COL为什么会有这些呢,首先我们要知道当我们在检周围雷数时是3X3的范围,当我们棋盘时ROW X COL时 ,比如9X9时,在边缘检验周围雷数时就会越界,为了不让它越界我们就要在原来多加两行两数确保四边都空一行防止越界,所以我们就有了COWS,COLS。


InitBorad(mine, ROWS, COLS, '0')    InitBorad(show, ROWS, COLS, '*') ------格式化

就简单的赋值进数组中,show数组全为”*“,mine则先赋值为”0“,后续在进行设置雷!


 

Setmine(mine, ROW, COL)---------设置雷的位置

这里用到设置随机数的知识,其实就是运用rand(),但也要利用时间戳来设置为种子,这样我们才可以使每次的随机数不一样,在这里便可以每把雷的位置不一样.


int Getmine(char arr[ROWS][COLS], int x, int y) 

 

这个函数是一个检查周围雷数的函数,注意的只要最后减去8个‘0’,也就是将字符类型通过转换成整型数字。


void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win) 

void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win)
{
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)     //避免坐标非法
	{
		if (mine[x][y] != '1')      //确定没有踩到雷
		{
			if (Getmine(mine, x, y) == 0)   //确定其周围没有雷时展开继续进行
			{
				if (show[x][y] == '*')   //确保其展开对象是*
				{
					show[x][y] = ' ';
					int i = 0, j = 0;
					for (i = x - 1; i <= x + 1; i++)
					{
						for (j = y - 1; j <= y + 1; j++)
						{

							if (show[i][j] == '*')
							{
								expend(mine, show, i, j, win);

							}
						}
					}

				}

				win++;

			}
			else      //当其周围有雷时显示雷数
			{
				show[x][y] = Getmine(mine, x, y) + '0';
			}
		}
	}


}

 这个函数便是展开函数,通过上面函数可以看见我们用到了很多if语句,主要的功能其旁边也写有注释,各位可以看注释进行理解!


void Findmine(char mine[ROWS][COLS],char show [ROWS][COLS],int row,int col) 

void Findmine(char mine[ROWS][COLS],char show [ROWS][COLS],int row,int col)
{
	int x, y,win=0;
	while(win<row*col-Easy_count)
	{
		scanf("%d %d", &x, &y);
		if (0 < x && x <= row && y <= col && y > 0 )
		{

			if (mine[x][y] == '1')
			{
				printf("太可惜了,您踩到雷了呢~~~~~\n");
				break;
			}
			else if (show[x][y]!='*')
			{

				printf("老弟位置已排过雷了呢~~~~~~");
				printf("\n您可以重新输入坐标呢~~~~~\n");

			}
			else if(mine[x][y]=='0')
			{
				expend(mine, show, x, y, win);
				printf("恭喜你排雷成功了\n");
				Print(show, ROW, COL);

			}

		}
		if (win == row * col - Easy_count)
		{
			printf("恭喜你游戏胜利了呢~~~~~~~\n");
			printf("您是否决定在玩一把呢~~~~~~~~~\n\n");
			break;
		}
	}
	

}

 这个函数就是玩家操作的函数,通过输入坐标进行开始扫雷,代码中的win便是函数棋盘中的*的数量。


最后这篇文章的其他细节需要各位慢慢消化,有不懂的可以私聊我!最后给大家展示所有的代码。

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROWS 11
#define COLS 11
#define ROW 9
#define COL 9
#define Easy_count 10
void InitBorad(char board[ROWS][COLS], int rows, int cols, char set);
void Print(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS], int row, int col);
void Findmine(char mine[ROWS][COLS], char[ROWS][COLS], int row, int col);
int Getmine(char arr[ROWS][COLS], int x, int y);
void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win);

 

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

menu()
{
    printf("******************************************\n");
    printf("******************************************\n");
    printf("*********** 1. play   0.exit *************\n");
    printf("******************************************\n");
    printf("******************************************\n");
    
}

void game()
{
    char mine[ROWS][COLS];
    char show[ROWS][COLS];
    //建立两个数组
    InitBorad(mine, ROWS, COLS, '0');
    InitBorad(show, ROWS, COLS, '*');
    Setmine(mine, ROW, COL);
    Print(show, ROW, COL);
    Print(mine, ROW, COL);
    Findmine(mine, show, ROW, COL);
    


}

int main()
{
    int input, i;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏了");
            
            break;
        default :
            printf("输入错误");
            break;
        }
    }
    while (input);

    return 0;
}

 

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBorad(char board[ROWS][COLS],int rows,int cols ,char set)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void Print(char board[ROWS][COLS], int row, int col)
{
	int i, j;
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

void Setmine(char board[ROWS][COLS],int row,int col)
{
	int x, y;
	
	int count = Easy_count;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (board[x][y] != 1&&x<=ROW&&y<=COL)
		{
			board[x][y] = '1';
			count--;
		}
	} 
}

int Getmine(char arr[ROWS][COLS], int x, int y)
{
	return (arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + arr[x][y + 1]
		+ arr[x + 1][y - 1] + arr[x + 1][y + 1] + arr[x + 1][y] - 8 * '0');

}


void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win)
{
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
	{
		if (mine[x][y] != '1') 
		{
			if (Getmine(mine, x, y) == 0)
			{
				if (show[x][y] == '*')
				{
					show[x][y] = ' ';
					int i = 0, j = 0;
					for (i = x - 1; i <= x + 1; i++)
					{
						for (j = y - 1; j <= y + 1; j++)
						{

							if (show[i][j] == '*')
							{
								expend(mine, show, i, j, win);

							}
						}
					}

				}

				win++;

			}
			else
			{
				show[x][y] = Getmine(mine, x, y) + '0';
			}
		}
	}


}

void Findmine(char mine[ROWS][COLS],char show [ROWS][COLS],int row,int col)
{
	int x, y,win=0;
	while(win<row*col-Easy_count)
	{
		scanf("%d %d", &x, &y);
		if (0 < x && x <= row && y <= col && y > 0 )
		{

			if (mine[x][y] == '1')
			{
				printf("太可惜了,您踩到雷了呢~~~~~\n");
				break;
			}
			else if (show[x][y]!='*')
			{

				printf("老弟位置已排过雷了呢~~~~~~");
				printf("\n您可以重新输入坐标呢~~~~~\n");

			}
			else if(mine[x][y]=='0')
			{
				expend(mine, show, x, y, win);
				printf("恭喜你排雷成功了\n");
				Print(show, ROW, COL);

			}

		}
		if (win == row * col - Easy_count)
		{
			printf("恭喜你游戏胜利了呢~~~~~~~\n");
			printf("您是否决定在玩一把呢~~~~~~~~~\n\n");
			break;
		}
	}
	

}

 

 

今天这篇文章就结束了!

希望大家多多支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/292217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据 - Doris系列《二》- Doris安装(亲测成功版)

目录 &#x1f436;2.1 安装前准备 &#x1f959;1.设置系统最大文件打开句柄数 >启动一个程序的时候&#xff0c;打开文件的数量就是句柄数 &#x1f959;3.时钟同步 &#x1f959;4.关闭交换分区&#xff08;swap&#xff09; &#x1f436;2.2 安装FE &#x1f436…

8000字程序性能优化全能手册

8000字讲清楚程序性能优化。 本文聊一个程序员都会关注的问题&#xff1a;性能。 当大家谈到“性能”时&#xff0c;你首先想到的会是什么&#xff1f; 是每次请求需要多长时间才能返回&#xff1f;是每秒钟能够处理多少次请求&#xff1f;还是程序的CPU和内存使用率高不高&…

springBoot2.3-简单了解依赖管理、自动配置

一、自动依赖管理 基本介绍&#xff1a;springBoot提前帮我们写好了极多的依赖及版本号&#xff0c;当然我们也可以自定义依赖项与版本号。 1.1 简单介绍 1、在入门案例中&#xff0c;springBoot的maven中引入了parent父工程 2、ctrl 左键 parent&#xff0c; 发现里边还有…

C++算法学习五.二叉树(1)

1.二叉树理论基础 二叉树的种类&#xff1a; 满二叉树&#xff1a;一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&#xff0c;总共有2的k次幂-1个节点。 完全二叉树&#xff1a;在完全二叉树中…

用贪心算法编程求解任务安排问题

题目&#xff1a;用贪心算法编程求解以下任务安排问题 一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束&#xff0c;第2 个任务从时…

MyBatisPlus学习一:快速入门

前言 前面快速学习了Mybatis&#xff0c;现在开始快速学习MyBatisPlus 学习教程&#xff1a; 黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 简介 MyBatisPlus 是…

解析《个人信息保护法》实施以来主要的变化

文章目录 前言一、二十一部配套的立法二、数据入表三、跨境规则转向四、未成年个人信息保护五、数据交易六、监管创新七、执法全覆盖八、地方聚焦场景执法九、个人信息保护诉讼十、个人信息保护公益诉讼十一、包容审慎十二、双清单上线十三、外部独立监督机构十四、个性化推荐便…

高清网络视频监控平台的应用-城市大交通系统视联网

目 录 一、应用需求 二、系统架构设计 三、功能介绍 1.实时视频监控 2.云台控制 3.语音功能 4. 录像管理与回放 5.告警联动 6.多种显示终端呈现 &#xff08;1&#xff09;CS客户端 &#xff08;2&#xff09;web客户端 &#xff08;3&#xf…

Proxy 与 defineProperty 的理解、区别、优势、劣势

一、Object.defineProperty() 文档&#xff1a;Object.defineProperty() - JavaScript | MDN 作用&#xff1a;对一个对象进行操作的方法。可以为一个对象增加一个属性&#xff0c;同时也可以对一个属性进行修改和删除。 它是在 ES5 中引入的&#xff0c;使用了 getter 和 s…

node加速镜像源 管理工具nrm安装使用

我们在开发node.js的时候,经常会遇到某些包无法下载, 或者下载太慢, 还有需要加载我们自己是有源中的包的问题, 今天推荐给大家的这款 nrm 镜像源管理工具就是解决这类问题的. 安装 方法也很简单, 执行 npm install nrm -g 就可以安装 # 安装nrm npm install nrm -g# 添加…

B端产品经理学习-对用户进行需求挖掘

目录&#xff1a; 用户需求挖掘的方法 举例&#xff1a;汽车销售系统的用户访谈-前期准备 用户调研提纲 预约用户做访谈 用户访谈注意点 我们对于干系人做完调研之后需要对用户进行调研&#xff1b;在C端产品常见的用户调研方式外&#xff0c;对B端产品仍然适用的 用户需…

yarn : 无法将“yarn”项不能识别为 cmdlet、function( is not recognized报错)

文章目录 在vscode终端使用yarn install命令下面报错在vscode控制台输入(全局安装yarn) :npm install -g yarn在执行&#xff0c;报错如下&#xff1a; 报错原因:报错进行修改如下:查看命令窗口执行的安全策略设置命令窗口执行的远程策略查看安全策略&#xff0c;已修改成功可以…

windows x86 calling convention

stdcall 全部压入栈里面 第一个参数最后一个入栈&#xff08;在栈顶&#xff09; fastcall ecx edx前两个 后面的压栈&#xff0c;顺序和stdcall一样

类加载机制之双亲委派模型、作用、源码、SPI打破双亲委派模型

双亲委派模型 双亲委派工作机制双亲委派的作用双亲委派的实现源码SPI打破双亲委派 应用程序是由三种类加载器相互配合&#xff0c;从而实现类加载&#xff0c;除此之外还可以加入自己定义的类的加载器。 类加载器之间的层次关系&#xff0c;称为双亲委派模型&#xff08;Parent…

印象笔记04: 如何将印象笔记超级会员价值最大化利用?

印象笔记04&#xff1a; 如何将印象笔记超级会员价值最大化利用&#xff1f; 为什么有这个问题 我不知道有没有人一开始接触印象笔记觉得非常好。奈何只能两个设备同步&#xff0c;局限太多。而会员活动比较优惠——就开了会员。而且我开了十年……。只能开发一下看看怎么最大…

C#用StringBuilder高效处理字符串

目录 一、背景 二、使用StringBuilder便捷、高效地操作字符串 三、实例 1.源码 2.生成效果 四、实例中知识点 1.StringBuilder类 一、背景 符串是不可改变的对象&#xff0c;字符串在创建以后&#xff0c;就不会被改变&#xff0c;当使用字符串对象的Replace、split或Re…

Flappy Bird QDN PyTorch博客 - 代码解读

Flappy Bird QDN PyTorch博客 - 代码解读 介绍环境配置项目目录结构QDN算法重要函数解读preprocess(observation)DeepNetWork(nn.Module)BirdDQN类主程序部分 介绍 在本博客中&#xff0c;我们将介绍如何使用QDN&#xff08;Quantile Dueling Network&#xff09;算法&#xf…

RK3399平台入门到精通系列讲解(实验篇)信号驱动 IO 实验

🚀返回总目录 文章目录 一、什么是信号驱动IO1.1、信号驱动IO1.2、fcntl 函数介绍二、信号驱动 IO 实验源码2.1、Makefile2.2、驱动部分代码2.3、测试应用代码一、什么是信号驱动IO 1.1、信号驱动IO 信号驱动 IO 不需要应用程序查询设备的状态,一旦设备准备就绪,会触发 SI…

ASP.NETCore WebAPI 入门 杨中科

ASP.NETCore WebAPI入门1 回顾 mvc开发模式 前端代码和后端代码是混在一个项目之中 WEB API 1、什么是结构化的Http接口。Json。 2、Web API项目的搭建。 3、Web API项目没有Views文件夹。 4、运行项目&#xff0c;解读代码结构。 5、【启用OpenAPI支持】→>swagger,在界…

视频文字想要提取应该使用哪些软件呢

随着短视频的兴起&#xff0c;快手成为了很多人喜爱的平台。有时候&#xff0c;我们看到一些有趣的视频&#xff0c;想要提取其中的文字内容&#xff0c;却不知道该如何操作。今天&#xff0c;我们就来介绍一种使用水印云快手提取视频文字的方法。 首先&#xff0c;我们需要下…