扫雷【C语言】

news2024/11/24 23:05:50

用C语言实现一个9X9的扫雷

test.c   测试部分

game.c  游戏实现部分

game.h   游戏声明部分

菜单部分

 游戏部分

游戏部分包括创建一个扫雷的区域,在其中埋雷,玩家进行扫雷,判断扫雷是否成功

这里我i们定义行列,便于以后将其修改为其他格式的扫雷

创建扫雷区域

因为我们扫雷如果扫到的不是类雷会返回该点周围雷的个数,如果扫到的区域位于扫雷区域的边界,我们返回容易出出现越界访问,所以这里我们定义一个比扫雷区域大一圈的是最优的,比如这里我们需要实现的是9X9的区域,那么我们定义一个11X11的区域是最佳的,这里我们也定义行列,便于日后修改

 扫雷我们将雷所在位置设为1,不是雷设置为0,但是我们还需要展现给玩家每步所扫出来的结果,所以这里我们需要定义两个二位数组,一个存储雷的位置,另一个展现给玩家看

 打印区域

我们需要将区域展现给玩家看,让玩家进行游戏

 埋雷

RAY是雷的个数,这里定义便于以后修改

 排雷

这里我们需要加一个循环条件,当排雷次数达到总共可以排的次数减去雷的个数,即退出循环,否则继续排雷,添加一个变量win,当win==ROW*COL-RAY,即退出循环

求周围雷综合和的函数getray

 

一个排查点的周围雷的个数如图,此排查点雷的个数为2,根据他们的坐标我们可以写出函数,得到雷的个数

 

得到雷的个数后我们需要将show数组中这一位改成这个值,我们可知

' 1 ' =1+ ' 0 '

所以可以写出count+’ 0 ‘

 

完整代码

game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define RAY 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void init(char arr[ROWS][COLS], char ch);
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void printboard(char arr[ROWS][COLS], int rows, int cols);
void burry(char arr[ROWS][COLS], int rows, int cols);
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
int  getray(char mine[ROWS][COLS], int x, int y);

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu();
void game();
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;
}

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 };
	//初始化区域
	initboard(mine, show, ROWS, COLS);
	//打印区域
	printboard(show, ROWS, COLS);
	//埋雷
	burry(mine, ROWS, COLS);
	//排雷
	playboard(mine,show, ROWS, COLS);
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init(char arr[ROWS][COLS], char ch)
{
	int i = 0, j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ch;
		}
	}
}

void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	init(mine, '0');
	init(show, '*');
}

void printboard(char arr[ROWS][COLS], int rows, int cols)
{ 
	printf("******扫雷*******\n");
	int i = 0, j = 0;
	for (i = 0; i <= cols - 2; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= rows-2; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= cols-2; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

void burry(char arr[ROWS][COLS], int rows, int cols)
{
	int count = RAY;
	while (count)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	int x = 0, y = 0;
	int win = 0;
	while (win<ROW*COL-RAY)
	{
		printf("请输入要排查的坐标>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= rows - 2 && y >= 1 && y <= cols - 2)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				printboard(mine, ROWS, COLS); 
				break;
			}
			else
			{
				int count1 = getray(mine,x,y);
				show[x][y] = count1 + '0';
				printboard(show, ROWS, COLS);
				win++;
			}
		}
		else
		{
			printf("坐标有误,请重新输入\n");
		}
	}
	if (win == ROW * COL - RAY)
	{
		printf("恭喜你,排雷成功\n");
		printboard(mine, ROWS, COLS);
	}
}

int  getray(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = -1; i <= 1; i++)
	{
		for (j = -1; j <= 1; j++)
		{
			if ('1' == mine[x + i][y + j])
				count++;
		}
	}
	return count;
}

升级优化版(展开)

 代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init(char arr[ROWS][COLS], char ch)
{
	int i = 0, j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ch;
		}
	}
}

void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	init(mine, '0');
	init(show, '*');
}

void printboard(char arr[ROWS][COLS], int rows, int cols)
{ 
	printf("********扫雷*********\n");
	int i = 0, j = 0;
	for (i = 0; i <= cols - 2; i++)
	{
		printf(" %d |", i);
	}
	printf("\n----------------------------------------");
	printf("\n");
	for (i = 1; i <= rows-2; i++)
	{
		printf(" %d |", i);
		for (j = 1; j <= cols-2; j++)
		{
			printf(" %c |", arr[i][j]);
		}
		printf("\n");
		for (j = 0; j <= cols - 2; j++)
		{
			printf("----");
		}
		printf("\n");
	}
}

