C语言-----简单实现扫雷

今天来写一个小项目-怎么实现简易版扫雷,大家都玩过扫雷吧,在写扫雷这个小项目之前我是不会玩扫雷的,O(∩_∩)O哈哈~,之后才有了玩的想法。现在我们来看一下如何实现吧。

项目思路:

首先,我们要玩扫雷要有一个简单的游戏菜单供用户选择,这就需要一个菜单函数menu( )。
其次,要有两个数组,一个用来隐藏的显示雷的数组,另一个就是真正显示界面的数组。数组定义好后要进行初始化啊,显示雷的数组用 0 初始化,真正显示数组用 * 初始化。效果如下图

然后,给雷数组设置雷,要随机生成雷,最后就可以玩游戏了。

代码:

先在头文件里定义一下所需要的的函数
#define ROW 10
#define COL 10
#define MINE_COUNT 98

//设置雷
void set_mine(char mine[ROW + 2][COL + 2], int row, int col);
void reset_mine(char mine[ROW + 2][COL + 2], int x, int y, int count);

//显示
void display_board1(char mine[ROW + 2][COL + 2], int row, int col);//用于调试时显示雷分布

void display_board(char board[ROW + 2][COL + 2], int row, int col);
void expand_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2], int x, int y);

//统计雷个数
int get_mine_count(char board[ROW + 2][COL + 2], int x, int y);


//玩游戏
void play_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2]);

接下来是我们扫雷游戏的测试函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include "扫雷.h"

int menu(void)
{
	int choose;
	printf("********************\n");
	printf("      0.退出        \n");
	printf("      1.玩游戏      \n");
	printf("********************\n");
	printf("choose:");
	scanf("%d", &choose);
	return choose;
}
int chance_mine(void)
{
	int number = 0;
	printf("请选择雷数:");
	scanf("%d", &number);
	return number;
}

void game()
{
	int ret = 0;
	int x = 0, y = 0;
	int num = 0;
	char mine[ROW + 2][COL + 2];  //定义两数组显示雷数组
	char board[ROW + 2][COL + 2];

	//自定义选择雷的数量chance_mine()

	//初始化两个数组
	memset(mine, '0', (ROW + 2)*(COL + 2)*(sizeof mine[0][0]));
	memset(board, '*', (ROW + 2)*(COL + 2)*(sizeof board[0][0]));
	//init_mine(mine,board);

	//显示雷数组,界面数组

	//display_board(board, ROW + 2, COL + 2);

	//设置雷
	set_mine(mine, ROW + 2, COL + 2);
	display_board1(mine, ROW + 2, COL + 2);//测雷
	display_board(board, ROW + 2, COL + 2);
	//玩游戏
	play_mine(mine, board);
	get_mine_count(mine, x, y);

}

