扫雷游戏——数组和函数实现

news2024/10/5 20:44:22

扫雷游戏的功能说明

  • 使⽤控制台实现经典的扫雷游戏
  •  游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是9*9的格⼦
  •  默认随机布置10个雷
  • 可以排查雷
  • 如果位置不是雷,就显⽰周围有⼏个雷
  • 如果位置是雷,就炸死游戏结束
  • 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

简单介绍:在一个9*9的格子中,随机种10个雷。如果这个地方放置雷,就存放1,不是雷就存放0。通过输入坐标来排除雷 。

主体框架:我创建了3个文件,一个专门用来声明函数的头文件game.h、一个用来进行游戏数据的game.c和一个主体逻辑的saolei.c这三个文件。

棋盘:

这里出现了一个问题,假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数是1。
假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11是⽐较合适。

所以我创建了两个二维数组分别是mine和show。show数组显示棋盘,mine数组用来埋雷和统计周围雷的个数,同时将雷的个数传到show数组上面记录。

saolei.c文件

这个文件我用来编写游戏的主要框架。在main()函数中引入一个自定义函数text(),text()用来是否进行游戏,进入游戏就输入1,退出游戏就输入0,输入其他数字就提示重新选择。假如要进行多次游戏,这里我就采用了以do while循环。

void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束,退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
}

那么我们输入1呢,就开始进行游戏了。首先是创建了两个字符二维数组mine和show,这两个数组都是11*11的,避免之后在9*9的棋盘中出现越界的情况。之后就是对这两个数组进行初始化。我创建了一个专门用来初始化棋盘的函数InitBoard。因为要对mine和show数组都要初始化,所以这个函数要传递4个参数,分别要传递数组,行和列、要初始化的值。注意传参时要一一对应。

void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

接下来就是埋雷了,这里创建一个SetMine()函数,注意雷是在mine数组9*9上埋的。SetMine()函数传递3个参数,mine数组 行ROW和列COL。扫雷的精髓就是随机埋雷。这里就用到了上一次在猜数字游戏中讲到的rand和srand函数。不了解的可以去了解一下。当你输入的坐标不是雷(‘0’)就可以在这个位置上埋雷,埋上一个雷,雷的数量就减1,直到减为0,这里用一个while循环。

void SetMine(char arr[ROWS][COLS], int row, int col)
{
	int count = EASY;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

打印棋盘:创建一个DisplayBoard函数用来打印棋盘(打印的是show,你也不想让你埋的雷可以看见吧)。打印棋盘是为了方面后面输入坐标,可以先把坐标轴先打印出来。打印的棋盘是9*9的。

void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	printf("-----扫雷开始-----\n");
	int i = 0;
	//打印列
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

接下来就是排雷了。创建了一个FindMine()函数,这个函数要传递4个参数,分别是mine,show,ROW和COL。排雷的时候要注意输入坐标的有效性,要保证坐标在9*9的棋盘中有效。当这个坐标不是雷的时候,我们还要统计这个坐标周围一圈有多少个雷,并传递给show数组上显示出来。还要注意这个坐标是否被排查过了。当所有非雷坐标都被排查过了,那么你就胜利了。

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)
	{
		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");
					break;
				}
				else
				{
					//找出周围有几个雷
					int count = GetMine(mine, x, y);
					//数字转字符
					show[x][y] = count + '0';
					DisplayBoard(show, ROW, COL);
					win++;
				}
			}
			else
			{
				printf("该坐标已经被排查了\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入坐标\n");
		}
	}
	if (win == row * col - EASY)
	{
		printf("恭喜你,胜利了!\n");
	}
}

那么呈上扫雷游戏的全部代码:

game.h:

#pragma once

//头文件
#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 10

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

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

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

//排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c:

#define _CRT_SECURE_NO_WARNINGS 1

//游戏数据
#include "game.h"

