首页 > 其他分享 >C语言-扫雷游戏的简单实现

C语言-扫雷游戏的简单实现

时间:2024-03-24 19:33:38浏览次数:28  
标签:ROWS 游戏 int mine COLS char 扫雷 printf C语言

文章目录

扫雷游戏的简单实现

本篇博客采用了多文件的方式来实现扫雷游戏
geme.h ----------函数的声明及符号的定义
game.c-----------函数的实现
test.c -----------游戏的运行

主体代码如下

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define EASY_COUNT 10

#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);

//在棋盘中布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("---------扫雷---------\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return  mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + 
		    mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y] + 
		    mine[x + 1][y - 1] + 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("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"
void menu()
{
	printf("************************\n");
	printf("******   1.play   ******\n");
	printf("******   0.exit   ******\n");
	printf("************************\n");
}
void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	//初始化棋盘
	InitBoard(mine, ROWS, COLS,'0');
	InitBoard(show, ROWS, COLS,'*');
	
	//打印棋盘

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

	//排查类
	FindMine(mine, show, ROW, COL);
}
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("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;
		}
	} while (input);
}

1. 初始化棋盘

game.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);

在头文件中定义ROW和COL的值,以便我们可以随时更换棋盘(二维数组)的大小

game.c

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}

将棋盘(二维数组)中的值设置成想要设置的值,来分别表示有雷和无雷(在这里我是以字符 ‘0’ 表示无雷 ‘1’ 表示有雷)

test.c

char mine[ROWS][COLS];
char show[ROWS][COLS];

InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS,'*');

分别定义两个二维数组 mine 和 show , mine是用来布置雷的, show是用来展示出来的

2.打印棋盘

game.h

void DisplayBoard(char board[ROWS][COLS], int row, int col);

为了便于游玩时方便查看坐标,同时防止在运行代码时数组越界,我们将二维数组设置成比棋盘大两格。

game.c

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("---------扫雷---------\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

test.c

DisplayBoard(show, ROW, COL);

3.在棋盘中布置雷

game.h

#define EASY_COUNT 10
#include<stdlib.h>
#include<time.h>
void SetMine(char board[ROWS][COLS], int row, int col);

game.c

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

test.c

SetMine(mine, ROW, COL);

在int main()函数中还要包含:

srand((unsigned int)time(NULL));

通过时间戳,使每次运行game.c中 rand 函数所输入的数字完全随机

4.排查雷

game.h

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return  mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + 
		    mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y] + 
		    mine[x + 1][y - 1] + 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("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

因为在代码中布置雷是以字符 ‘0’ 来表示无雷, 字符 ‘1’ 表示雷,所以在计算所排查坐标周围雷的个数时,通过+或-字符 ‘0’ 来实现
在GetMineCount函数中,通过排查坐标周围8个格子中的字符分别减去字符 ‘0’ 后相加,得出周围8个格子中的雷的个数
在FindMine函数中,通过count+字符 ‘0’ 将雷的个数以ASCII码的形式表示出来,存放到show数组中的相应坐标处

标签:ROWS,游戏,int,mine,COLS,char,扫雷,printf,C语言
From: https://blog.csdn.net/2302_77203854/article/details/136977506

相关文章

  • P10111 [GESP202312 七级] 纸牌游戏 题解
    看标签知道要用DP。于是开始分析。状态:$dp(i,j,k)=$前\(i\)轮中,第\(i\)轮出\(j\),一共换了\(k\)次牌的最大钱数。很好理解。转移也不难,不就是不换和换两种吗!所以,转移就是:\[dp(i,j,k)=\max\begin{cases}dp(i-1,j,k)+\operatorname{pk}(j,c_i)\times......
  • 实验一 熟悉C语言运行环境
    c语言程序设计——实验报告一实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。|通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境......
  • C语言-结构体类型的认识
    1.前言:        因为C语言中的基本数据类型很少,不能描述很多现实中复杂的事物了,所以就引入了结构体类型。比如要描述生活中的人,用什么类型呢?如果只有基本数据类型,答案是什么都用不了,用char?int?double?好像都不太行。因为你人有年龄,姓名,身高等等信息要描述,一种基本数据......
  • c语言程序设计-实验报告2
    实验项目名称:实验报告2-数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的表......
  • 【保姆级讲解C语言中的运算符的优先级】
    ......
  • c语言基础(5)
    一、字符串函数        我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。1、字符分类函数    字符分类函数就是用来判断字符类型的函数。2、字符转换函数2.1 toupper    i......
  • c语言程序设计——实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的......
  • c语言程序设计——实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的......
  • c语言程序设计--实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的表达式。......
  • c语言程序设计——实验报告一
    实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、实验......