int main()
{
	int choose = 0;
	srand((unsigned int)time(NULL));
	do{
		choose = menu();
		switch (choose)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (choose);
	system("pause");
	return 0;
}

最后就是扫雷中各个部分如何去实现了,其中各个函数实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 10
#define COL 10
#define MINE_COUNT 98

#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include "扫雷.h"

//显示雷阵,看不见雷
void display_board(char board[ROW + 2][COL + 2], int row, int col)
{
	printf("-------------\n");
	int i = 0, j = 0;
	printf("   ");
	for (i = 1; i < col - 1; i++)//打印1-10的heng标
	{
		printf("%d ", i);
	}
	printf("\n\n");

	for (i = 1; i < row - 1; i++)//打印1-10的shu标
	{
		printf("%-1d  ", i);
		for (j = 1; j < col - 1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
		printf("\n"); //改成-------------
	}
}

void display_board1(char mine[ROW + 2][COL + 2], int row, int col)
{
	int i = 0, j = 0;
	printf("   ");
	for (i = 1; i < col - 1; i++)//打印1-10的heng标
	{
		printf("%d ", i);
	}
	printf("\n\n");

	for (i = 1; i < row - 1; i++)//打印1-10的shu标
	{
		printf("%-1d  ", i);
		for (j = 1; j < col - 1; j++)
		{
			printf("%c ", mine[i][j]);
		}
		printf("\n");
		printf("\n");
	}
}
void set_mine(char mine[ROW + 2][COL + 2], int row, int col)
{
	int count = MINE_COUNT;
	while(count)
	{
		int x = 0, y = 0;
		x = (rand() % (row - 2)) + 1;//随机数生成,范围在(0--9)+1 即(1--10)
		y = (rand() % (col - 2)) + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
void reset_mine(char mine[ROW + 2][COL + 2], int x, int y, int count)
{
	while (count)
	{
		int x = 0, y = 0;
		x = (rand() % (ROW)) + 1;//随机数生成,范围在(0--9)+1 即(1--10)
		y = (rand() % (COL)) + 1;
		if (mine[x][y] = '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//统计雷个数
int get_mine_count(char mine[ROW + 2][COL + 2], int x, int y)
{
	int count = 0;
	count = (mine[x - 1][y - 1] - '0') + (mine[x - 1][y] - '0')
		+ (mine[x - 1][y + 1] - '0') + (mine[x][y - 1] - '0') + (mine[x][y + 1] - '0')
		+ (mine[x + 1][y - 1] - '0') + (mine[x + 1][y] - '0') + (mine[x + 1][y + 1] - '0');
	return count;
}


//展开雷
void expand_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2], int x, int y)
{
	int i = 0, j = 0;
	for (i = (x - 1); i <= (x + 1); i++)
	{
		for (j = (y - 1); j <= (y + 1); j++)
		{
			if (mine[i][j] == '0')
			{
				board[i][j] = get_mine_count(mine, i, j) + '0';
			}
			if (board[i][j] == '0')
			{
				board[i][j] = ' ';
			}
		}
	}
	
}
//判断雷是否找完
int is_win(char board[ROW + 2][COL + 2])
{
	int i = 0, j = 0;
	int c = 0;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			if (board[i][j] != '*')
			{
				c++;
			}
		}
	}
	return c;
}

//玩游戏
void play_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2])
{
	int first = 0;
	int x = 0, y = 0;
	int leicount = 0;
	while (1)
	{
		//输入坐标
		printf("请输入坐标:");
		scanf("%d%d", &x, &y);
		//坐标合法性
		if ((1 <= x && x <= 10) && (1 <= y && y <= 10))
		{
			first++;
			if (mine[x][y] == '1')
			{
				if (first == 1)
				{
					reset_mine(mine, x, y, 1);
					display_board(mine, ROW + 2, COL + 2);
					int ret = 0;
					ret = get_mine_count(mine, x, y);
					board[x][y] = ret + '0';            //数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII
					display_board(board, ROW + 2, COL + 2);
					//display_board1(mine, ROW + 2, COL + 2);//测雷
				}
				else if (mine[x][y] == '1')
				{
					printf("你踩雷了\n");
					//set_mine(board, x, y);
					display_board(mine, ROW + 2, COL + 2);
					break;
				}
			}
			else
			{
				int ret = 0;
				ret = get_mine_count(mine, x, y);
				board[x][y] = ret + '0';            //数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII

				if (ret == 0)
				{
					expand_mine(mine, board, x, y);
				}
				display_board(board, ROW + 2, COL + 2);
			}
		}
		else
		{
			printf("输入坐标错误,请重新输入\n");
		}
		if (is_win(board) == ROW * COL - MINE_COUNT)
		{
			printf("雷全部找出\n");
			display_board(mine, ROW + 2, COL + 2);
			break;
		}
	}
}
在写这个扫雷的过程中,我发现了我的很多问题,很多细节及知识点都不会,人丑还是多看书吧。

猜你喜欢

转载自blog.csdn.net/abc_xixi111/article/details/80166508