void burry(char arr[ROWS][COLS], int rows, int cols)
{
	int count = RAY;
	while (count)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	int x = 0, y = 0;
	int win = 0;
	while (win<ROW*COL-RAY)
	{
		printf("请输入要排查的坐标>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= rows - 2 && y >= 1 && y <= cols - 2)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				printboard(mine, ROWS, COLS); 
				break;
			}
			else
			{
				open(mine, show, x, y);
				printboard(show, ROWS, COLS);
				win++;
			}
		}
		else
		{
			printf("坐标有误,请重新输入\n");
		}
	}
	if (win == ROW * COL - RAY)
	{
		printf("恭喜你,排雷成功\n");
		printboard(mine, ROWS, COLS);
	}
}

int  getray(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = -1; i <= 1; i++)
	{
		for (j = -1; j <= 1; j++)
		{
			if ('1' == mine[x + i][y + j])
				count++;
		}
	}
	return count;
}

void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	if (x >= 1 && x <= ROWS - 2 && y >= 1 && y <= COLS - 2)
	{
		int count = getray(mine, x, y);
		if (count == 0)
		{
			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] == '*' && (i != x || j != y))
					{
						open(mine, show, i, j);
					}
				}

			}
		}
		else
		{
			show[x][y] = count + '0';
		}
	}
}
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define RAY 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void init(char arr[ROWS][COLS], char ch);
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void printboard(char arr[ROWS][COLS], int rows, int cols);
void burry(char arr[ROWS][COLS], int rows, int cols);
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
int  getray(char mine[ROWS][COLS], int x, int y);
void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu();
void game();
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;
}

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 };
	//初始化区域
	initboard(mine, show, ROWS, COLS);
	//打印区域
	printboard(show, ROWS, COLS);
	//埋雷
	burry(mine, ROWS, COLS);
	//排雷
	playboard(mine,show, ROWS, COLS);
}

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

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

相关文章

2023.05.12-使用Transformers Agents来一键调用千万个AI模型

1. 简介 简单来说&#xff0c;就是以前想要实现某一个AI功能&#xff0c;需要自己去网上搜索对应的模型、下载对应的权重才能使用。现在可以把中间的这些个环节都砍了&#xff0c;我们只需要告诉模型我们想要对某段文字或者某张图片进行什么操作&#xff0c;transformer就会自…

【经验贴】项目风险管理的有效方法

你遇见过“最奇葩”的项目风险是什么&#xff1f; 中级项目经理小李&#xff1a;我比较幸运? 项目一开始发现客户的需求不太明确&#xff0c;就识别出可能会有范围无限蔓延的风险&#xff0c;制定了一系列的应对措施&#xff0c;不出所料出了问题&#xff0c;最终还是将风险遏…

springboot整合redis,MongoDB,Elasticsearch(ES)

目录 springboot整合redis 连接Redis 字符串操作 哈希表操作 列表操作 集合操作 有序集合操作 lettcus与jedis的区别 springboot整合MongoDB 新增数据 查询数据 更新数据 删除数据 springboot整合Elasticsearch&#xff08;ES&#xff09; 创建ElasticsearchRepo…

区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRCNN…

Redis数据热迁移

1、redis数据热迁移&#xff0c;先通过redis-shake工具实现。 2、再通过redis-full-check检查迁移后的数据是否想同。 3、redis-shake版本下载&#xff1a; https://github.com/tair-opensource/RedisShake/releases 4、redis-full-check版本下载&#xff1a; https://github.c…

更简单的存和取bean

注解&#xff08;更简单存bean和取bean&#xff09;更简单的存bean&#xff08;使用类注解&#xff09;方法注解更简单的获取bean 注解&#xff08;更简单存bean和取bean&#xff09; 注解&#xff1a;声明和表示这个类或方法有某个能力。servlet的Web注解&#xff1b;实现路由…

2000多套微信小程序源码-史上最全的不同行业的源码集合

前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 很多伙伴学习小程序不知怎么开始&#xff0c;我准备了2000多套小程序源码&#xff0c;基本覆盖各个行业&#xff0c;大家有需要的可以借鉴学习~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

“数字人交互,与虚拟的自己互动”——用PaddleAvatar打造数字分身,探索人机交互的未来

“数字人交互&#xff0c;与虚拟的自己互动”——用PaddleAvatar打造数字分身&#xff0c;探索人机交互的未来 你是否曾经幻想过与自己的虚拟人交互&#xff1f;现在&#xff0c;使用PaddleAvatar&#xff0c;您可以将自己的图像、音频和视频转化为一个逼真的数字人视频&#…

Spring Cloud Alibaba--Nacos集群配置

