前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C语言】扫雷游戏

【C语言】扫雷游戏

作者头像
用户11290673
发布2024-09-25 11:04:37
发布2024-09-25 11:04:37
7700
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

扫雷介绍

扫雷游戏大家都不陌生,1992年4月6日,扫雷和纸牌空当接龙等小游戏搭载在Windows 3.1系统中与用户见面,主要目的是让用户训练使用鼠标。这个游戏的玩法很简单,有初级、中级、高级和自定义等模式,雷区中随机布置一定数量的地雷,玩家需要尽快找出所有不是地雷的方块,但不许踩到地雷。

胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。

如何操作:左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。如果你把数字周围的雷全扫出后还有空格,不必再一格一格翻开,直接双击左键就可以了。但如果你标记错了雷,那就会"boom!"一切重新开始。


那么如何让我们实现9*9扫雷代码那

设计思路:

1.建立菜单函数和game函数,跟之前我发的井字棋代码一样,所以第一个步骤我就跳过了哈哈哈

2.首先我们需要两个数组arr1和arr2储存两个棋盘的信息,第一个棋盘是布置雷的棋盘(客户看不到的),第二个是排查雷的棋盘(客户能看到并能操作的棋盘),数组的行和列虽说是9*9的棋盘,但存在边角也有可能是雷的情况来计算,所以实际数组行ROW和列COL需要各扩大两行两列,所以实际数组行ROWS和列COLS是11,

3.声明并定义一个函数chu,用来初始化俩棋盘,arr1初始化全为‘0’,arr2初始化全为‘*’

4.创建一个函数dischu打印arr2棋盘,注:打印的时候只需要中间的9*9范围所以此时的行和列范围是1~9,所以要用ROW和COL传参数,不能用ROWS和COLS!!!

5.布置雷,定义一个常量EASY_COUNT代表雷的个数,创建一个函数setlei来布置雷。随机取布置雷的坐标,期间需要用到rand()和game()函数来设置随机数,要调用头文件<stdlib.h>和<time.h>

6.排查雷,创建一个函数findlei用来排查雷,首先确保玩家输入的坐标都在1~9范围内,才可判断是不是雷,若选的坐标不是雷,我们需要创建一个函数panduan返回周围雷的个数,又因为数组储存的是字符类型所以+‘0’转换字符类型赋值给你选的坐标,再打印就行了。

注:字符‘1’-字符‘0’=数字1,我们可以根据这一点返回对应的雷的总数,但要打印到arr2棋盘中的总数是字符,所以返回来总值之后还要加'0'变回字符再打印,在panduan函数里我们可以直接返回该坐标周围8个格子里雷的数量

以下是全部代码:

game.h文件用来存放头文件,定义常量,声明函数

代码语言:javascript
代码运行次数:0
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10   //定义雷的个数
void chu(char board[ROWS][COLS],int rows,int cols,char ar);//初始化函数说明
void dischu(char board[ROWS][COLS],int rows,int cols);//打印棋盘函数声明
void setlei(char board[ROWS][COLS], int row, int col);//布置雷函数声明
void finDlei(char arr1[ROWS][COLS],char arr2[ROWS][COLS],int row,int col);//排查雷函数声明

game.c 文件用来定义函数

代码语言:javascript
代码运行次数:0
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void chu(char board[ROWS][COLS],int rows,int cols,char ar) //初始化函数定义
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j <cols; j++)
		{
			board[i][j] = ar;
		}
	}

}
void dischu(char board[ROWS][COLS], int row, int col)//打印棋盘函数定义
{
	int i = 0;
	int j = 0;
	printf("-----------------------------扫雷游戏-----------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ",j);//打印列数
	}
	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 setlei(char board[ROWS][COLS], int row, int col)//布置雷函数定义
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;//随机生成1~9
		int y = rand() % col + 1;
		if (board[x][y] == '0') 
		{
			board[x][y] = '1';
			count--;
		}
	}
}
static int panduan(char arr1[ROWS][COLS], int x, int y)
{
	    return arr1[x - 1][y] + arr1[x + 1][y] +
		arr1[x][y - 1] + arr1[x][y + 1] +
		arr1[x - 1][y - 1] + arr1[x + 1][y + 1] +
		arr1[x - 1][y + 1] + arr1[x + 1][y - 1]-8 * '0';
}

void finDlei(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)//排查雷函数定义
{
	int x = 0;
	int y = 0;
	int sum = 0;
	while (sum<row*col- EASY_COUNT)
	{
		printf("请输入排查雷的坐标>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 9 && y <= 9 && y >= 1)//输入合法
		{
			//选到雷了
			if (arr1[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				dischu(arr1, ROW, COL);
				break;
			}
			else//不是雷
			{
				int count = panduan(arr1, x, y);//计算坐标周围有几个雷函数
				arr2[x][y] = count+'0';
				dischu(arr2, ROW, COL);
				sum++;
			}
		}
		else
		{
			printf("输入非法,请重新输入\n");
		}
	}
	if (sum == 71)
	{
		printf("恭喜你找到全部的雷\n");
		dischu(arr1, ROW, COL);
	}
}

test.c文件中主要是game函数中执行的每一个函数的步骤,main函数和菜单函数创建

代码语言:javascript
代码运行次数:0
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("************************************\n");
	printf("*****       1.开始游戏        ******\n");
	printf("*****       0.退出游戏        ******\n");
	printf("************************************\n");
	printf("*********************制作人:********\n");
	printf("*********************小张同学*******\n");
	printf("************************************\n");
}
void game()
{
	char arr1[ROWS][COLS] = { 0 };//存放布置雷的信息
	char arr2[ROWS][COLS] = { 0 };//存放排雷的信息
	//初始化数组的内容为指定的内容
	//arr1数组在没有布置雷时,都是'0'
	chu(arr1, ROWS, COLS,'0');
	chu(arr2, ROWS, COLS, '*');
	//arr2数组在没有排雷的时,都是'*'
	//打印
	dischu(arr2, ROW, COL);
	//布置雷
	setlei(arr1, ROW, COL);
	//排查雷
	finDlei(arr1, arr2, ROW, COL);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//调用菜单函数
		printf("请选择>");
		scanf("%d", &input);
		switch (input)//switch语句判断
		{
		case 1:
			game();//调用game函数
			break;
		case 0:
			printf("游戏已退出\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);


	return 0;
}

生成结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 扫雷介绍
  • 以下是全部代码:
  • 生成结果:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档