小游戏-扫雷

news2024/11/16 10:30:57

扫雷大多人都不陌生,是一个益智类的小游戏,那么我们能否用c语言来编写呢,

我们先来分析一下扫雷的运行逻辑,

首先,用户在进来时需要我们给与一个菜单,以供用户选择,

然后我们来完善一下,写出用户输入后对应要进行的内容,

game函数就是我们要写的扫雷的具体操作了,

首先我们来分析一下扫雷游戏的运行原理,

扫雷需要一个表格,可能是9*9,也可能是15*15,我们就拿9*9举例,

我们首先需要对这个9*9的表格进行埋雷,那用什么来代表我这个格子是不是雷呢,

我们可以用两个不同的字符来代替,我们假设’1‘为雷,’0‘没有雷,

转化为程序语言,表格我们用二维数组,埋雷用rand函数(rand函数在之前的文章中有讲述,没有学过的同学可以看一下,在“小游戏-猜数字”中)。

下面是我们的9*9棋盘,0代表还没有埋雷,

000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000

下面我们随即在其中埋几个雷,

000000000
000101000
010000000
000100000
000000000
001010001
000000000
000010000
001000000

雷埋好了,我们就要开始排雷了,

假如用户点击这个格子,如果没有雷,我们显示周围八个格子中的雷的数量,有雷的话,我们结束游戏,并展示我们埋的雷的情况,

这个格子周围有两个雷,那么我们在这个格子显示为2,

下面,用户继续点击其他格子进行排雷,

这个格子改为1,这个时候就会发现问题

如果用户接下来选择红色格子怎么办,灰色格子是我们更改后的雷的数量,并不代表这里有雷,这里就出现歧义了,那么我们现在应该怎么办呢?我们可以另外开辟一个表格来存放用户扫雷得到的信息,

设置数组大小的时候我们要注意一个点,当用户点到边缘的格子时,周围就不是八个格子了,这时我们去访问就会有越界的情况出现,

那这个时候我们应该怎么办呢,

我们可以在外面再加一圈,变成11*11的表格,但是在埋雷和让用户选择的时候不使用最外层,

00000000000
00000000000
00001010000
00100000000
00001000000
00000000000
00010100010
00000000000
00000100000
00010000000
00000000000

这个时候我们再去访问就不会有越界的情况了,而且在查雷的数量时,也不会有影响,

分析的差不多了,那么我们现在来把想法转换成代码,

我们新建两个文件,一个头文件,一个.c文件,我们声明两个变量放在.h头文件中,

那么我们想要在源.c中用的话就要在源.c中包含头文件#include“扫雷.h",同时我们设置出两个数组,

这里有疑问的朋友可以浏览一下我上面发布的那篇文章(文章标题:”在面对一个大型的代码,需要分文件编写的时候,应该怎么办呢;以及在编写出一个功能时,有人想要买这个功能,怎么在不给出源代码的情况下让买家可以使用这个代码功能呢?”),

下面我们开始埋雷,埋雷前,我们把两个数组初始化,下面的代码要注意都是写在了哪个文件中,

下面我将不再特意标明代码所处文件了,

初始化好后,我们开始随机埋雷,

雷布置完了,现在需要用户进行扫雷,但是扫之前,我们得让用户有选项来选择吧,我们把show棋盘打印给用户,

下面排查雷,

下面我们把游戏放到循环里,

下面我们把小错误改一下,并且完善一下我们的代码,

//源.c:
#define _CRT_SECURE_NO_WARNINGS 1

#include "扫雷.h"

void menu()
{
	printf("****************************\n");
	printf("*******   1 . play   *******\n");
	printf("*******   0 . exit   *******\n");
	printf("****************************\n");
}
 
