【C language】扫雷

news2024/9/22 1:13:46

目录

  • 1.概要
  • 2.实现核心思想
  • 3.实现过程
    • 3.1游戏框架
    • 3.2游戏逻辑
      • 初始化棋盘 MineInit
      • 打印棋盘 MinePrint
      • 设置雷 SetMines
      • 扫雷 ClearMines
  • 4.总结

1.概要

为了提高C初学者对C语言基本语法的掌控能力,一个极简版的扫雷游戏是十分适合锻炼代码能力的。下面分享仅用数组、函数这些C语言基本语法实现的一个小游戏——“Minesweeper”。

我需要说明的是仅仅是用来练习简单C语言基础语法代码能力的,而并非去尽力完善这个游戏,当然自己有时间有能力也可以去自己完善一下。

2.实现核心思想

用两个二维数组,一个数组用来对外展示,我们称之为show,另一个mine数组记录"雷"与"非雷"。

  • 对于show数组,默认是’*'状态,用来模拟未扫描的区域;倘若已经扫过了,且没有雷我们将其替换为该位置周围雷的数量。
  • 对于mine数组,我们’0’标识非雷,'1’标识雷。
    在这里插入图片描述
    同时,因为要在下文统计到某个位置周围雷的个数,为了防止数组越界,因而对该棋盘周围多加一圈。
    在这里插入图片描述

3.实现过程

我们设计的小游戏,整体用三个文件来进行设计的。

  • game.c文件:用来实现具体核心游戏函数
  • game.h文件:用来作为该游戏的小目录,包括一些宏定义和函数声明
  • Test.c文件:用来实现游戏的整体框架以及测试

3.1游戏框架

设计一个很简单的游戏框架是一个游戏设计的开始。该内容没有什么重点,略。

// Test.c文件中
void menu()
{
	printf("---------------------\n");
	printf("-----1.play game-----\n");
	printf("-----0.exit game-----\n");
	printf("---------------------\n");
}

TestGame()
{
	srand((unsigned int)time(0));
	int input = 0;
	do
	{
		menu();
		printf("Input options, please:\n");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			printf("Minesweeper begins!\n");
			game();
			break;
		case 0:
			printf("Successfully exited the game\n");
			break;
		default:
			printf("The input value is invalid\n");
			break;
		}
	} while (input);
}

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

实现好了游戏的整体框架,我们要来想一想这个游戏该怎么做了。

3.2游戏逻辑

  • 初始化棋盘:首先我们得准备两个二维数组来当作棋盘,并初始化其值。
  • 打印show棋盘:打印要对外展示的棋盘。
  • 设置雷:在mine棋盘中设置雷,用’1’进行标识
  • 扫雷:玩家输入坐标并接收,然后作出反馈

然后对于我们要在上面框架中写的game(),我们就得出下面游戏逻辑:

#include"game.h"

void game()
{
	char Mine[ROWS_MAX][COLS_MAX];
	char show[ROWS_MAX][COLS_MAX];

	MineInit(Mine, ROWS_MAX, COLS_MAX, '0');
	MineInit(show, ROWS_MAX, COLS_MAX, '*');

	printf("----------Minesweeper interface-----------\n");
	//MinePrint(Mine, ROW_MAX, COL_MAX);
	MinePrint(show, ROW_MAX, COL_MAX);

	SetMines(Mine, ROW_MAX, COL_MAX);

	ClearMines(Mine, show, ROW_MAX, COL_MAX);
}

具体的game.h文件内容如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

#define ROW_MAX 9
#define COL_MAX 9
#define ROWS_MAX ROW_MAX + 2
#define COLS_MAX COL_MAX + 2
#define MINE_COUNT 5

void MineInit(char(*arr)[COLS_MAX], int rows, int cols, char val);
void MinePrint(char(*arr)[COLS_MAX], int row, int col);
void SetMines(char(*arr)[COLS_MAX], int row, int col);
void ClearMines(char(*Mine)[COLS_MAX], char(*Show)[COLS_MAX], int row, int col);

初始化棋盘 MineInit

那如何进行初始化棋盘呢?因为有两个棋盘,一个需要置0,另一个需要置✳

这里需要指出的是不需要写两个函数哈,只需要把需要初始化的值当作参数传入函数里就可以通过一个函数来处理了。

void MineInit(char(*arr)[COLS_MAX], int rows, int cols, char val)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			*(*(arr + i) + j) = val;
		}
	}
}

打印棋盘 MinePrint

对棋盘里的值进行打印即可,双重嵌套循环即可。

其中,第一个循环是为了打印显示中的行号。

