C语言实现扫雷小游戏的示例代码

 更新时间:2022年10月26日 16:09:16   作者:蜗牛牛啊  
这篇文中主要为大家详细介绍了如何利用C语言实现经典的扫雷小游戏。扫雷小游戏主要是利用字符数组、循环语句和函数实现,感兴趣的小伙伴可以了解一下

一、扫雷

扫雷小游戏主要是利用字符数组、循环语句和函数实现。

设计思路:雷盘大小为9*9,但是为了后续能更好的统计出雷的个数在定义数组的时候定义大小为11*11,先定义两个字符数组,一个用来记录雷的位置,另一个用来展现给玩家,初始化雷盘,将两个字符数组分别全部赋值为字符0和字符*,打印棋盘,随机设置雷所在位置,根据玩家输入的坐标排查上下左右8个格子中的雷,并判断输入坐标处是否有雷。

玩法:玩家选择开始游戏之后,输入坐标,如果坐标处有雷,输入坐标处标记为$,并打印出来游戏结束重新选择;如果坐标处没有雷,统计出附近8个格子中雷的个数并在输入坐标处展现出来;如果输入坐标已经被排查过了,则提示已排查过。

1.演示效果

为了更好的演示,将雷的个数设置为79个,同时将显示出雷的位置的雷盘也展现出来。

具体效果如下:

2.完整代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9//展现出来的行
#define COL 9//展现出来的列

#define ROWS ROW+2//全部的行
#define COLS COL+2//全部的列

#define MINE 79//雷的个数
void Init_board(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 Print_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);//打印出来列号
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ",i);//打印出来行号
		for (j = 1; j <= row; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = MINE;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
int Get_mine(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0');

}
void Find_mine(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-MINE)
	{
		printf("请输入坐标>:");
		scanf("%d%d",&x,&y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] == '*')
			{
				if (mine[x][y] == '1')
				{
					printf("你被炸死了,通关失败!\n");
					show[x][y] = '$';//炸死时用符号$代表所输入的坐标
					Print_board(show, row, col);
					break;
				}
				else
				{
					int count = Get_mine(mine, x, y) + '0';
					show[x][y] = count;
					Print_board(show, row, col);
					win++;
				}
			}
			else
			{
				printf("输入的坐标已被排查过,请重新输入!\n");
			}
		}
		else
		{
			printf("输入的坐标非法,请重新输入!\n");
		}
	}
	if (win == row * col - MINE)
	{
		printf("恭喜你,成功通关!\n");
		Print_board(show, row, col);
	}
}
void game()
{
	//定义两个数组,mine用来记录雷的位置,show展现给玩家
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化雷盘
	//全部初始化为字符0和字符*
	Init_board(mine, ROWS, COLS,'0');
	Init_board(show, ROWS, COLS, '*');

	//打印雷盘
	//Print_board(mine, ROW, COL);
	Print_board(show, ROW, COL);

	//布置雷
	Set_mine(mine, ROW, COL);
	Print_board(mine, ROW, COL);
	
	//排雷
	Find_mine(mine, show, ROW, COL);
}
void menu()
{
	printf("************************\n");
	printf("****  1.开始游戏    ****\n");
	printf("****  0.结束游戏    ****\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);
}

二、代码解析

1.初始化雷盘

//初始化雷盘
void Init_board(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;
		}
	}
}

char set是用来接收传过来的字符。

2.打印雷盘

//打印雷盘
void Print_board(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (j = 0; j <= col; j++)
    {
        printf("%d ", j);//打印出来列号
    }
    printf("\n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);//打印出来行号
        for (j = 1; j <= row; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
}

打印雷盘时将其所在的序列号也打印了出来。

3.布置雷

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

通过用rand函数和srand函数生成随机坐标布置雷的位置,一共布置count个雷。

4.排雷

int Get_mine(char mine[ROWS][COLS], int x, int y)
{
    return (mine[x - 1][y] +
        mine[x - 1][y - 1] +
        mine[x][y - 1] +
        mine[x + 1][y - 1] +
        mine[x + 1][y] +
        mine[x + 1][y + 1] +
        mine[x][y + 1] +
        mine[x - 1][y + 1] - 8 * '0');

}
void Find_mine(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 - MINE)
    {
        printf("请输入坐标>:");
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] == '*')
            {
                if (mine[x][y] == '1')
                {
                    printf("你被炸死了,通关失败!\n");
                    show[x][y] = '$';//炸死时用符号$代表所输入的坐标
                    Print_board(show, row, col);
                    break;
                }
                else
                {
                    int count = Get_mine(mine, x, y) + '0';
                    show[x][y] = count;
                    Print_board(show, row, col);
                    win++;
                }
            }
            else
            {
                printf("输入的坐标已被排查过,请重新输入!\n");
            }
        }
        else
        {
            printf("输入的坐标非法,请重新输入!\n");
        }
    }
    if (win == row * col - MINE)
    {
        printf("恭喜你,成功通关!\n");
        Print_board(show, row, col);
    }
}

