迟来的扫雷游戏

news2025/4/7 19:29:01

今天我们讲如何用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.coloradmin.cn/o/1356328.html

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

相关文章

字节跳动 Spark 支持万卡模型推理实践

摘要&#xff1a;本文整理自字节跳动基础架构工程师刘畅和字节跳动机器学习系统工程师张永强在本次 CommunityOverCode Asia 2023 中的《字节跳动 Spark 支持万卡模型推理实践》主题演讲。 背景介绍 在云原生化的发展过程中 Kubernetes 由于其强大的生态构建能力和影响力&…

Consule安装与SpringBoot集成

Consule Consul 是由 HashiCorp 开发的一款软件工具&#xff0c;提供了一组功能&#xff0c;用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能&#xff1a; 服务发现&#xff1a;Consul…

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

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

seo分享:慎重使用蜘蛛池

其实要提高搜索引擎蜘蛛的来访次数&#xff0c;唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容&#xff0c;才能够提高蜘蛛的来访次数。如果本身内容更新不多&#xff0c;外部引流的蜘蛛过多&#xff0c;最终发现没什么内容索引&#xff0c;蜘蛛来访的次数也会…

express+mongoDB开发入门教程之mongoose使用讲解

系列文章 node.js express框架开发入门教程 expressmongoDB开发入门教程之mongoDB安装expressmongoDB开发入门教程之mongoose使用讲解 文章目录 系列文章前言一、Mongoose是什么&#xff1f;二、Mongoose安装三、Mongoose在express项目中使用步骤一、连接mongoDB数据库步骤二、…

网络路由跟踪工具

随着企业网络需求的增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、免费提供的实用…

C#中使用 async await TaskCompletionSource<T>实现异步逻辑同步写

Task、async 和 await 是 C# 中用于处理异步编程的关键概念。它们一起构成了异步编程的基础。 Task Task 是表示异步操作的抽象&#xff0c;它属于 System.Threading.Tasks 命名空间。Task 可以表示已经完成的任务、正在运行的任务或者尚未开始的任务。通过 Task&#xff0c;…

MySQL自定义时间间隔抽稀

MySQL自定义时间间隔抽稀 表设计数据如下按分钟抽稀按小时抽稀按天抽稀 表设计 create table monitor (tid varchar(255) not null,save_date datetime not null,tlevel decimal(10, 2) null,primary key (tid, save_date) );数据如下 按分钟抽稀 SELECT t2…

FLatten Transformer:聚焦式线性注意力模块

线性注意力将Softmax解耦为两个独立的函数&#xff0c;从而能够将注意力的计算顺序从(querykey)value调整为query(keyvalue)&#xff0c;使得总体的计算复杂度降低为线性。然而&#xff0c;目前的线性注意力方法要么性能明显不如Softmax注意力&#xff0c;并且可能涉及映射函数…

webapp下没有蓝点解决

解决方法&#xff1a; File->Project Structure 现在就是一个JavaWeb项目了。

华为云CES监控与飞书通知

华为云负载均衡连接数监控与飞书通知 在云服务的日常运维中&#xff0c;持续监控资源状态是保障系统稳定性的关键步骤之一。本文通过一个实际案例展示了如何使用华为云的Go SDK获取负载均衡器的连接数&#xff0c;并通过飞书Webhook发送通知到团队群组&#xff0c;以便运维人员…

2024 Nomachine 最简安装与使用指南

一、前言 二、Nomachine安装包的下载 1、Windows系统下Nomachine包的下载 2、Linux系统Nomachine的下载 &#xff08;1&#xff09;下载Nomachine安装包 &#xff08;2&#xff09;解压安装包 &#xff08;3&#xff09;添加权限 &#xff08;4&#xff09;下载安装包 三、在Wi…

基于GEC6818的点餐系统

本次项目开发环境&#xff1a;gec6818&#xff0c;QT5.14.2&#xff0c;SecureCRT。 所使用的相关技术&#xff1a;c/s架构&#xff0c;STL库&#xff0c;C封装&#xff0c;标准化代码编写 实现的功能&#xff1a;用户登录页面&#xff0c;食品分区在不同页面&#xff0c;用户…

2023海内外零知识证明学习资料汇总(二)(深入理解零知识证明篇)

工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面且有知识深度的web3开发工具、web3学习项目…

Java中关键词strictfp有什么作用?

在Java中&#xff0c;关键词strictfp用于声明一个方法、类或接口是严格遵守浮点数计算规范的。 具体作用包括&#xff1a; 保证浮点数计算的结果在不同平台上是一致的&#xff0c;避免由于浮点数计算的不精确性导致的结果不确定性。 指定了严格的浮点数计算规则&#xff0c;禁…

【机器学习基础】DBSCAN

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…

springboot实现用户操作日志记录

springboot实现用户操作日志记录 简介&#xff1a;之前写了《aop实现日志持久化记录》一文&#xff0c;主要介绍自定义aop标注方法上&#xff0c;通过切面方法对用户操作插入mysql。思路正确但是实际操作上存在一些小问题&#xff0c;本文将从项目出发&#xff0c;对细节进行补…

vue3+vant4 移动端软键盘弹出 收起导致项目样式布局错乱解决方案,亲测有效!!

问题描述 最近在做vue3 H5的移动端项目 我用的是vue3vant4&#xff0c;然后在使用过程中发现 小米14手机在点击密码输入框软键盘弹出 时会导致项目布局整体向上移动 导致页面布局错乱。 原因分析&#xff1a; 在移动端软键盘弹出收起时&#xff0c;导致项目样式布局错乱的原因…

内网DNS隐蔽隧道搭建之iodine工具

iodine iodine是基于C语言开发的&#xff0c;分为服务端和客户端。iodine支持转发模式和中继模式。其原理是&#xff1a;通过TAP虚拟网卡&#xff0c;在服务端建立一个局域网&#xff1b;在客户端&#xff0c;通过TAP建立一个虚拟网卡&#xff1b;两者通过DNS隧道连接&#xf…

前端开发加速器:十个VSCode插件精选

前端开发是一个不断发展的领域&#xff0c;随着技术的进步&#xff0c;工具也在不断更新。Visual Studio Code&#xff08;VSCode&#xff09;是前端开发者广泛使用的编辑器之一&#xff0c;得益于其强大的插件系统&#xff0c;可以帮助开发者提升工作效率。以下是十个对于前端…