void MinePrint(char(*arr)[COLS_MAX], int row, int col)
{
	for (int i = 0; i <= col; 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 ", *(*(arr + i) + j));
		}
		printf("\n");
	}
	printf("----------Minesweeper interface-----------\n");
}

设置雷 SetMines

这里用一个随机数即可,需要注意设置雷的条件是之前不是雷才行,重复设置(同一位置)的不算。

void SetMines(char(*arr)[COLS_MAX], int row, int col)
{
	size_t count = 0;

	while (count < MINE_COUNT)
	{
		int x = rand() % 9 + 1;
		int y = rand() % 9 + 1;

		if (*(*(arr + x) + y) == '0')
		{
			*(*(arr + x) + y) = '1';
			count++;
		}
	}
}

扫雷 ClearMines

扫雷的话要一边展示show信息,一边接收用户输入的行号列号并给出对应的反馈即可。
这里需要注意的是拿到一个位置多少个雷后要用char的形式存入show中,而不是int的形式。

int GetMines(char(*Mine)[COLS_MAX], int x, int y)
{
	return (Mine[x - 1][y - 1] + Mine[x - 1][y] + Mine[x - 1][y + 1] + Mine[x][y - 1] + Mine[x][y + 1] + Mine[x + 1][y - 1] + Mine[x + 1][y] + Mine[x + 1][y + 1] - 8 * '0');
}

void ClearMines(char (*Mine)[COLS_MAX], char(*Show)[COLS_MAX], int row, int col)
{
	int sum = ROW_MAX * COL_MAX - MINE_COUNT;
	int count = 0;
	while (count < sum)
	{
		//MinePrint(Mine, row, col);
		MinePrint(Show, row, col);
		printf("Enter the coordinates you want to check\n");
		
		int x = 0, y = 0;
		scanf("%d%d", &x, &y);
		if (x >= 1 && y <= 9)
		{
			if (Mine[x][y] == '1')
			{
				printf("Sorry, you were killed.\n");
				printf("Below is the mine layout diagram for this game:\n");
				MinePrint(Mine, row, col);
				//MinePrint(Show, row, col);
				break;
			}
			else
			{
				int z_count = GetMines(Mine, x, y);

				if (Show[x][y] == '*') count++;
				else printf("This location has been scanned and is invalid.\n");
				Sleep(1000);
				Show[x][y] = z_count + '0';
				//MinePrint(Mine, row, col);
				MinePrint(Show, row, col);
			}
		}
		else
		{
			printf("The coordinates you entered are out of bounds\n");
		}
	}
	
	if (count == sum)
	{
		printf("Congratulations, the mine clearance was successful!!!\n");
	}
}

4.总结

整体来说,该游戏是用来复习基本语法知识的,比较简单,游戏逻辑清晰明了,功能单一,适合C初学者。


EOF

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

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

相关文章

14_Shell重定向输入输出

14_Shell重定向输入输出 输出重定向&#xff1a;一般情况&#xff0c;输出是在终端直接显示&#xff0c;改变输出位置&#xff0c;改变到文件中&#xff0c;这就是输出重定向 输入重定向&#xff1a;一般情况&#xff0c;输入是读取用户终端输入&#xff0c;改变输入位置&#…

026-GeoGebra中级篇-曲线(2)_极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、非线性动力系统的轨迹

除了参数曲线、隐式曲线和显式曲线之外&#xff0c;还有其他类型的曲线表示方法。本篇主要概述一下极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、和非线性动力系统的轨迹&#xff0c;可能没有那么深&#xff0c;可以先了解下。 目录 1. 极坐…

VScode:前端项目中yarn包的安装和使用

一、首先打开PowerShell-管理员身份运行ISE 输入命令&#xff1a; set-ExecutionPolicy RemoteSigned 选择“全是”&#xff0c;表示允许在本地计算机上运行由本地用户创建的脚本&#xff0c;没有报错就行了 二、接着打开VScode集成终端 输入 npm install -g yarn 再次输入以下…

IoT数据采集网关在企业应用中扮演的角色-天拓四方

随着物联网&#xff08;IoT&#xff09;技术的不断发展&#xff0c;越来越多的企业开始利用IoT技术实现智能化、自动化的生产和管理。在这个过程中&#xff0c;Iot数据采集网关作为连接物理世界与数字世界的桥梁&#xff0c;发挥着至关重要的作用。 IoT数据采集网关是一种硬件…

4.定时器

原理 时钟源&#xff1a;定时器是内部时钟源&#xff08;晶振&#xff09;&#xff0c;计数器是外部计时长度&#xff1a;对应TH TL计数器初值寄存器(高八位,低八位)对应的中断触发函数 中断源中断处理函数Timer0Timer0_Routine(void) interrupt 1Timer1Timer1_Routine(void) …

c++初阶知识——类和对象(中)