void game()
{
	char mine[ROWS][COLS] = { 0 };//存放布置好雷的信息
	char show[ROWS][COLS] = { 0 };//存放排查出来的雷的信息用于显示
	//初始化棋盘 让mine棋盘埋好雷,show棋盘显示*
	//初始化mine棋盘
	//InitMine(mine, ROWS, COLS);
	//InitMine(show, ROWS, COLS);
	//在上面的代码中多增加一个实参,用于说明要初始化的内容
	InitMine(mine, ROWS, COLS,'0');
	InitMine(show, ROWS, COLS,'*');


	//打印show棋盘
	//Print(show, ROW, COL);//观察代码是否有问题

	//布置雷
	DisPlayBoard(mine, ROW, COL);
	//Print(mine, ROW, COL);
	Print(show, ROW, COL);

	//排查雷
	FindMine(mine, show, ROW, COL);
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		//菜单
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("--------    扫雷    --------\n");
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新输入\n");
				break;
		}
	} while (input);
}
//扫雷.h:
#pragma once

#include<stdio.h>

#define EASY_COUNT 10//雷的数量

#define ROW 9 //雷的行
#define COL 9 //雷的列


//防止访问时越界
#define ROWS ROW+2 
#define COLS COL+2 

//棋盘初始化
void InitMine(char board[ROWS][COLS], int rows, int cols,char set);

//打印棋盘
void Print(char board[ROWS][COLS], int row, int col);

