IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> (C语言)扫雷游戏 -> 正文阅读

[C++知识库](C语言)扫雷游戏

目录

针对C语言中的循环语句,条件语句,数组的综合应用,在每条代码后面都配备了注释,希望大家可以看懂


文章目录


前言(所需的知识点)

针对C语言中的循环语句,条件语句,数组的综合应用,写出一个扫雷游戏

1.利用while for do while语句

2.利用switch if 语句

3.利用二维数组

4.随机数的利用(关注往期我的博客)

5.函数的调用

6.函数的声明,宏的定义及使用?

一、创建文件

第一步创建两个.c?文件,text?文件用于测试,game 文件用于创建函数

第二步创建一个.h头文件,将前两个文件中所需要的头文件,宏以及函数声明放到此文件中,以此来使.c文件更加整洁

二、编写

1.在测试中引入主函数

代码如下(示例):

#pragma warning(disable : 4996)//VS2019  scanf等函数需要关闭警告
#include "game.h"//引入头文件 定义的define宏 函数声明
void menu()//菜单界面
{
	printf("**********************************\n");//扫雷界面
	printf("*        欢迎来到扫雷游戏        *\n");
	printf("*           1.进行游戏           *\n");
	printf("*           0.退出游戏           *\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, ROWS, COLS);//利用随机数去生成随机雷
	Display(show, ROW, COL);//把初始化的界面展示给玩家
	Display(mine, ROW, COL);//雷布置好的程序不必要写(随意)
	Findmine(show, mine, ROW, COLS);//玩家排雷函数,根据玩家提供的坐标去实现排雷
}
void main()
{
	int input = 0;//定义变量供---->由用户输入的选择
	srand((unsigned int)time(NULL));//设置随机数生成随机雷 在9*9的棋盘生成
	do
	{
		menu();//调用菜单函数
		printf("请您选择序号---->");
		scanf("%d", &input);//用户输入变量值
		switch (input)//根据用户输入进行游戏 or 退出游戏
		{
		case 1:
			game();//选1进行游戏调用game函数
			break;
		case 0:
			printf("\nexit\n");//用户输入0退出程序
			break;
		default:
			printf("序号选择错误请您重新选择\n");//用户输错了重新回到循环判断0/1
		}
	} while (input);//根据用户输入的去循环 用户输入1继续玩游戏,玩家输入0程序终止
}

2.头文件+宏+函数声明

代码如下(示例):

#pragma once
#include <stdio.h>
#include <stdlib.h> //srand的头文件
#include <time.h> //timeh函数的头文件
#define ROW 9//定义宏  方便统一修改
#define COL 9//设置雷在 9*9的格子里防止二维数组越界
#define ROWS ROW+2//防止二维数组越界访问初始化的时候多设置两行两列
#define COLS COL+2
#define EASY_COUNT 10 //设置10颗雷
void Initboard(char board[ROWS][COLS], int rows, int cols, char set);//先函数声明后使用函数 
void Display(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS], int row, int col);
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);

如图所示的9*9扫雷游戏,我们设置的外框是11*11的二维数组,我们在9*9的格子里去设置雷包括呈现给玩家的也是9*9的格子,11*11多出的两行分别是为了防止二维数组越界访问,造成错误。

有的同学不理解为什么会越界访问,我们设想如果我们直接设置9*9的格子,我们要访问左下角的格子,判断他周围的八个格子是否有雷,有一部分格子明显在咱们所见的格子外面,这样就造成了越界访问,访问到二维数组之外了,会造成错误

3.游戏所需函数

