控制台扫雷(C语言实现)

目录

  • 博文目的
  • 实现思路
  • 项目创建
    • 文件解释
  • 具体实现
    • 判断玩家进行游戏还是退出
    • 扫雷棋盘的确定
    • 地图初始化
    • 埋雷
    • 玩家扫雷的实现
    • 雷判断函数
  • 源码
    • game.c
    • game.h
    • 扫雷.c

博文目的

相信不少人都学习了c语言的函数,循环,分支那我们就可以写一个控制台的扫雷小游戏来检验自己学得如何。

在做一件事之前我们都要先考虑我们学要做哪些。同样要实现一个扫雷小游戏,我们首先要思考学要做什么。

实现思路

实现思路可以参考以下步骤:

  • 判断玩家进行游戏还是退出。

  • 将扫雷的棋盘确定。

  • 地图初始化。

  • 埋雷 。

  • 玩家扫雷的实现。

  • 对玩家扫的是不是雷判断,周围几颗雷判断

项目创建

在所有开始之前我们先建项目。
​​​​建项目

文件解释

对文件的解释如下:

  • 创一个头文件game.h里面放都要用到的头文件和参数。

  • 在game.c中实现我们的游戏逻辑。

  • 在扫雷.c中把游戏串起来。

具体实现

具体实现可以参考如下思路:

判断玩家进行游戏还是退出

使用一个menu函数将作为菜单打印。
在主函数中使用do-while循环来判断用户是玩还是退出。

void menu()
{
	printf("------------------------------\n");
	printf("----------1.play--------------\n");
	printf("----------0.exit--------------\n");
	printf("------------------------------\n");
}
int main()
{
	int a;
	do
	{
		menu();
		scanf("%d",&a);
	} while(a);
	return 0;
}

扫雷棋盘的确定

首先会先想到创建一个9 * 9的数组来表示棋盘。
9*9
但是我们就要考虑到判断周围雷个数时的判断,只创建9*9的棋盘,那在边界上的雷就不好判断周围有几颗雷,要判断就需要在写其他的判断方法不能与中间的判断方法统一了。

所以扩大一圈创建11 * 11的地图。
11*11

在头文件中使用宏定义出地图的长度和能访问的长度。

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

地图初始化

我们将代表地图的数组有雷的设为1,无雷的设为0。

想到这我们又会考虑到 什么代表雷呢,我们就以字符0代表没雷1代表有雷;
难道我们在控制台输出0 1吗,那还玩个屁啊。
因此我们应该还要创建一个地图来输出。

在扫雷.c文件中定义出两个数组,在game.c文件中写数组初始化函数。

//扫雷.c中封装函数
void game()
{
	char map1[ROWS][COLS];
	char map2[ROWS][COLS];
	init(map1, '0');
	init(map2, '*');
}
//game.c中初始化棋盘函数
void init(char a[ROWS][COLS], char ch)
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			a[i][j] = ch;
		}
	}
}

埋雷

我们要埋雷而且还要是随机的,那我们就要用到随机数生成函数,
如果我们像这样布置雷,随机数生成后会不会相等,让同一位置布置多个雷了?
所以我们要判断生成的是否已经埋雷。

//埋雷函数
void LayMine(char map1[ROWS][COLS])
{
	int count = MINE_NUMBER;
	srand((unsigned int)time(NULL));
	while(count)
	{ 
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (map1[x][y] == '0')
		{
			map1[x][y] = '1';
			count--;
		}
	}
}

玩家扫雷的实现

玩家在控制台上扫雷是通过坐标来输入,那我们打印棋盘时就去提供每个坐标,不然输入时要玩家自己一个一个数坐标,本来就玩的不爽,就更不爽了。

/打印棋盘
void Print(char map[ROWS][COLS])
{
	printf("=====扫雷===========\n");
	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 ", map[i][j]);
		}
		printf("\n");
	}
}

雷判断函数

对玩家扫的是不是雷判断,周围几颗雷判断 。

void FindMine(char map1[ROWS][COLS], char map2[ROWS][COLS])
{
	int count = 0;//记扫了几个雷
	while (count < MINE_NUMBER)
	{
		int x = 0, y = 0;
		printf("请输入需要排查的坐标 ");
		scanf("%d%d", & x, & y);
		if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))//确保用户输入正确坐标
		{
			if (map1[x][y] == '1')
			{
				printf("踩雷结束\n");
				Print(map1);
				break;
			}
			else
			{
				count--;
				int num = 0;
				for (int i = x - 1; i <= x + 1; i++)
				{
					for (int j = y - 1; j <= y + 1; j++)
					{
						if (map1[i][j] == '1')
						{
							num++;
						}
					}
				}
				map2[x][y] = num + '0';
				Print(map2);
			}

		}
		else
		{
			printf("错误输入\n");
		}
	}
	if (count == MINE_NUMBER)
	{
		printf("过关牛逼\n");
	}
}

源码

源码呈上:

game.c