文章目录 一、Nacos持久化配置二、Nacos集群配置三、避坑指南集群端口号冲突问题内存不足&#xff0c;无法启动的问题 一、Nacos持久化配置 Nacos默认自带的是嵌入式数据库derby&#xff0c;Nacos采用了集中式存储的方式来支持集群化部署&#xff0c;目前只支持MySQL的存储。 …

Goby 漏洞更新 |secnet-智能路由系统 actpt_5g.data 信息泄露

漏洞名称&#xff1a;secnet-智能路由系统 actpt_5g.data 信息泄露 English Name&#xff1a;secnet Intelligent Router actpt_5g.data Infoleakage CVSS core: 7.5 影响资产数&#xff1a;71768 漏洞描述&#xff1a; secnet安网智能AC管理系统是广州安网通信技术有限公…

mysql错误:2059 - Authentication plugin ‘caching_ sha2_password‘ cannot be loaded:

这个错误是因为MySQL数据库使用了 caching_sha2_password 插件进行身份验证&#xff0c;而该插件需要 MySQL 8.0.4 及以上版本的 MySQL 客户端才能够使用。 如果你使用的是旧版本的 MySQL 客户端&#xff0c;可以考虑升级到 MySQL 8.0.4 或更高版本。如果升级不是一个可行的选…

Windows重启mysql的方法(快速简单)

目录 一、背景 二、操作步骤 错误做法 正确做法 一、背景 有时候修改了数据库&#xff0c;但是MySQL数据库内容有延迟缓存&#xff0c;那么就需要重启一下数据库去解决问题 二、操作步骤 错误做法 直接去cmd命令里面输入net stop mysql这样停止&#xff0c;这样很可能…

【C++初阶】C++模版(进阶)

文章目录 前言一、非类型模板参数二、模板的特化概念函数模板特化类模板特化1.全特化3.偏特化 三、模板分离编译什么是分离编译模板的分离编译解决方法 模板总结 前言 前边我们讲解了模版初阶的内容&#xff0c;对泛型编程&#xff0c;函数模版&#xff0c;类模板有了一定的认…

上海亚商投顾:沪指失守3300点关口 AI应用方向大幅调整

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日集体调整&#xff0c;尾盘均跌超1%&#xff0c;沪指失守3300点关口&#xff0c;日线录得4连阴走势。游…

IS210AEPSG1AFC磁场由串联励磁绕组和并联励磁的组合提供

​ IS210AEPSG1AFC磁场由串联励磁绕组和并联励磁的组合提供 复合发生器 在这种类型中&#xff0c;磁场由串联励磁绕组和并联励磁的组合提供&#xff0c;并联磁场有许多圈数的导线&#xff0c;但它只承载小电流&#xff0c;而串联励磁绕组有几圈粗线并承载负载电流 串联励磁绕组…

【JAVAEE】线程池基础知识⭐

目录 1.什么是线程池 2.为什么要使用线程池 3.怎么使用线程池 4.自定义一个线程池 5.为什么不推荐使用系统自带的线程池 5.1线程池构造方法的参数和含义 5.1.1拒绝策略 5.2线程池的工作原理 5.3为什么不适用系统自带的线程池 补充&#xff1a;工厂模式 1.什么是线程池…

stm32 74hc595外扩io 调试记录

本文使用的测试代码如下 (1条消息) stm3274hc595外扩io调试工程&#xff0c;软件代码2片74hc595级联外扩IO资源-CSDN文库 有个项目对成本比较敏感&#xff0c;又想用ST的片子&#xff0c;输出管脚比较多&#xff0c;就考虑外扩IO&#xff0c;也有一些外扩IO的片子但是用下来成…

视频理解AI模型分类与汇总

人工智能领域视频模型大体也经历了从传统手工特征&#xff0c;到卷积神经网络、3D卷积网络、双流网络、transformer的发展脉络。 视频的技术大多借鉴图像处理技术&#xff0c;只是视频比图片多了一个时间维度。 下面内容先简单汇总下&#xff0c;后续再逐渐补充。 1. 双流网…

DS200SLCCG1AFG随着频率的增加而增加。具有高 Dk 的基材将具有高 Df。

​ DS200SLCCG1AFG随着频率的增加而增加。具有高 Dk 的基材将具有高 Df。 Df 耗散因数&#xff08;又名损耗角正切&#xff09; Df 测量由于电阻加热而损失了多少功率。PCB 基板形成电容器作为绝缘体&#xff0c;导体通常位于两侧。作为电容器&#xff0c;它会表现出容抗&#…

MySQL---聚合函数、字符串函数、数学函数、日期函数

1. 聚合函数 数据准备&#xff1a; create database mydb4; use mydb4;create table emp(emp_id int primary key auto_increment comment 编号,emp_name char(20) not null default comment 姓名,salary decimal(10,2) not null default 0 comment 工资,department char(20…