void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	printf("-----扫雷开始-----\n");
	int i = 0;
	//打印列
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char arr[ROWS][COLS], int row, int col)
{
	int count = EASY;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

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)
	{
		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");
					break;
				}
				else
				{
					//找出周围有几个雷
					int count = GetMine(mine, x, y);
					//数字转字符
					show[x][y] = count + '0';
					DisplayBoard(show, ROW, COL);
					win++;
				}
			}
			else
			{
				printf("该坐标已经被排查了\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入坐标\n");
		}
	}
	if (win == row * col - EASY)
	{
		printf("恭喜你,胜利了!\n");
	}
}

int GetMine(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int count = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		int j = 0;
		for (j = y - 1; j <= y + 1; j++)
		{
			//字符转数字
			count += (mine[i][j] - '0');
		}
	}
	return count;
}

saolei.c:

#define _CRT_SECURE_NO_WARNINGS 1


#include "game.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 };

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');

	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);

	//打印棋盘
	DisplayBoard(show, ROW, COL);

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

}

void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束,退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

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

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

相关文章

域名缩短平台搭建

前言 当自己搭建的项目和网站相关文章的链接过长&#xff0c;可以参考一下本文搭建的平台 遵纪守法&#xff0c;不要乱缩网址。 代码&#xff1a; https://github.com/dyanst/shorturlhttps://github.com/dyanst/shorturl shorturl-main.zip官方版下载丨最新版下载丨绿色版…

Linux(linux版本 centos 7) 下安装 oracle 19c详细教程(新手小白易上手)

一、安装前准备 1、下载预安装包 wget http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm预安装包下载成功 2、下载oracle安装包 下载地址如下 https://www.oracle.com/cn/database/technologies…

Maven命令运行单元测试

使用idea开发多模块项目时,有时别的模块编译不通过会导致不能运行单元测试,这是我们可以使用maven命令来运行单元测试 格式 mvn -DtestDingTalkTest#getAllUsers 命令说明 mvn -Dtest 固定格式 DingTalkTest 单元测试类名 getAllUsers 单元测试方法 单元测试类和单元测试方法…

【LUA】mac状态栏添加天气

基于网络上的版本修改的&#xff0c;找不到出处了。第一个摸索的lua脚本&#xff0c;调了很久。 主要修改&#xff1a;如果风速不大&#xff0c;就默认不显示&#xff0c;以及调整为了一些格式 local urlApi http://.. --这个urlApi去申请个免费的就可以了 然后打开对应的json…

云轴科技ZStack成为交通运输业上云用云推进中心首批成员单位

近日&#xff0c;中国信息通信研究院、中国交通运输协会信息专业委员会联合发起成立“交通运输业上云用云推进中心”&#xff0c;上海云轴信息科技有限公司&#xff08;简称云轴科技ZStack&#xff09;凭借优秀的产品技术创新能力和在交通运输领域的实践经验成为首批成员单位并…

《安富莱嵌入式周报》第331期:单片机实现全功能软件无线电,开源电源EEZ升级主控,ARM 汇编用户指南,UDS统一诊断服务解析,半导体可靠性设计手册

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 目录&#xff1a; 1、单片机实现低配版全功能软件无线电&#xff0c;范围0.5-30 MHz&#xff0c;支持SSB、AM、FM和CW …

浅谈电气火灾监控系统应用在某地铁车站

安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;根据国家有关规范对建筑电气火灾监测系统设置的要求&#xff0c;结合当地城市地铁供配电方案的特点&#xff0c;介绍了地铁站电气火灾监测系统设置方案&#xff0c;从电气火灾探测器的选择和位置设置、电气火灾监测设备…

Java项目:SSM框架基于spring+springmvc+mybatis实现的心理预约咨询管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm823基于SSM框架的心理预约咨询管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

WWDG喂狗

3F 是0111111 40 是1000000 0X7F 127 0X5F 95 127-9532 注意:中断是在0x40,在0x40喂狗则程序不会复位 在0x5F之前喂狗会复位,减小到63以下也会复位 在0x5F与0x3F之间喂狗会继续执行,不会复位 WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄//初始化窗口看门狗…