game.c文件下的代码

# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化棋盘函数
void init(char a[ROWS][COLS], char ch)
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			a[i][j] = ch;
		}
	}
}

//埋雷函数
void LayMine(char map1[ROWS][COLS])
{
	int count = MINE_NUMBER;
	srand((unsigned int)time(NULL));
	while(count)
	{ 
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (map1[x][y] == '0')
		{
			map1[x][y] = '1';
			count--;
		}
	}
}

//打印棋盘
void Print(char map[ROWS][COLS])
{
	printf("=====扫雷===========\n");
	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 ", map[i][j]);
		}
		printf("\n");
	}
}
void FindMine(char map1[ROWS][COLS], char map2[ROWS][COLS])
{
	int count = 0;//记扫了几个雷
	while (count < MINE_NUMBER)
	{
		int x = 0, y = 0;
		printf("请输入需要排查的坐标 ");
		scanf("%d%d", & x, & y);
		if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))//确保用户输入正确坐标
		{
			if (map1[x][y] == '1')
			{
				printf("踩雷结束\n");
				Print(map1);
				break;
			}
			else
			{
				count--;
				int num = 0;
				for (int i = x - 1; i <= x + 1; i++)
				{
					for (int j = y - 1; j <= y + 1; j++)
					{
						if (map1[i][j] == '1')
						{
							num++;
						}
					}
				}
				map2[x][y] = num + '0';
				Print(map2);
			}

		}
		else
		{
			printf("错误输入\n");
		}
	}
	if (count == MINE_NUMBER)
	{
		printf("过关牛逼\n");
	}
}

game.h

game.h文件下的代码:

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>


#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUMBER 10

void init(char a[ROWS][COLS], char ch);
void LayMine(char map1[ROWS][COLS]);
void Print(char map[ROWS][COLS]);
void FindMine(char map1[ROWS][COLS], char map2[ROWS][COLS]);

扫雷.c

扫雷.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 map1[ROWS][COLS];
	char map2[ROWS][COLS];
	init(map1, '0');
	init(map2, '*');
	LayMine(map1);
	//Print(map1);
	Print(map2);
	FindMine(map1, map2);
}
int main()
{
	int a;

	do
	{
		menu();
		scanf("%d", &a);
		switch (a)
		{
			case 1:
				game();
				break;
			case 0:
				printf("exit\n");
				break;
			default:
				printf("错误输入\n");
				break;
		}
	} while (a);

	return 0;
}

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

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

相关文章

【AI落地应用实战】如何让扫描工具更会思考——智能高清滤镜2.0实战测评

一、引言 在这个信息爆炸的数字化时代&#xff0c;扫描工具已经成为我们日常工作和学习中不可或缺的助手。最近&#xff0c;扫描全能王推出了革命性的“智能高清滤镜2.0”&#xff0c;本次更新后&#xff0c;智能高清滤镜能够智能识别并优化扫描过程中的各种问题。无论是光线不…

【乐吾乐2D可视化组态编辑器】图元外观编辑

1 节点的外观样式 角度&#xff1a;设置尖角与圆角&#xff0c;值的范围&#xff1a;0~1 旋转&#xff1a;设置图形的旋转角度 进度&#xff1a;任意封闭图形&#xff0c;都可以当进度条&#xff1a;矩形、圆、svg、封闭连线、或其他任意封闭图形&#xff0c;值的范围&#…

强化学习:值函数近似【Deep Q-Network,DQN,Deep Q-learning】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

【升压电子烟方案】DC-DC电源升压恒压芯片FP6277+全极低功耗霍尔MH251在电子烟中的应用

电子烟是一种新型烟草制品&#xff0c;由于其健康、环保和口感多样化的特点&#xff0c;逐渐受到了消费者的青睐。 升压芯片作为电子烟的核心组件之一&#xff0c;主要作用是将输入的电压升高至合适的工作电压&#xff0c;霍尔传感器控制电子烟的使用状态&#xff0c;以确保电子…

springboot系列七: Lombok注解,Spring Initializr,yaml语法

老韩学生 LombokLombok介绍Lombok常用注解Lombok应用实例代码实现idea安装lombok插件 Spring InitializrSpring Initializr介绍Spring Initializr使用演示需求说明方式1: IDEA创建方式2: start.spring.io创建 注意事项和说明 yaml语法yaml介绍使用文档yaml基本语法数据类型字面…

鸿蒙开发HarmonyOS NEXT (二) 熟悉ArkUI

一、构造函数 构造一个商品类Item&#xff0c;然后利用foreach函数循环渲染 class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number, discount: number 0) {this.name name;this.image ima…

自动化测试小技巧之Airtest-Selenium和Excel的无缝协作

一、前言 之前在问卷以及Q群上有同学有提出过能否将网页上的一些数据通过Airtest去导出生成一份Excel&#xff0c;那么我们今天一起讨论一下&#xff0c;我们应该如何去实现&#xff0c;以及当我们获取的数据类型不同的时候&#xff0c;获取的方式该怎么随之调整&#xff1f; …

