c语言小游戏之扫雷

目录

一:游戏设计理念及思路

二:初步规划的游戏界面

三:开始扫雷游戏的实现

注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文件

2.为方便定位坐标,在展示数组时添加行号和列号

四:谢谢观看 


听说看到日落金山的人,接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

一:游戏设计理念及思路

1.扫雷游戏就是如平常战争片里见到的,工兵去布满雷的地区去一步步的排除雷,该游戏就简单模拟该场景。

2.该游戏是在9*9的81个格子中随机布置10个雷,然后通过排查坐标的形式慢慢排查出雷的位置

3.玩家通过输入要排查坐标的位置来开始扫雷,如该位置是雷的话,则玩家被炸死,游戏结束,反之该位置将显示周围8个坐标位置雷的数量,便于玩家继续思考排查

4.若排查完所有的无雷的71个坐标,则显示扫雷成功

二:初步规划的游戏界面

1.打开游戏便显示游戏菜单

通过玩家选择    1:玩游戏     0:退出游戏         其余数字均显示选择错误重新选择

2.开始玩游戏之后,显示9*9的一个布置好10个雷的棋盘,为了隐藏雷的信息,可以创建两个数组,mine数组用来存放雷的信息,show数组用来隐藏雷的信息,为方便起见,创建两个字符数组,mine数组用‘1’表示雷,‘0’表示无雷,show数组全部用‘*’来显示

3.如果要排查(8,0) 这个坐标的话,假设不是雷,那么就要统计周围雷的个数,会发现此时数组会越界访问,为防止这种情况的发生,我们应该创建个11*11的格子,并且全部初始化为‘0’,我们正式扫雷时只使用其中的9*9的格子进行游戏

4.当玩家扫雷被炸死或者扫雷成功之后显示mine数组中存放雷的信息

三:开始扫雷游戏的实现

注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文件
2.为方便定位坐标,在展示数组时添加行号和列号

3.     game.h

#pragma once
#include <stdio.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINECOUNT 10
#include <stdlib.h>
#include <time.h>
//初始化数组
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set);

//展示数组
void DisplayBoard(char arr[ROWS][COLS], int row, int col);

//在mine数组中随即设置10个雷的信息
void SetMine(char arr[ROWS][COLS], int row, int col);

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

//排查周围雷的数量
int GetMineCount(char mine[ROWS][COLS], int x, int y);

                                   test.c 

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
	printf("****************\n");
	printf("**** 1.play ****\n");
	printf("**** 0.exit ****\n");
	printf("****************\n");
}
void game()
{
	//创建11*11的两个字符数组  mine数组用来存放雷的信息,show数组用来展示排查雷的信息
	char mine[ROWS][COLS] = {0};
	char show[ROWS][COLS] = {0};
	//初始化数组,用'0'来初始化mine数组,用'*'来初始化show数组
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//展示数组
	//DisplayBoard(mine, ROW, COL);
	//DisplayBoard(show, ROW, COL);
	//在mine数组种随机设置10个雷
	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("请输入对应游戏选项的数字\n");
		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;
}

                                           game.c 

