栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

用C语言写一个简单的扫雷游戏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用C语言写一个简单的扫雷游戏

目录

1、整体代码实现

2、核心代码

        2.1初始化棋盘

        2.2地雷布置  

        2.3排雷

3、运行效果


1、整体代码实现

在game.h文件中输入需要的头文件和函数声明。

#pragma once
//包含头文件
#include 
#include 
#include 

//符号声明
#define ROW 9
#define COL 9

#define ROWS 11
#define COLS 11

#define EASY_COUNT 10
//函数声明
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col);//打印棋盘
void SetMine(char board[ROWS][COLS], int row, int col);//布置地雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排雷int col);

在game.c中实现各个部分函数。

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//检查棋盘中未选的坐标
int SumCount(char board[ROWS][COLS], int row, int col)
{
	int count = 0;
	for (int i = 1; i <= row; i++)
	{
		for (int j = 1; j <= col; j++)
		{
			if (board[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}
//周围雷数为0时,进行扩展
void exBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	if (x < 1 || x >9 || y < 1 || y > 9)
	{
		return;
	}
	if (show[x][y] == ' ')
	{
		return;
	}
	show[x][y] = MineCount(mine, x, y) + '0';
	if (show[x][y] == '0')
	{
		show[x][y] = ' ';
		exBoard(mine, show, x - 1, y - 1);
		exBoard(mine, show, x, y - 1);
		exBoard(mine, show, x + 1, y - 1);
		exBoard(mine, show, x - 1, y);
		exBoard(mine, show, x + 1, y);
		exBoard(mine, show, x - 1, y + 1);
		exBoard(mine, show, x, y + 1);
		exBoard(mine, show, x + 1, y + 1);
	}
}
//得到周围雷的数量
int MineCount(char board[ROWS][COLS], int x, int y)
{
	return board[x - 1][y - 1]
		+ board[x][y - 1]
		+ board[x + 1][y - 1]
		+ board[x - 1][y]
		+ board[x + 1][y]
		+ board[x - 1][y + 1]
		+ board[x][y + 1]
		+ board[x + 1][y + 1]
		- 8 * '0';
}
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col)
{
	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 ", board[i][j]);
		}
		printf("n");
	}
}
//布置地雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < EASY_COUNT)
	{
		x = rand() % 9 + 1;//随机生成一个1-9的数字
		y = rand() % 9 + 1;//随机生成一个1-9的数字
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count++;
		}
	}
}
//排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	char mine_count = 0;
	while (1)
	{
		printf("请输入坐标:> ");
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col || show[x][y] != '*')
		{
			printf("输入错误,请重输n");
		}
		else
		{
			if (mine[x][y] == '1')
			{
				printf("boom!!!!!n");
				return;
			}
			else
			{				
				exBoard(mine, show, x, y);//当该坐标周围没有雷时,扩展
			}
		}
		if (SumCount(show,row,col) == EASY_COUNT)
		{
			break;
		}
		PrintBoard(show, row, col);
	}
	PrintBoard(mine, row, col);
	printf("成功排雷n");
}

整个小游戏的实现

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void game()
{
	char mine[ROWS][COLS] = { 0 };//存放布置雷的信息
	char show[ROWS][COLS] = { 0 };//存放排雷的信息
	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');//将布置雷的信息的棋盘全部初始化为‘0’
	InitBoard(show, ROWS, COLS, '*');//将布排雷的信息的棋盘全部初始化为‘*’

	//布置地雷
	SetMine(mine, ROW, COL);

	PrintBoard(show, ROW, COL);

	//排雷
	FindMine(mine, show, ROW, COL);
}
void menu()
{
	printf("********************************n");
	printf("*******  1. play  **************n");
	printf("*******  0. exit  **************n");
	printf("********************************n");
}
int main()
{
	srand((unsigned int)time(NULL));
	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;
}

2、核心代码

        2.1初始化棋盘
	char mine[ROWS][COLS] = { 0 };//存放布置雷的信息
	char show[ROWS][COLS] = { 0 };//存放排雷的信息
	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');//将布置雷的信息的棋盘全部初始化为‘0’
	InitBoard(show, ROWS, COLS, '*');//将布排雷的信息的棋盘全部初始化为‘*’
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

        2.2地雷布置  

EASY_COUNT是总共的地雷数,用字符‘1’来表示地雷。

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < EASY_COUNT)
	{
		x = rand() % 9 + 1;//随机生成一个1-9的数字
		y = rand() % 9 + 1;//随机生成一个1-9的数字
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count++;
		}
	}
}

        2.3排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	char mine_count = 0;
	while (1)
	{
		printf("请输入坐标:> ");
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col || show[x][y] != '*')
		{
			printf("输入错误,请重输n");
		}
		else
		{
			if (mine[x][y] == '1')
			{
				printf("boom!!!!!n");
				return;
			}
			else
			{				
				exBoard(mine, show, x, y);//当该坐标周围没有雷时,扩展
			}
		}
		if (SumCount(show,row,col) == EASY_COUNT)
		{
			break;
		}
		PrintBoard(show, row, col);
	}
	PrintBoard(mine, row, col);
	printf("成功排雷n");
}
//检查棋盘中未选的坐标
int SumCount(char board[ROWS][COLS], int row, int col)
{
	int count = 0;
	for (int i = 1; i <= row; i++)
	{
		for (int j = 1; j <= col; j++)
		{
			if (board[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}
//周围雷数为0时,进行扩展
void exBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	if (x < 1 || x >9 || y < 1 || y > 9)
	{
		return;
	}
	if (show[x][y] == ' ')
	{
		return;
	}
	show[x][y] = MineCount(mine, x, y) + '0';
	if (show[x][y] == '0')
	{
		show[x][y] = ' ';
		exBoard(mine, show, x - 1, y - 1);
		exBoard(mine, show, x, y - 1);
		exBoard(mine, show, x + 1, y - 1);
		exBoard(mine, show, x - 1, y);
		exBoard(mine, show, x + 1, y);
		exBoard(mine, show, x - 1, y + 1);
		exBoard(mine, show, x, y + 1);
		exBoard(mine, show, x + 1, y + 1);
	}
}
//得到周围雷的数量
int MineCount(char board[ROWS][COLS], int x, int y)
{
	return board[x - 1][y - 1]
		+ board[x][y - 1]
		+ board[x + 1][y - 1]
		+ board[x - 1][y]
		+ board[x + 1][y]
		+ board[x - 1][y + 1]
		+ board[x][y + 1]
		+ board[x + 1][y + 1]
		- 8 * '0';
}

3、运行效果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号