【C语言】扫雷 小游戏

news/2024/9/8 12:23:33

文章目录

  • 一、游戏规则
  • 二、 代码逻辑
  • 三、游戏实现
    • 1. 游戏菜单设计
    • 2.设计雷区并随机布置雷
      • (1) 设置雷区
      • (2) 布置雷
    • 3.排查雷
  • 四、源码

一、游戏规则

1. 在9*9的小格子中,任意选取一个坐标(格子),选择后发现,如果没点中雷的坐标,会显示数字(表示周围有几个雷),如果点中雷,游戏结束

排查雷

  • 如果这个位置不是雷,就计算这个位置的周围8个坐标有几个雷,并显示雷的个数
  • 如果是 雷 ,就炸死了,游戏结束
  • 如果把雷都找出来了,胜利,游戏结束
  • 链 接:网页版扫雷

扫雷01

2.选择后如图

扫雷02

3.点中雷的情况

扫雷03

二、 代码逻辑

  1. 游戏菜单设计
  2. 设计雷区并随机布置雷
  3. 排查雷

三、游戏实现

1. 游戏菜单设计

//test.c
#include "game.h"
void game() 
{
	printf("扫雷\n");
}
void menu() 
{
	printf("************************\n");
	printf("******    扫雷   *******\n");
	printf("******  1. play  *******\n");
	printf("******  0. exit  *******\n");
	printf("************************\n");
}
int main() 
{
	int input = 0;
	do 
	{
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		switch (input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
					
		}
		
	} while (input);
	return 0;
}

menu

2.设计雷区并随机布置雷

(1) 设置雷区

设置一个9*9的二维数组,0表示没有雷,1表示雷

04

但是为了避免显示给玩家看的数字 1(雷的个数)与设置雷的 1 重合,所以选用 * 进行埋雷

因为扫雷 是扫周围的8个区域,会遇到扫越界问题

05
故变成11*11的二维数组
在这里插入图片描述
设置棋盘

//test.c 中的 game()
void game() 
{
	char mine[ROWS][COLS] = {0};//放置雷的数组
	char show[ROWS][COLS] = {0};//显示的数组
	InitBoard(mine,ROWS,COLS,'0');
	DisplayBoard(mine, ROW, COL);
	InitBoard(show,ROWS,COLS,'*');
	DisplayBoard(show, ROW, COL);

}
//game.c
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows;i++)
	{
		for (j = 0; j < cols;j++)
		{
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{
	int i = 0;
	int j = 0;
	printf("--------扫雷---------\n");
	for (i = 0; i <= col;i++) 
	{
		printf("%d ",i);//打印列标
	}
	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");
	
}
//game.h
#include <stdio.h>

#define ROW 9
#define COL 9

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

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);

在这里插入图片描述

(2) 布置雷

在这里随机生成雷
字符0表示不是雷。字符1表示是雷

//game.c
void SetMine(char mine[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 (mine[x][y] =='0')	//避免在同一个地方布置雷
		{
			mine[x][y] = '1';
			count--;
		}		
	}
}

06

3.排查雷

输入排查雷的坐标,如果是雷则GAME OVER !,则如果不是雷,则显示该坐标周围有多少个雷

//game.c
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +
		mine[x + 1][y] + mine[x + 1][y + 1]) - (8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) 
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row * col - Easy_count))//要排不是雷的区域个数
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if ( x >= 1 && x <= row && y >= 1 && y <= col) 
		{
			//选中雷
			if (mine[x][y] =='1') 
			{
				printf("GAME OVER!!!,被炸死了\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else 
			{
				//不是雷,统计周围有多少雷
				int c = GetCountMine(mine,x,y);
				show[x][y] = c + '0';
				DisplayBoard(show,ROW,COL);
				win++;
			}
		}
		else 
		{
			printf("坐标输入错误,重新输入\n");
		}
	}

	if (win == ((row * col)- Easy_count)) //需要排的区域数
	{
		printf("恭喜您,排雷成功!\n");
	}
}

排雷的周围坐标

x-1, y - 1x-1,yx-1,y+1
x, y - 1x,yx,y+1
x+1,y-1x+1,yx+1,y+1

排完的情况(这里设置80个雷(用于测试排雷成功),所以只有一个安全)
07

排到雷,游戏结束
在这里插入图片描述

四、源码

game.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9

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

#define Easy_count 10

//初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//显示
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

test.c