//布置雷
void DisPlayBoard(char board[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//扫雷.c:
#define _CRT_SECURE_NO_WARNINGS 1


#include"扫雷.h"

//初始化mine棋盘均为字符‘0’
void InitMine(char board[ROWS][COLS], int rows, int cols,char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

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

//布置雷
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
	int x = 0, y = 0;//代表布置雷的横纵坐标
	for (int i = 1; i <= EASY_COUNT; i++)
	{
		x = rand() % ROW + 1;
		y = rand() % COL + 1;
		if (board[x][y] == '1')
		{
			i--;
		}
		board[x][y] = '1';
	}
}

//排查雷

int Count(char board[ROWS][COLS], int x, int y)
{
	return board[x - 1][y - 1] + board[x - 1][y]
		+ board[x - 1][y + 1] + board[x][y - 1]
		+ board[x][y + 1] + board[x + 1][y - 1]
		+ board[x + 1][y] + board[x + 1][y + 1]
		- 8 * '0'; //这里将字符转化为数值
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	//for (int i = 1; i <= row * col - EASY_COUNT; i++)
	int i = row * col - EASY_COUNT;
	while(i)
	{
		printf("请输入要排查雷的坐标:>");
		int x = 0, y = 0;
		scanf("%d%d", &x, &y);
		if (x <= row && y <= col && x>=1 && y>=1)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				
				break;
			}
			else
			{
				//统计mine中这个坐标周围有几个雷
				int count = Count(mine, x, y);
				show[x][y] = count + '0';//转化为字符
				Print(show, ROW, COL);
				i--;
			}
		}
		else
		{
			printf("请输入正确的坐标\n");
		}
	}
	if (i == 0)
	{
		printf("恭喜你!\n");
	}
	Print(mine, ROW, COL);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决方案Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.

文章目录 一、现象二、解决方案 一、现象 当安装好JDK跟neo4j&#xff0c;用neo4j.bat console来启动neo4却报错&#xff1a; 部分报错信息&#xff1a; Starting Neo4j. WARNING! You are using an unsupported Java runtime. Please use Oracle Java™ 11, OpenJDK™ 11 t…

Rust下载安装、卸载、版本切换、创建项目(包含指定版本的)

先声名一下&#xff0c;下面所说的版本号为xxxxx-x86_64-unknown-linux-gnu中xxxxx的部分。 下载安装 下载最新版本的Rust&#xff1a; curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installer重启shell 或者 按照提示 执行命令让环境变…

Day56-LNMP架构扩展为集群模式实战精讲

Day56-LNMP架构扩展为集群模式实战精讲 1. 企业级标准部署知乎产品wecenter1.1 部署知乎软件Wecenter 2. 企业级迁移数据库到独立服务器2.1 为什么要进行数据库的拆分2.2 数据库拆分架构演变过程&#xff0c;如下图所示2.3 数据库拆分环境规划2.4 数据库拆分架构详细步骤2.4 we…

Kafka broker

1. zk中存储的kafka信息 /kafka/brokers/ids存储了在线的broker id。 /kafka/brokers/topics/xxx/partitions/n/state存储了Leader是谁以及isr队列 /kafka/controller辅助Leader选举&#xff0c;每个broker都有一个controller&#xff0c;谁先在zk中注册上&#xff0c;谁就辅助…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一&#xff0c;在第七节中讲解了如何简洁的进行web程序部署和运行&#xff0c;这只是它的功能之一。在本节中&#xff0c;我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

二十、软考-系统架构设计师笔记-真题解析-2020年真题

软考-系统架构设计师-2020年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.按照我国著作权法的权利保护期&#xff0c;&#xff08; &#xff09;受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 解析&#xff1a; 答案&#xff1a; 2.假设某计算机的字长为32位&a…

爬虫入门系列-HTML基础语法

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单&#xff0c;但是呢&#xff0c;首先你需要了解一丢丢的html知识&#xff0c;然后再去使用bs4去提取&#xff0c;逻辑和编写难度就会非常简…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题&#xff0c;当我在sortedArrayToBST里面给root赋予初始值NULL之后&#xff0c;问题得到解决&#xff01; 理论上root是未初始化的变量&#xff0c;然后我进入insert函数之后&#xff0c;root引用的内容也是未知值&#xff0c;因此无法给原来的二叉…

如何使用半群、群论及格理论研究人机协同

在数学中&#xff0c;半群、群论和格理论都是重要的代数结构和数学分支&#xff0c;它们分别研究了不同类型的代数系统和结构。简单介绍一下它们的基本概念&#xff1a; 1、半群&#xff08;Semigroup&#xff09;&#xff1a; 半群是一个集合&#xff0c;配备了一个二元运算&a…

Linux:文件增删 文件压缩指令

Linux&#xff1a;文件增删 & 文件压缩指令 文件增删touch指令mkdir指令cp指令rm指令rmdir指令 文件压缩zip & unzip 指令tar指令 文件增删 touch指令 功能&#xff1a;touch命令参数可更改文档或目录的日期时间&#xff0c;包括存取时间和更改时间&#xff0c;或者新…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…

【JAVA】通过JAVA实现用户界面的登录

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

代码学习记录25---回溯算法最后一天

随想录日记part25【很难】 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.21 主要内容&#xff1a;回溯算法在之前的学习中已经熟练掌握&#xff0c;今天对其进行挑战并进行总结&#xff1a;1&#xff1a;重新安排行程 &#xff1b;2.N皇后 &#xff1b;3.解…

SpringJPA 做分页条件查询

前言: 相信小伙伴们的项目很多都用到SpringJPA框架的吧,对于单表的增删改查利用jpa是很方便的,但是对于条件查询并且分页 是不是很多小伙伴不经常写到. 今天我整理了一下在这里分享一下. 话不多说直接上代码: Controller: RestController public class ProductInstanceContr…

Java基础-正则表达式

文章目录 1.基本介绍2.正则底层实现1.matcher.find()完成的任务2.matcher.group(0)分析1.源代码2.解释&#xff08;不分组&#xff09;3.解释&#xff08;分组&#xff09; 3.总结 3.正则表达式语法1.基本介绍2.元字符的转义符号1.基本介绍2.代码实例 3.字符匹配符1.基本介绍2.…

洛谷day3

B2053 求一元二次方程 - 洛谷 掌握printf用法&#xff1b; #include <iostream> #include <cmath> using namespace std; double a,b,c; double delta; double x1,x2;int main() {cin>>a>>b>>c;delta b*b-4*a*c;if(delta>0){x1 (-bsqrt…

【前端寻宝之路】JavaScript初学之旅

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-azUa9yH16cRXQUxE {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

生产力工具|安装更新R软件(R、studio)

内容介绍&#xff1a; 安装R软件&#xff1a; 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导&#xff0c;选择安装路径&#xff0c;取消…

机器视觉定位点胶机系统工作原理分析

机器视觉&#xff0c;简而言之&#xff0c;即是通过机器来模拟人眼的视觉功能&#xff0c;执行测量与判断的任务。这一过程中&#xff0c;关键的角色是机器视觉产品&#xff0c;它们通常以CMOS或CCD的形式出现&#xff0c;负责将观察的目标转化为图像信号。这些信号随后被专用的…