目录 1.类的默认成员函数 2.构造函数 3.析构函数 4.拷贝构造函数 5.运算符重载 5.1 赋值运算符重载 5.2 使用运算符重载等特性实现日期类 6.取地址运算符重载 6.1 const成员函数 6.2 取地址运算符重载 1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#…

网站开发:使用VScode安装yarn包和运行前端项目

一、首先打开PowerShell-管理员身份运行ISE 输入命令&#xff1a; set-ExecutionPolicy RemoteSigned 选择“全是”&#xff0c;表示允许在本地计算机上运行由本地用户创建的脚本&#xff0c;没有报错就行了 二、接着打开VScode集成终端 输入 npm install -g yarn 再次输入以…

防火墙双机热备带宽管理综合实验

拓扑图和要求如下&#xff1a; 之前的步骤可以去到上次的实验 1.步骤一&#xff1a; 首先在FW3防火墙上配置接口IP地址&#xff0c;划分区域 创建心跳线&#xff1a; 下面进行双机热备配置&#xff1a; 步骤二&#xff1a; 先将心跳线连接起来 注意&#xff1a;一定要将心跳…

Django select_related()方法

select_related()的作用 select_related()是Django ORM&#xff08;对象关系映射&#xff09;中的一种查询优化方法&#xff0c;主要用于减少数据库查询次数&#xff0c;提高查询效率。当你在查询一个模型实例时&#xff0c;如果这个实例有ForeignKey关联到其他模型&#xff0…

Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器

章节内容 上节我们完成了&#xff1a; ZNode的基本介绍ZNode节点类型的介绍事务ID的介绍ZNode实机测试效果 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff…

Python JSON处理:兼容性与高级应用

JSON&#xff08;JavaScript Object Notation&#xff09;作为当前最流行的数据传输格式&#xff0c;在Python中也有多种实现方式。由于JSON的跨平台性和简便易用性&#xff0c;它在数据交互中被广泛应用。本文将重点讨论如何熟练应用Python的JSON库&#xff0c;将JSON数据映射…

【区块链 + 智慧政务】中国铁塔区块链委托代征开票应用 | FISCO BCOS应用案例

中国铁塔是全球规模最大的通信铁塔基础设施服务提供者。通信塔站址点多面广&#xff0c;业主构成复杂&#xff0c;因此产生海量税务、合同、票据等信息。为进一步提高场租或供电取票的及时性和规范性&#xff0c;严格遵循税务相关的要求&#xff0c;中国铁塔采用国产开源联盟链…

python--实验12

目录 知识点 第一部分&#xff1a;文件概述 第二部分&#xff1a;文件的基本操作 第三部分&#xff1a;目录管理 第四部分&#xff1a;CSV文件读写 第五部分&#xff1a;openpyxl等模块 小结 实验 知识点 第一部分&#xff1a;文件概述 文件标识&#xff1a;找到计算机…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

【ARM】MDK-服务器与客户端不同网段内出现卡顿问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录不同网段之间的请求发送情况以及MDK网络版license文件内设置的影响。 2、 问题场景 客户使用很久的MDK网络版&#xff0c;在获取授权时都会出现4-7秒的卡顿&#xff0c;无法对keil进行任何操作&#xff0c;彻底…

Mac 如何安装vscode

Mac 电脑/ 苹果电脑如何安装 vscode 下载安装包 百度搜索vscode&#xff0c;即可得到vscode的官方下载地址&#xff1a;https://code.visualstudio.com/ 访问网页&#xff0c;点击下载即可。 下载完成后&#xff0c;得到下图所示的app。 将该 app 文件&#xff0c;放入到…

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子&#xff0c;ONNX内部没有&#xff0c;那么需要自己去实现。 1.1 配置环境 安装ONNX pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple 安装推理引擎ONNX Runtime pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/si…

基于STM32设计的超声波测距仪(微信小程序)(186)

基于STM32设计的超声波测距仪(微信小程序)(186) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择1.5 系统框架图…

WebSocket、服务器推送技术

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议&#xff0c;它可以让客户端和服务器之间进行实时的双向通信&#xff0c;且不存在同源策略限制 WebSocket 使用一个长连接&#xff0c;在客户端和服务器之间保持持久的连接&#xff0c;从而可以实时地发送和接收数据…

实现给Nginx的指定网站开启basic认证——http基本认证

一、问题描述 目前我们配置的网站内容都是没有限制&#xff0c;可以让任何人打开浏览器都能够访问&#xff0c;这样就会存在一个问题&#xff08;可能会存在一些恶意访问的用户进行恶意操作&#xff0c;直接访问到我们的敏感后台路径进行操作&#xff0c;风险就会很大&#xff…