C语言简单实现扫雷游戏

game.h

#include<string.h>
#include<windows.h>


#define _CRT_SECURE_NO_WARNINGS 1

#pragma warning(disable:4996)

#define ROW 10
#define COL 10
#define MINE_NUM 20



void set_mine(char mine[ROW + 2][COL + 2]);
void display(char show[ROW + 2][COL + 2]);
//int sweep(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2]);
int getRandomNum(int start, int end);
int get_mine(char mine[ROW + 2][COL + 2], int row, int col, int x, int y);
void menu();
void game();

#endif

main.c

#include "game.h"



void menu()
{
	printf("#########################################\n");
	printf("######    1.play    ###   2.exit   ######\n");
	printf("#########################################\n");
	printf("#######    Please select!      ##########\n");
	
}
int main()
{
    do
	{
		int select = 0;
		menu();
		printf("Please choose:\n");
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			game();
			break;
		case 2:
			exit(0);
		default:
			printf("Error,try again!\n");
			break;
		}
	} while (1);
	system("pause");
	return 0;
}
game.c
#include "game.h"

void game()
{

	char mine[ROW + 2][COL + 2];
	memset(mine, '0', (ROW + 2)*(COL + 2));//对布雷数组进行初始化
	char show[ROW + 2][COL + 2];
	memset(show, '*', (ROW + 2)*(COL + 2));//对展示数组进行初始化

	//system("CLS");
	set_mine(mine, ROW + 2, COL + 2);//布雷
	do
	{
		int x;
		int y;
		int count = 0;
		display(show, ROW + 2, ROW + 2);//游戏界面展示出来
		printf("Begin<x,y>:");
		scanf("%d%d", &x, &y);
		if ((x >= 1) && (x <= ROW) && (y >= 1) && (y <= COL))
		{
			//sweep(mine, show);//此方式也可实现扫雷判断
				if (mine[x][y] == '1')
				{
					printf("踩到雷了\n");
					display(mine, ROW + 2, ROW + 2);
					return 0;//结束程序
				}
				else
				{
					int ret = get_mine(mine, ROW + 2, COL + 2,x,y);
					show[x][y] = ret + '0';
					count++;
					if (count== ROW *COL - MINE_NUM)
					{
						printf("扫雷完成,你赢了!\n");
						display(mine, ROW + 2,ROW + 2);
						break;
					}
				}
			}
		else{}
	} while (1);
}
static int getRandomNum(int start, int end)
{
	return rand() % (end - start + 1) + start;//生成一个随机值
}
void set_mine(char mine[ROW + 2][COL + 2],int row,int col)//布雷
{
	int count = MINE_NUM;//雷的个数
	srand((unsigned)time(NULL));
	while (count)
	{
	    int x = getRandomNum(1,ROW);
		int y = getRandomNum(1,COL); //随机布雷

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
void display(char board[ROW + 2][COL + 2], int row, int col)//显示扫雷界面
{
	printf("   ");
	int i = 0;
	int j = 0;
	for (i = 1; i <=COL; i++)//先打印雷盘最上面的一行数字
	{
		printf("%3d", i);
	}
	printf("\n");
	for (i = 0; i <= COL; i++)
	{
		printf("---");
	}
	printf("\n");
	for (i = 1; i <= ROW; i++)//打印雷盘最左边一行数字和每一行的内容
	{
		printf("%2d|",i);
		for (j = 1; j <=COL; j++)
		{
			printf("%2c|", board[i][j]);
		}
		printf("\n");
	}
}
//int sweep(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2])
//{
//	int count = 0;
//	int x = 0;
//	int y = 0;
//	while (count != ((ROW + 2)*(COL + 2) - MINE_NUM))
//	{
//		printf("请输入坐标:\n");
//		scanf("%d%d", &x, &y);
//		if (mine[x][y] == '1')
//		{
//			printf("踩到雷了\n");
//			display(mine, ROW + 2, COL + 2);
//			return 0;//结束程序
//		}
//		else
//		{
//			int ret = get_mine(mine, ROW + 2, COL + 2,x,y);
//			show[x][y] = ret + '0';
//			display(show, ROW + 2, COL + 2);
//			count++;
//		}
//	}
//	printf("扫雷完成,你赢了!\n");
//	display(mine, ROW + 2, COL + 2);
//	return 0;
//
//}
int get_mine(char mine[ROW + 2][COL + 2],int row,int col, int x, int y)//计算雷的个数
{
	
	int count = 0;
	if (mine[x - 1][y - 1] == '1'){ count++; }
	if (mine[x - 1][y] == '1'){ count++; }
	if (mine[x - 1][y + 1] == '1'){ count++; }
	if (mine[x][y - 1] == '1'){ count++; }
	if (mine[x][y + 1] == '1'){ count++; }
	if (mine[x + 1][y - 1] == '1'){ count++; }
	if (mine[x + 1][y] == '1'){ count++; }
	if (mine[x + 1][y + 1] == '1'){ count++; }
	return count;
	/*return (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');*/
}


猜你喜欢

转载自blog.csdn.net/na_hanqiannan/article/details/80034908