#define _CRT_SECURE_NO_WARNINGS
#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)
{
	int i = 0;
	printf("-----开始扫雷-----\n");
	for (i = 0; i <= row; 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 x = 0;
	int y = 0;
	int count = MINECOUNT;//雷的数量
	while (count)
	{
		x = rand() % row + 1;//随机生成下标
		y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';//用'1'来表示雷
		}
		count--;
	}
}
//排查周围雷的数量
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int ret = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		int j = 0;
		for (j = y - 1; j <= y + 1; j++)
		{
			ret += (mine[i][j] - '0');
		}
	}
	return ret;
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int count = row * col - MINECOUNT;
	int x = 0;
	int y = 0;
	int ret = 0;
	while (ret<count)
	{
		printf("请输入要排查坐标的数字\n");
		scanf("%d%*c%d", &x, &y);
		if (show[x][y] == '*')
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int ret=GetMineCount(mine, x, y);
				show[x][y] = ret + '0';
				DisplayBoard(show, ROW, COL);
			}
		}
		else
		{
			printf("该坐标已经被排查,请重新输入坐标\n");
		}
		ret++;
	}
	if (ret == count)
	{
		printf("恭喜你,扫雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}	
}

四:谢谢观看 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【立创EDA-PCB设计基础】5.布线设计规则设置

前言&#xff1a;本文详解布线前的设计规则设置。经过本专栏中的【立创EDA-PCB设计基础】前几节已经完成了布局&#xff0c;接下来开始进行布线&#xff0c;在布线之前&#xff0c;要设置设计规则。 目录 1.间距设置 1.1 安全间距设置 1.2 其它间距设置 2.物理设置 2.1 导…

枚举类型有着一篇足以

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字&#xff0c;enum叫枚举数据类型&#…

JavaScript基础之JavaScript引入方式

JavaScript引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;一般以下方式: 外部方式内部方式JavaScript元素事件通过JavaScript伪URL引…

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…

【射影几何11】完全四边形和交比研究

一、说明 对于交比的灵活应用&#xff0c;尚有许多情况需要讨论&#xff0c;首先引出完全四边形的例子&#xff0c;该关键词的应用非常普遍&#xff1b;其次&#xff0c;我们尝试用交比证明一些事实&#xff1b;随后我们又引出交比射影案例的特殊情况。 二、完全四边形 2.1 完…

Excel 动态可视化图表分享

AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作 PowerBI 商业智能 68集 数据库Mysql 8.0 54集 数据库Oracle 21C 142集 Office 2021实战应用 Python 数据分析实战&#xff0c; ETL Informatica 数据仓库案例实战 Excel 2021实操 100集&#xff0c; Excel 2021函数大全 80集 Exc…

SqlAlchemy使用教程(五) ORM API 编程入门

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 前一章用SQL表达式(SQL Expr…

Android:JNI实战,加载三方库、编译C/C++

一.概述 Android Jni机制让开发者可以在Java端调用到C/C&#xff0c;也是Android应用开发需要掌握的一项重要的基础技能。 计划分两篇博文讲述Jni实战开发。 本篇主要从项目架构上剖析一个Android App如何通过Jni机制加载三方库和C/C文件。 二.Native C Android Studio可…

高防IP如何保护服务器

首先我们要知道什么是高防IP~ 高防IP是指高防机房所提供的ip段&#xff0c;主要是针对互联网服务器遭受大流量DDoS攻击时进行的保护服务。高防IP是目前最常用的一种防御DDoS攻击的手段&#xff0c;用户可以通过配置DDoS高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防…

样品前处理国产微波消解罐的优势

国产微波消解罐参数&#xff1a; 型号 MARS5、MARS6等 内罐材质 TFM 外罐材质 宇航纤维复合材料 耐温 -200&#xff5e;260℃ 规格 25ml、55ml、75ml、100ml、110ml 厂家秉承 “客户、服务、技术”为根本的理念国产替代微波罐受到众多用户的青睐。 特性&#xff1a…

【LeetCode】每日一题 2024_1_21 分割数组的最大值(二分)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;分割数组的最大值题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天是 hard&#xff0c;难受&#xff0c;还好有题解大哥的清晰讲解 题目&a…

论文阅读:Vary论文阅读笔记

目录 引言整体结构图数据集构造Vary-tiny部分Document Data数据构造Chart Data构造Negative natural image选取 Vary-base部分 引言 论文&#xff1a;Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models Paper | Github | Demo 许久不精读论文了&#x…

文件操作与IO(3)

文件内容的读写--数据流 这里我们将要讲到文件操作中的重要概念--流. 之前也在C语言讲解中提到了文件流的概念---读写文件内容 分为这几步:(1)打开文件;(2)读/写文件;(3)关闭文件. 数据流主要分为字节流和字符流. 字节流:以字节为单位进行读写(代表:InputStream,OutputStrea…

20240122让WIN10在启动的时候进入安全模式

20240122让WIN10在启动的时候进入安全模式 2024/1/22 18:30 缘起&#xff1a;为了使用openai的whisper识别小语种【非英语】电影的字幕&#xff0c;决定开始折腾CUDA了&#xff01;https://github.com/openai/whisper https://www.bilibili.com/video/BV1d34y1F7qA https://www…

API协议设计的十种技术

文章目录 前言一、REST二、GraphQL三、gRPC&#xff08;google Remote Procedure Calls&#xff09;四、Webhooks五、服务端的事件发送——SSE&#xff08;Server-sent Events&#xff09;六、EDI&#xff08;Electronic Data Interchange&#xff09;七、面向API 的事件驱动设…

HarmonyOS NEXT 开发者必看“清单“就在这里!

随着HarmonyOS NEXT开启开发者预览版Beta招募&#xff0c;开发者可以体验到全面升级的 OS开放新能力、鸿蒙特征新场景、开发工具等。这是一项需要广大开发者一起参与的伟大事业&#xff0c;华为期待携手开发者一路同行&#xff0c;共赴鸿蒙生态的星辰大海。如何借助HarmonyOS N…

数据集笔记:UJIIndoorLoc

1 数据集介绍 UJIIndoorLoc - UCI Machine Learning Repository UJIIndoorLoc是一个多建筑多楼层的室内定位数据库&#xff0c;用于测试依赖于WLAN/WiFi指纹的室内定位系统。 2 数据读取 数据分类训练数据和测试数据 import pandas as pdapd.read_csv(Downloads/ujiindoo…

矩阵和矩阵如何相乘?

矩阵与矩阵相乘遵循特定的数学规则。为了相乘&#xff0c;第一个矩阵的列数必须等于第二个矩阵的行数。矩阵乘法的结果是一个新矩阵&#xff0c;其行数等于第一个矩阵的行数&#xff0c;列数等于第二个矩阵的列数。矩阵乘法不满足交换律&#xff0c;即 AB≠BA。 例子&#xff…

MySQL---多表分组查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

Mybatis 动态SQL条件查询(注释和XML方式都有)

需求 : 根据用户的输入情况进行条件查询 新建了一个 userInfo2Mapper 接口,然后写下如下代码,声明 selectByCondition 这个方法 package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*; import j…