#pragma warning(disable : 4996)
#include "game.h"//引入所需头文件,宏,函数声明
void Initboard(char board[ROWS][COLS], int rows, int cols, char set)//初始化界面
{
	int i = 0;
	int j = 0;
	for (j = 0; j < rows; j++)
	{
		for (i = 0; i < cols; i++)
		{
			board[i][j] = set;//把*初始化给二维数组  典型的二维数组赋值
		}
	}
}
void Display(char board[ROWS][COLS], int row, int col)//打印出界面给玩家看 制作玩家界面
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= 9; i++)
	{
		printf("%d ", i);//打印行号
	}
	printf("\n");
	printf("----------------------\n");
	for (j = 1; j <= row; j++)
		{
			printf("%d|", j );//打印列号
			for (i = 1; i <= col; i++)
			{
				printf("%c ", board[i][j]);
			}
			printf("|");
			printf("\n");
		}
	printf("----------------------\n");
}
void Setmine(char board[ROWS][COLS], int row, int col)
{
	int minecount = EASY_COUNT;//设置雷的个数
	while (minecount)//循环去放雷
	{
		int x = rand() % 9 + 1;//因为是玩家玩,所以要从下标为1的开始 所以+1
		int y = rand() % 9 + 1;
		if (board[x][y] != '1')//判断x,y坐标的位置是不是已经放过雷
		{
			board[x][y] = '1';//如果没有放雷,把对应坐标设置成雷,用‘1’表示雷
			minecount--;
		}
	}
}
int Getmine(char mine[ROWS][COLS], int x, int y)//当你扫除一个没有雷的坐标,坐标上显示周围雷的个数
{
	return (mine[x-1][y]+mine[x+1][y]
		  +mine[x][y-1]+mine[x-1][y-1]+mine[x+1][y-1]
		  +mine[x][y+1]+mine[x-1][y+1]+mine[x+1][y+1]-8*'0');//这些坐标加在一起是字符,每一个减去一个字符'0'就可以得到对应的整型数据
}
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
	int x = 0;//定义两个变量 数值由用户输入 对应扫雷的坐标
	int y = 0;
	int win = 0;
	while (win < col * row - EASY_COUNT)//循环的终止条件是9*9的棋盘减去雷的个数,已经满了游戏终止
	{
		printf("请您输入需要排查的坐标------>");
		scanf("%d %d", &x, &y);//用户输入扫雷的坐标
		if (x >= 1 && x <= row && y >= 1 && y <= row)//判断坐标输入正误
		{
			if (mine[x][y] == '1')//判断如果用户输入的坐标对应的字符是'1'即用户踩到雷了,游戏结束,给玩家展示雷的布局图
			{
				printf("很遗憾 您被炸死了!!\n");
				printf("雷区如图 下次加油!!\n");
				Display(mine, ROW, COL);//展示布局图
				break;//循环终止 下次游戏

			}
			else//输入的坐标没有踩到雷
			{
				int count = Getmine(mine, x, y);//调用函数获取周边雷的个数
				show[x][y] = count + '0';
				if (count == 0)//如果周围没有雷把坐标附近的八个坐标都清空(就周围八个格子设置成空格)(仿网页扫雷)
				{
					show[x-1][y] = ' ';
					show[x+1][y] = ' ';
					show[x][y +1] = ' ';
					show[x - 1][y +1] = ' ';
					show[x+1][y +1 ] = ' ';
					show[x +1][y-1] = ' ';
					show[x - 1][y-1] = ' ';
					show[x][y-1] = ' ';

				}//坐标对应的位置周围的雷赋值给show数组
				Display(show, ROW, COL);//展示输入坐标对应的位置周围
			}
		}
		else
		{
			printf("输入的坐标非法请您重新输入\n");
		}
		if (win == row * col-EASY_COUNT)//除了雷的坐标都排除完后就排雷成功了
		{
			printf("恭喜你排雷成功\n");
		}
	}
}

4.解释一个知识点

整型数据+字符‘0’=对应的字符类型

eg. 1+'0'='1'

我们看到字符0的ASCII值为30,字符1的值为31所以刚好数值字符0+1=字符1

5.成果展示


?

?

总结

C语言经典的扫雷游戏,初学C语言的同学可以尝试自己敲一下,可以对所学的知识加以巩固,加强自己的代码能力,有什么问题随时私信评论都行,欢迎大家一起讨论

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:34:13  更:2021-07-30 12:34:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 0:30:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码