#include "game.h"
void game() 
{
	char mine[ROWS][COLS] = {0};//放置雷的数组
	char show[ROWS][COLS] = {0};//显示的数组
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');	
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine,ROW,COL);
	//排查雷
	FindMine(mine,show,ROW,COL);

}
void menu() 
{
	printf("************************\n");
	printf("******    扫雷   *******\n");
	printf("******  1. play  *******\n");
	printf("******  0. exit  *******\n");
	printf("************************\n");
}
int main() 
{
	int input = 0;
	srand((unsigned int )time(NULL));//设置随机数种子
	do 
	{
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		switch (input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;		
		}
	} while (input);
	return 0;
}

game.c


#include "game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows;i++)
	{
		for (j = 0; j < cols;j++)
		{
			board[i][j] = set;
		}
	}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{
	int i = 0;
	int j = 0;
	printf("--------扫雷---------\n");
	for (i = 0; i <= col;i++) 
	{
		printf("%d ",i);
	}
	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 SetMine(char mine[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 (mine[x][y] =='0')	//避免在同一个地方布置雷
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +
		mine[x + 1][y] + mine[x + 1][y + 1]) - (8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) 
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row * col - Easy_count))//要排不是雷的区域个数
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if ( x >= 1 && x <= row && y >= 1 && y <= col) 
		{
			//选中雷
			if (mine[x][y] =='1') 
			{
				printf("GAME OVER!!!,被炸死了\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else 
			{
				//不是雷,统计周围有多少雷
				int c = GetCountMine(mine,x,y);

				show[x][y] = c + '0';
				DisplayBoard(show,ROW,COL);
				win++;
			}
		}
		else 
		{
			printf("坐标输入错误,重新输入\n");
		}
	}

	if (win == ((row * col)- Easy_count)) //需要排的区域数
	{
		printf("恭喜您,排雷成功!\n");
	}
}

http://lihuaxi.xjx100.cn/news/1428567.html

相关文章

服务器数据恢复-RAID5上层Hyper-V虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台Windows Server服务器&#xff0c;部署Hyper-V虚拟化环境&#xff0c;虚拟机的硬盘文件和配置文件存放在一台DELL存储中。该存储中有一组由4块硬盘组建的RAID5阵列&#xff0c;用来存放虚拟机的数据文件&#xff0c;另外还有一块大容量硬盘…

css的transform样式计算-第一节

本文作者为 360 奇舞团前端开发工程师 引言 在使用 css 样式进行样式的缩放、旋转等设置时&#xff0c;思考了一下它的较浅层的原理&#xff0c;恩&#xff0c;这个阶段都 是一些初高的数学计算&#xff0c;从新看这里的时候顺便捡了捡初高中的数学&#xff0c;比如三角函数之类…

设置height:100%无效的原因以及两种解决方法

原因&#xff1a;我们知道在把盒子宽度自适应为浏览器窗口宽度&#xff0c;只需设置width:100%就可轻松解决问题&#xff0c;但是让盒子的高度自适应浏览窗口的高度并非那么容易&#xff0c;这是因为css内部计算的原因 <!-- 高度实际为字体大小 --> <div class"…

谷歌关闭跨域限制.(生成一个开发浏览器),Chrome关闭跨域

(一)、首先找到浏览器在电脑磁盘中的位置,并复制 (二)、复制一个浏览器的快捷方式到桌面(不影响正常浏览器) (三)、chrom鼠标右键属性&#xff0c;修改快捷方式的目标 &#xff08;四&#xff09;chrome.exe 后面添加 --disable-web-security --user-data-dir 复制的Chrome浏览…

后端开发5.Redis的搭建

使用docker安装 Redis【redis】(6379) 拉取Redis镜像 docker pull redis:6.2.6 启动Redis容器 docker run -di --name=redis -p 6379:6379 redis:6.2.6 启动Redis容器并设置密码 docker run -di --name=redis -p 6379:6379 redis:6.2.6 --requirepass "密码" 测…

后端开发9.商品类型模块

概述 简介 商品类型我设计的复杂了点,设计了多级类型 效果图 数据库设计

如何使用Pycharm 快速搭建 Django 项目 (分享详细图文教程)

1. 准备工作 在开始创建Django项目之前&#xff0c;需要先确保已经安装了Python和Pycharm。并且python中已经安装好了Django依赖。 1安装python&#xff08;这里我安装使用的是python3.11.4稳定版本&#xff09; 官网下载太慢了这里直接贴网盘下载连接了&#xff0c;一起贴出py…

LeetCode //C - 290. Word Pattern

290. Word Pattern Given a pattern and a string s, find if s follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s. Example 1: Input: pattern “abba”, s “dog c…