Java接收curl发出的中文请求无法解析

最近做项目遇到了这种情况&#xff0c;Java接收curl发出的中文请求无法解析&#xff0c;英文请求一切正常&#xff0c;中文请求则对方服务器无法解析&#xff0c;可以猜测是中文导致的编码问题&#xff0c;但是奇怪的是&#xff0c;本地输出json也没有乱码&#xff0c;编解码正…

洛谷刷题-【入门2】分支结构

目录 1.苹果和虫子 题目描述 输入格式 输出格式 输入输出样例 2.数的性质 题目描述 输入格式 输出格式 输入输出样例 3.闰年判断 题目描述 输入格式 输出格式 输入输出样例 4.apples 题目描述 输入格式 输出格式 输入输出样例 5.洛谷团队系统 题目描述 …

【数学笔记】一元n次不等式,分式不等式,绝对值不等式

不等式 基本性质 一元n次不等式一元二次不等式一元高次不等式分式不等式绝对值不等式 基本性质 性质 a > b ⇔ b < a a>b\Leftrightarrow b<a a>b⇔b<a a > b , b > c ⇒ a > c a>b,b>c\Rightarrow a>c a>b,b>c⇒a>c a > b ,…

Hbuilder从gitlab上面拉取项目

要先下载TortoiseGit-2.15.0.0-64bit这个软件 在HBuilder中从GitLab上拉取项目&#xff0c;请按照以下步骤操作&#xff1a; 1. 打开HBuilder&#xff0c;点击左上角的“文件”菜单&#xff0c;然后选择“新建”->“项目”。 2. 在弹出的对话框中&#xff0c;选择“从Git导…

redis主从复制薪火相传

一.主从复制 1、是什么 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 2、能干嘛 读写分离&#xff0c;性能扩展&#xff08;主 写 从 读&#xff09; 容…

Spring Boot使用七牛云

一、引入和配置 //maven配置 <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.7.0</version> </dependency>#七牛云application.yml配置 qiniu:# 配置accessKeyaccessKey: &qu…

【Spring 篇】Maven私服:解锁项目构建新世界

嗨&#xff0c;亲爱的读者朋友们&#xff01;今天我们要探讨的话题是 Maven 私服。也许你已经听说过它&#xff0c;但是不知道如何入门&#xff0c;或者只是对它有一些模糊的认知。别担心&#xff0c;本篇博客将手把手地带你深入探索 Maven 私服的神秘世界。 什么是 Maven 私服…

无限学模式-“重塑科研学习路径:ChatGPT应用实战课,开启高效率、高创新的科研之旅!“

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…

k8s中netty服务器容器tcp连接数量优化

netty的http1服务器在运行一段时间后会无法提供服务&#xff0c;返回客户端socket hang up 使用apipost测试抓包显示三次握手后被reset&#xff0c;经查是连接数过多 ps&#xff1a;客户端使用了大量短连接&#xff0c;如果能改成长连接就会消耗更少的连接&#xff0c;但是客户…

如何在Excel中隐藏部分数字或文本?这里提供几个方法

假设你有一张关于员工的一般信息表&#xff0c;但有些是私人的&#xff0c;比如社会安全号码。现在你想隐藏这些社会安全号码的一部分&#xff0c;如下截图所示&#xff0c;你如何快速解决它&#xff1f; 使用单元格格式部分隐藏 若要在Excel中隐藏部分社会保障号码&#xff…

PCIE 4.0 Equalizaiton(LTSSM 均衡流程)

均衡 在Tx端有FFE&#xff08;Feed Forward Equalizer&#xff0c;前馈均衡器&#xff09;&#xff1b;在Rx端有&#xff1a;CTLE&#xff08;Continuous Time Linear Equalizer&#xff0c;连续时间线性均衡器&#xff09;和DFE&#xff08;Decision Feedback Equalizer&…