扫雷完整源代码

单文件完整源码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>

#define ROW 3
#define COL 3
#define ROWS ROW+2
#define COLS COL+2
#define NUM 1

//int main()
//{
//	int a = 1;
//	if (a == 1)
//	{
//		a = 2;
//	}
//	printf("%d", a);
//	return 0;
//}

//菜单
void menu()
{
	printf("************************************************************************************************************************");
	printf("*******************************************             扫雷游戏            ********************************************");
	printf("*******************************************          1.Play  0.Exit         ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
}

//胜利
void Win()
{
	printf("*******************************************              你赢啦             ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
}

//失败
void Defeat()
{
	printf("*******************************************              你输啦             ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
}

//结束游戏
void End1()
{
	system("cls");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
	printf("*******************************************             游戏结束            ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
	Sleep(1000);
}

//输入错误
void Error()
{
	printf("请根据菜单正确选择!\n");
}

//游戏开头
void Head()
{
	printf("************************************************************************************************************************");
	printf("*******************************************             扫雷游戏            ********************************************");
	printf("************************************************************************************************************************");
	printf("\n");
	printf("\n");
}

//游戏结尾
void End()
{
	printf("\n");
	printf("************************************************************************************************************************");
}

//初始化数组
void Initializeborad(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			//双重for循环所有borad值变为空格
			borad[i][j] = ' ';
		}
	}
}

//打印函数
void Diskplay(char borad[ROWS][COLS], int row, int col)
{
	//清屏
	system("cls");
	int i = 0;
	int j = 0;
	//打印开头
	Head();
	//双重for循环打印游戏面板
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			//每行第一个元素前打印一堆空格美观
			if (j == 1)
			{
				printf("                                           ");
			}
			//第一列打印j作为列标
			if (i == 1)
			{
				//行标1到9前加一个空格后加两个空格补位
				if (j < 9)
				{
					printf(" %d  ", j);
				}
				//行标大于等于9前后加一个空格补位
				else
				{
					printf(" %d ", j);
				}
			}
			//不是第一列打印“---”
			else
			{
				printf("---");
				//最后一列不在打印“|”
				if (j == col)
				{
					break;
				}
				printf("|");
			}
		}
		//换行
		printf("\n");
		for (j = 1; j <= col; j++)
		{
			//每列第一个元素前打印一堆空格美观
			if (j == 1)
			{
				printf("                                         ");
				//1到10打印数字加空格,10以后只打印数(空格为了占位,两位数本身就2位,不用空格补位)
				if (i+1 <= 10)
				{
					printf("%d ", i);
				}
				else
				{
					printf("%d", i);
				}
			}
			printf(" %c ", borad[i][j]);
			if (j == col)
			{
				break;
			}
			printf("|");
		}
		printf("\n");
	}
	//结尾效果
	End();
}

//判断是否是雷函数
int Ismine(char mineborad[ROWS][COLS], int x, int y, int row, int col)
{
	if (mineborad[x][y] == '*')
	{
		return 1;
	}
	return 0;
}

//数九宫格雷个数
void Countmine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int a, int b, int row, int col)
{
	//定义一个值表示地雷个数,初始为0
	int mine = 0;
	//依次判定9宫格除自己以外每个位置是否为雷,因为Ismine函数判定是雷返回1,不是返回0,所以直接mine += Ismine进行累计
	mine += Ismine(mineborad, a, b+1, ROW, COL);
	mine += Ismine(mineborad, a+1, b, ROW, COL);
	mine += Ismine(mineborad, a+1, b+1, ROW, COL);
	mine += Ismine(mineborad, a, b-1, ROW, COL);
	mine += Ismine(mineborad, a-1, b, ROW, COL);
	mine += Ismine(mineborad, a-1, b-1, ROW, COL);
	mine += Ismine(mineborad, a+1, b-1, ROW, COL);
	mine += Ismine(mineborad, a-1, b+1, ROW, COL);
	//数组是字符类型的,把得到的“数字”转化为“字符”
	if (mine == 0)
	{
		mineborad[a][b] = '0';
	}
	else if (mine == 1)
	{
		mineborad[a][b] = '1';
	}
	else if (mine == 2)
	{
		mineborad[a][b] = '2';
	}
	else if (mine == 3)
	{
		mineborad[a][b] = '3';
	}
	else if (mine == 4)
	{
		mineborad[a][b] = '4';
	}
	else if (mine == 5)
	{
		mineborad[a][b] = '5';
	}
	else if (mine == 6)
	{
		mineborad[a][b] = '6';
	}
	else if (mine == 7)
	{
		mineborad[a][b] = '7';
	}
	else if (mine == 8)
	{
		mineborad[a][b] = '8';
	}
}