MySQL InnoDB支持几种行格式

数据库表的行格式决定了一行数据是如何进行物理存储的&#xff0c;进而影响查询和DML操作的性能。 在InnoDB中&#xff0c;常见的行格式有4种&#xff1a; 1、COMPACT&#xff1a;是MySQL 5.0之前的默认格式&#xff0c;除了保存字段值外&#xff0c;还会利用空值列表保存null…

如何使用git将本地文件夹提交至云效代码库

目录 引言 一、准备工作 二、配置Git用户信息 三、克隆代码库到本地 四、添加文件至Git仓库 五、推送更改至云效代码库 六、如何删除云效文件 七、注意事项 八、总结 引言 随着团队协作开发的日益普及&#xff0c;代码版本控制系统&#xff08;VCS&#xff09;如Git已…

java+mysql图书管理系统

完整代码地址 1.运行效果图 2.主要代码 2.1.连接数据库 package com.my.homework.utils;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCUtils {public static Connection getConnection() throws Exception {…

力压GPT-4o!新王Claude 3.5 Sonnet来了,直接免费可用

如今&#xff0c;大模型领域更卷了&#xff01; 前脚 OpenAI 发布 GPT4o&#xff0c;硬控全场&#xff0c;后脚就被最大的竞争对手 Anthropic 超越了。 刚刚&#xff0c;Anthropic 发布了全新大模型 Claude 3.5 Sonnet&#xff0c;号称是迄今为止最智能的模型。 据介绍&#x…

CSS|05 继承性与优先级

继承性 一、继承性的特点&#xff1a; 1.外层元素身上的样式会被内层元素所继承 2.如果内层元素与外层元素身上的演示相同时&#xff0c;外层元素的样式会被内层元素所覆盖 二、关于继承性的问题 是不是所有样式都能被继承&#xff1f; 答&#xff1a;并不是所有样式能被继承…

图像处理Python库--图片裁剪、缩放、灰度图、圆角等

图像处理Python库 py-img-processor1. 安装2. 使用(Usage)2.1 运行配置2.2 图像处理处理函数图像处理参数为字符串图像处理参数为JSON 命令行提取图像主色调 py-img-processor Image editor using Python and Pillow. 依赖Pillow开发的Python库&#xff0c;用于图像编辑处理。…

Excel数据恢复,4个技巧挽救重要数据

在数字化时代&#xff0c;Excel表格已经成为我们工作、学习乃至生活中不可或缺的一部分。它们承载着我们的数据、计划、分析和决策&#xff0c;如同一张张承载着智慧与汗水的地图&#xff0c;指引我们前行。然而&#xff0c;当这些宝贵的数据意外丢失或被误删时&#xff0c;我们…

【Linux操作系统】进程地址空间与动态库加载

当系统执行一个依赖动态库的可执行程序时&#xff0c;系统不仅要将该可执行程序加载到内存中还要由加载器将动态库加载到内存中&#xff08;静态库没有&#xff09;&#xff0c;因此必须要让加载器知道该动态库的名称&#xff0c;系统会默认在/lib64路径下查找&#xff0c;解决…

I/O系统

1. I/O接口 接口可以看做两个系统或两个部件之间的交接部分&#xff0c;它既可以是两种硬设备之间的连接电路&#xff0c;也可以是两个软件之间的共同逻辑边界。 I/O接口通常是指主机与I/O设备之间设置的一个硬件电路及其相应的软件控制。 2. 程序查询方式 程序查询方式是一…

深圳比创达|EMC与EMI一站式解决方案:从源头解决,满足您的需求

随着科技的飞速发展&#xff0c;电子产品日益普及&#xff0c;电磁兼容性&#xff08;EMC&#xff09;与电磁干扰&#xff08;EMI&#xff09;问题也逐渐凸显。 一、EMC与EMI的概述 EMC&#xff08;电磁兼容性&#xff09;是指电子设备在共同的电磁环境中能执行各自功能的互不…

TTS x Hallo: 免费数字人头在线生成

是一个利用了百度 Hallo 和 Parler/WhisperSpeech TTS 项目实现的可说话、嘴型匹配的数字人头在线 Space

向日葵API集成服务:三大优势助力企业搭建专属远控方案

为了方便企业用户更加灵活的搭建满足各自需求的软件解决方案&#xff0c;降低开发和部署门槛&#xff0c;很多软件方案供应商提供了多样化的合作模式。 以贝锐向日葵远程控制为例&#xff0c;他们就向客户提供了基础的SaaS服务模式、私有化部署模式、SDK嵌入模式&#xff0c;以…

VUE模板语法(超详细讲解)

大家好&#xff0c;我是DX3906&#xff0c;坚持从工作和生活中不断学习&#xff0c;提炼&#xff0c;沉淀&#xff0c;最终建立自己的强势领域&#xff01; Vue 使用一种基于 HTML 的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue…