(C语言)扫雷游戏

本文档详细介绍了如何使用C语言编写扫雷游戏,涵盖了循环、条件语句、二维数组、随机数、函数调用等核心概念。通过创建文件、编写代码、测试运行三个步骤,实现了9x9的扫雷游戏,包括初始化界面、生成雷区、用户交互等功能。在游戏过程中,利用宏定义简化代码,并展示了关键函数的实现,帮助初学者巩固C语言知识。
摘要由CSDN通过智能技术生成

目录

针对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语言的同学可以尝试自己敲一下,可以对所学的知识加以巩固,加强自己的代码能力,有什么问题随时私信评论都行,欢迎大家一起讨论

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
C语言扫雷游戏排行榜是一个用于记录玩家在扫雷游戏中的得分和排名的榜单。在C语言中,我们可以使用数组和结构体来实现这个排行榜。 首先,我们可以创建一个结构体来表示每个玩家的信息,如玩家的姓名和得分。结构体的定义可以像这样: ``` struct Player { char name[20]; int score; }; ``` 然后,我们创建一个数组来存储多个玩家的信息,数组的大小可以根据需要进行调整。例如: ``` struct Player leaderboard[10]; ``` 接下来,我们可以编写函数来实现对排行榜的操作,如添加玩家、更新得分和显示排行榜等。 添加玩家的函数可以接受玩家的姓名和得分,并将其添加到排行榜中。例如: ``` void addPlayer(char name[20], int score) { // 找到排行榜中得分低于当前得分的位置,并将其后的玩家信息依次后移一位 // 将当前玩家信息插入到空出的位置 } ``` 更新得分的函数可以接受玩家的姓名和新得分,并根据姓名找到对应的玩家并更新其得分。例如: ``` void updateScore(char name[20], int newScore) { // 根据姓名找到对应的玩家,并更新其得分 } ``` 最后,我们可以编写显示排行榜的函数,按照得分从高到低的顺序显示玩家信息。例如: ``` void showLeaderboard() { // 对排行榜中的玩家根据得分进行排序,并输出玩家信息 } ``` 以上是用C语言实现扫雷游戏排行榜的基本思路,具体的实现细节可以根据实际需求进行调整和完善。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦の澜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值