//生成雷函数
void Minerand(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int row, int col)
{
	int x, y, z;
	z = 0;
	while (z < NUM)
	{
		{
			//随机生成坐标
			x = (rand()%row) + 1;
			y = (rand()%col) + 1;
			if (mineborad[x][y] == ' ')
			{
				mineborad[x][y] = '*';
				z++;
			}
		}
	}
	//直接算出所有格子的值
	for (int i = 1; i <= row; i++)
	{
		for (int j = 0; j <= col; j++)
		{
			if (mineborad[i][j] != '*')
			{
				Countmine(borad, mineborad, i, j, ROW, COL);
			}
		}
	}
}

//排雷函数
int Demine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int x, int y, int row, int col)
{
	//坐标位置不是空,表示该位置已经排查过了
	if (borad[x][y] != ' ')
	{
		return 2;
	}
	//该位置为*表示该位置是0,把棋盘相应位置改为*,返回1表示游戏失败
	if (mineborad[x][y] == '*')
	{
		borad[x][y] = mineborad[x][y];
		return 1;
	}
	//该位置不为雷,把雷盘上的数字赋值给棋盘
	else
	{
		borad[x][y] = mineborad[x][y];
		return 0;
	}
}

//标记雷函数
int Markmine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int x, int y)
{
	//定义静态局部变量来存储标记对的个数
	static int count = 0;
	//如果棋盘该坐标位置为空,就把他标为*,并且雷盘上该位置如果真的为*,count加1表示正确标记了一个雷的位置
	if (borad[x][y] == ' ')
	{
		borad[x][y] = '*';
		if (mineborad[x][y] == '*')
		{
			count++;
		}
		//如果某一次标记完标记对的个数count等于NUM(即雷的个数),说明游戏胜利,返回3
		if (count == NUM)
		{
			count = 0;
			return 3;
		}
		return 0;
	}
	//该位置为*表示已经标记过
	else if (borad[x][y] == '*')
	{
		return 1;
	}
	//不是空也不是*表示该位置是数字
	else
	{
		return 2;
	}
}

//取消标记
int Unmark(char borad[ROWS][COLS], int x, int y)
{
	//该位置是玩家标记的*,把它变回空格
	if (borad[x][y] == '*')
	{
		borad[x][y] = ' ';
		return 0;
	}
	//该位置不是标记位置,返回1
	else
	{
		return 1;
	}
}

//游戏函数
void game()
{
	//创建模板
	char borad[ROWS][COLS] = {0};
	//创建雷板
	char mineborad[ROWS][COLS] = {0};
	//初始化模板
	Initializeborad(borad, ROW, COL);
	//初始化雷盘
	Initializeborad(mineborad, ROW, COL);
	//打印模板
	Diskplay(borad, ROW, COL);
	//随机生成雷
	Minerand(borad, mineborad, ROW, COL);
	int a;
	do
	{
		//清空缓存(初始菜单选择时留下一个“\n”没有被读取)
		getchar();
		//选择菜单
		printf("请选择操作:1排雷/2标记雷/3取消标记\n");
		a = getchar();
		switch (a)
		{
		case '1':
			{
				int x, y;
				printf("请输入坐标:\n");
				//获取玩家的输入坐标
				scanf("%d%d", &x, &y);
				//定义ret1接收有返回值的扫雷函数,并根据返回值写结果
				int ret1 = Demine(borad, mineborad, x, y, ROW, COL);
				if (ret1 == 1)
				{
					//返回值为1,即该位置是雷,打印雷盘并调用失败函数
					Diskplay(mineborad, ROW, COL);
					Defeat();	
					a = 0;
				}
				if (ret1 == 2)
				{
					//返回值为2说明这个坐标已经排查过了
					printf("该作坐标已经排查过了!\n");
				}
				if (ret1 == 0)
				{
					//返回值为0说明该位置不为0,游戏继续,打印棋盘
					Diskplay(borad, ROW, COL);
				}
				break;
			}

		case '2':
			{
				int x, y;
				printf("请输入坐标:\n");
				//获取玩家的输入坐标
				scanf("%d%d", &x, &y);
				//定义ret2接收有返回值的标记函数,并根据返回值写结果
				int ret2 = Markmine(borad, mineborad, x, y);
				if(ret2 == 3)
				{
					//返回值为3表示所有位置雷都已经找到,打印棋盘并调用胜利函数
					Diskplay(borad, ROW, COL);
					Win();
					a = 0;
				}
				else if (ret2 == 1)
				{
					//返回值为1表示该位置已经做过标记了
					Diskplay(borad, ROW, COL);
					printf("该位置已做过标记啦!\n");
				}
				else if (ret2 == 2)
				{
					返回值为2表示该位置已经显示为数字,不是雷
					Diskplay(borad, ROW, COL);
					printf("该位置已确定不是雷啦!\n");
				}
				else
				{
					//排除以上情况,表示游戏正在进行,没分出输赢,打印棋盘表示继续
					Diskplay(borad, ROW, COL);
				}
				break;
			}

		case '3':
			{
				int x, y;
				printf("请输入要取消的标记:\n");
				//获取玩家的输入坐标
				scanf("%d%d", &x, &y);
				//定义ret3接收有返回值的取消标记函数,并根据返回值写结果
				int ret3 = Unmark(borad,  x, y);
				//返回值为1,表示该位置并没有被标记,无法取消
				if (ret3 == 1)
				{
					Diskplay(borad, ROW, COL);
					printf("该位置不是标记位置!\n");
				}
				//除上中情况表示游戏应该正常继续,打印棋盘
				else
				{
					Diskplay(borad, ROW, COL);
				}
				break;
			}

		default:
			{
				Error();
				break;
			}
		}
	//胜利或失败条件达成把a置为0跳出循环
	} while (a);
}

//测试函数
void test()
{
	srand((unsigned int)time(NULL));
	int a;
	do
	{
		printf("请根据菜单选择!1.Play  0.Exit\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			{
				game();
				break;
			}

		case 0:
			{
				printf("游戏退出!\n");
				break;
			}

		//输出指令不是菜单中的
		default:
			{
				Error();
				break;
			}
		}
	} while (a);
	
}

//程序入口main函数
int main()
{
	menu();
	test();
	return 0;
}

标准化项目源码:

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"


//菜单
void menu()
{
	printf("************************************************************************************************************************");
	printf("*******************************************             扫雷游戏            ********************************************");
	printf("*******************************************          1.Play  0.Exit         ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
}

//胜利
void Win()
{
	printf("*******************************************              你赢啦             ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
}

//失败
void Defeat()
{
	printf("*******************************************              你输啦             ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
}

//结束游戏
void End1()
{
	system("cls");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
	printf("*******************************************             游戏结束            ********************************************");
	printf("************************************************************************************************************************");
	printf("************************************************************************************************************************");
	Sleep(1000);
}

//输入错误
void Error()
{
	printf("请根据菜单正确选择!\n");
}

//功能菜单
int Menu()
{
	int a = 0;
	printf("请选择扫雷或者标记雷:(1扫雷/2标记/3取消标记)");
	scanf("%d", &a);
	return a;
}

//游戏函数
void game()
{
	//创建模板
	char borad[ROW][COL] = {0};
	//创建雷板
	char mineborad[ROW][COL] = {0};
	//初始化模板
	Initializeborad(borad, ROW, COL);
	//初始化雷盘
	Initializeborad(mineborad, ROW, COL);
	//打印模板
	Diskplay(borad, ROW, COL);
	//随机生成雷
	Minerand(mineborad, ROW, COL);
	while (1)
	{
		int ret1 = 0;
		int ret2 = 0;
		//功能菜单
		int ret = Menu();
		switch (ret)
		{
		//扫雷
		case 1:
			{
				printf("请输入坐标扫雷:\n");
				int x, y;
				scanf("%d%d", &x, &y);
				ret1 = Demine(borad, mineborad, x, y, ROW, COL);
				if (ret1 == 1)
				{
					Diskplay(mineborad, ROW, COL);
					Defeat();
					break;
				}
				else if (ret1 == 2)
				{
					Diskplay(borad, ROW, COL);
					printf("该位置已确定不是雷啦!\n");
				}
				else
				{
					Diskplay(borad, ROW, COL);
				}
				break;
			}
		//标记雷
		case 2:
			{
				printf("请输入坐标标记雷:\n");
				int x, y;
				scanf("%d%d", &x, &y);
				ret2 = Markmine(borad, mineborad, x, y);
				if(ret2 == 3)
				{
					Diskplay(borad, ROW, COL);
					Win();
				}
				else if (ret2 == 1)
				{
					Diskplay(borad, ROW, COL);
					printf("该位置已做过标记啦!\n");
				}
				else if (ret2 == 2)
				{
					Diskplay(borad, ROW, COL);
					printf("该位置已确定不是雷啦!\n");
				}
				else
				{
					Diskplay(borad, ROW, COL);
				}
				break;
			}
		//取消标记
		case 3:
			{
				printf("请输入要取消的标记:\n");
				int x, y;
				scanf("%d%d", &x, &y);
				int ret3 = Unmark(borad,  x, y);
				if (ret3 == 1)
				{
					Diskplay(borad, ROW, COL);
					printf("该位置不是标记位置!\n");
				}
				else
				{
					Diskplay(borad, ROW, COL);
				}
				break;
			}
		default:
			{
				Error();
				break;
			}
		}
		if (ret1 == 1 || ret2 == 3)
		{
			break;
		}
	}
}


//测试函数,游戏框架
void test()
{
	int a = 0;
	srand((unsigned int)time(NULL));
	do
	{
	printf("请根据菜单选择(1开始游戏,0退出游戏)\n");
	scanf("%d", &a);
		switch (a)
		{
		case 1:
			{
				game();
				break;
			}
		case 0:
			{
				End1();
				break;
			}
		default:
			{
				Error();
				break;
			}
		}
	} while (a);
}


int main()
{
	menu();
	test();
	return 0;
}

game.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//游戏开头
void Head()
{
	printf("************************************************************************************************************************");
	printf("*******************************************             扫雷游戏            ********************************************");
	printf("************************************************************************************************************************");
	printf("\n");
	printf("\n");
}

//游戏结尾
void End()
{
	printf("\n");
	printf("************************************************************************************************************************");
}

//初始化数组
void Initializeborad(char borad[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			//双重for循环所有borad值变为空格
			borad[i][j] = ' ';
		}
	}
}

//打印函数
void Diskplay(char borad[ROW][COL], int row, int col)
{
	//清屏
	system("cls");
	int i = 0;
	int j = 0;
	//打印开头
	Head();
	//双重for循环打印游戏面板
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			//每行第一个元素前打印一堆空格美观
			if (j == 0)
			{
				printf("                                           ");
			}
			if (i == 0)
			{
				if (j < 9)
				{
					printf(" %d  ", j+1);
				}
				else if (j == 9)
				{
					printf(" %d ", j+1);
				}
				else
				{
					printf(" %d ", j+1);
				}
			}
			else
			{
				printf("---");
				if (j == col-1)
				{
					break;
				}
				printf("|");
			}
		}
		printf("\n");
		for (j = 0; j < col; j++)
		{
			if (j == 0)
			{
				printf("                                         ");
				if (i+1 < 10)
				{
					printf("%d ", i+1);
				}
				else
				{
					printf("%d", i+1);
				}
			}
			printf(" %c ", borad[i][j]);
			if (j == col-1)
			{
				break;
			}
			printf("|");
		}
		printf("\n");
	}
	End();
}	

//生成雷函数
void Minerand(char mineborad[ROW][COL], int row, int col)
{
	int x, y, z;
	z = 0;
	while (z < 9)
	{
		{
			x = rand()%row;
			y = rand()%col;
			if (mineborad[x][y] == ' ')
			{
				mineborad[x][y] = '*';
				z++;
			}
		}
	}	
}

//排雷函数
int count1 = 0;
int Demine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y, int row, int col)
{
	if (count1 == 0)
	{
		if (mineborad[x-1][y-1] == '*')
		{
			mineborad[x-1][y-1] = ' ';
			int a, b;
			while (1)
			{
				a = rand()%row;
				b = rand()%col;
				if (mineborad[a][b] == ' ')
				{
					mineborad[a][b] = '*';
					break;
				}
			}
		}
		count1 = 1;
	}
	if (borad[x-1][y-1] != ' ')
	{
		return 2;
	}
	int ret = Ismine(mineborad, x-1, y-1, ROW, COL);
	if (ret == 1)
	{
		count1 = 0;
		return ret;
	}
	else
	{
		Countmine(borad, mineborad, x-1, y-1, ROW, COL);
		return 0;
	}
}

//判断函数
int Ismine(char mineborad[ROW][COL], int x, int y, int row, int col)
{
	if (x<0 || x>row-1 || y<0 || y>col-1)
	{
		return 0;
	}
	else if (mineborad[x][y] == '*')
	{
		return 1;
	}
	return 0;
}

//数九宫格雷个数
void Countmine(char borad[ROW][COL], char mineborad[ROW][COL], int a, int b, int row, int col)
{
	if (borad[a][b] == ' ')
	{
		int mine = 0;
		mine += Ismine(mineborad, a, b+1, ROW, COL);
		mine += Ismine(mineborad, a+1, b, ROW, COL);
		mine += Ismine(mineborad, a+1, b+1, ROW, COL);
		mine += Ismine(mineborad, a, b-1, ROW, COL);
		mine += Ismine(mineborad, a-1, b, ROW, COL);
		mine += Ismine(mineborad, a-1, b-1, ROW, COL);
		mine += Ismine(mineborad, a+1, b-1, ROW, COL);
		mine += Ismine(mineborad, a-1, b+1, ROW, COL);
		if (mine == 0)
		{
			borad[a][b] = '0';
			if (b-1>=0)
			{
				Countmine(borad, mineborad, a, b-1, ROW, COL);
			}
			if (a-1>=0)
			{
				Countmine(borad, mineborad, a-1, b, ROW, COL);
			}
			if (a+1<row)
			{
				Countmine(borad, mineborad, a+1, b, ROW, COL);
			}
			if (b+1<col)
			{
				Countmine(borad, mineborad, a, b+1, ROW, COL);
			}
		}
		
		else if (mine == 1)
		{
			borad[a][b] = '1';
		}
		else if (mine == 2)
		{
			borad[a][b] = '2';
		}
		else if (mine == 3)
		{
			borad[a][b] = '3';
		}
		else if (mine == 4)
		{
			borad[a][b] = '4';
		}
		else if (mine == 5)
		{
			borad[a][b] = '5';
		}
		else if (mine == 6)
		{
			borad[a][b] = '6';
		}
		else if (mine == 7)
		{
			borad[a][b] = '7';
		}
		else if (mine == 8)
		{
			borad[a][b] = '8';
		}
	}
}

//标记雷函数
int Markmine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y)
{
	static int count = 0;
	if (borad[x-1][y-1] == ' ')
	{
		borad[x-1][y-1] = '*';
		if (mineborad[x-1][y-1] == '*')
		{
			count++;
		}
		if (count == 9)
		{
			count = 0;
			count1 = 0;
			return 3;
		}
		return 0;
	}
	else if (borad[x-1][y-1] == '*')
	{
		return 1;
	}
	else
	{
		return 2;
	}
}

//取消标记
int Unmark(char borad[ROW][COL], int x, int y)
{
	if (borad[x-1][y-1] == '*')
	{
		borad[x-1][y-1] = ' ';
		return 0;
	}
	else
	{
		return 1;
	}
}

 game.h

#define ROW 9
#define COL 9

#include <stdio.h>
#include <Windows.h>
#include <time.h>



void Initializeborad(char borad[ROW][COL], int row, int col);
void Diskplay(char borad[ROW][COL], int row, int col);
void Minerand(char mineborad[ROW][COL], int row, int col);
int Demine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y, int row, int col);
int Ismine(char mineborad[ROW][COL], int x, int y, int row, int col);
void Countmine(char borad[ROW][COL], char mineborad[ROW][COL], int a, int b, int row, int col);
int Markmine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y);
int Unmark(char borad[ROW][COL], int x, int y);

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值