Get_mine函数用来计算输入坐标附近的雷的个数,通过附近字符1相加之后减去8个字符0计算出来,减去字符0是因为字符1和字符0的ASCII码值相差1,利用这个规则将字符转化为数字。Find_mine函数通过输入的坐标,判断坐标处是否为雷或展现出附近雷的个数亦或者结束游戏。

5.游戏函数主体

void game()
{
	//定义两个数组,mine用来记录雷的位置,show展现给玩家
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化雷盘
	//全部初始化为字符0和字符*
	Init_board(mine, ROWS, COLS, '0');
	Init_board(show, ROWS, COLS, '*');

	//打印雷盘
	//Print_board(mine, ROW, COL);
	Print_board(show, ROW, COL);

	//布置雷
	Set_mine(mine, ROW, COL);
	Print_board(mine, ROW, COL);

	//排雷
	Find_mine(mine, show, ROW, COL);
}

6.菜单函数

void menu()
{
    printf("************************\n");
    printf("****  1.开始游戏    ****\n");
    printf("****  0.结束游戏    ****\n");
    printf("************************\n");
}

7.头文件、宏定义及主函数

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9//展现出来的行
#define COL 9//展现出来的列

#define ROWS ROW+2//全部的行
#define COLS COL+2//全部的列

#define MINE 79//雷的个数
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);
}

以上就是C语言实现扫雷小游戏的示例代码的详细内容,更多关于C语言扫雷游戏的资料请关注脚本之家其它相关文章!

相关文章

  • 用贪心法求解背包问题的解决方法

    用贪心法求解背包问题的解决方法

    本篇文章是对用贪心法求解背包问题的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ Boost Random随机函数详解

    C++ Boost Random随机函数详解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • OpenCV Matlab生成视频倒放功能

    OpenCV Matlab生成视频倒放功能

    这篇文章主要介绍了OpenCV Matlab生成视频倒放功能,大家都知道不少带声音视频的后缀名往往都是.mp4,那么如何获取里面的音频呢?本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-01-01
  • 一文详解C++关键词auto的用法

    一文详解C++关键词auto的用法

    在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,在 C++11中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,本文将给大家详细的介绍一下C++关键词auto的用法,需要的朋友可以参考下
    2024-02-02
  • C++类中的static和const用法实例教程

    C++类中的static和const用法实例教程

    这篇文章主要介绍了C++类中的static和const用法,是C++面向对象程序设计中非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • C++深入学习之彻底理清重载函数匹配

    C++深入学习之彻底理清重载函数匹配

    C++ 不允许变量重名,但是允许多个函数取相同的名字,只要参数表不同即可,这叫作函数的重载,下面这篇文章主要给大家介绍了关于C++深入学习之彻底理清重载函数匹配的相关资料,需要的朋友可以参考下
    2019-01-01
  • 探讨编写int strlen(char *strDest);不允许定义变量的问题

    探讨编写int strlen(char *strDest);不允许定义变量的问题

    本篇文章是对编写int strlen(char *strDest);不允许定义变量的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现航空订票系统课程设计

    C语言实现航空订票系统课程设计

    这篇文章主要为大家详细介绍了C语言实现航空订票系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言实现的猜数字小游戏

    C语言实现的猜数字小游戏

    这篇文章主要为大家详细介绍了C语言实现的猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C语言菜鸟基础教程之for循环

    C语言菜鸟基础教程之for循环

    c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句.
    2017-10-10

最新评论