回味童年,经典扫雷再升级

这里完成一个c语言的扫雷游戏:

游戏要求:

  1. 雷盘可以展开
  2. 游戏结束显示所用时间
  3. 第一次无论走哪都不会被炸死

这个创建一个扫雷项目,包含一个game.h头文件和两个分别为text.c和game.c的源文件。


text.c源文件:包含主函数main()、菜单函数menu()、游戏函数game();

#include"game.h"

void menu()
{
	printf("********************\n");
	printf("*****  1.play  *****\n");
	printf("*****  0.exit  *****\n");
	printf("********************\n");
}

void game()
{
	int x = 0;
	int y = 0;
	int count = MINE_NUM;
	char mineboard[ROWS][COLS] = { 0 };//放雷的雷盘
	char findboard[ROWS][COLS] = { 0 };//排雷的雷盘

	char textboard[ROWS][COLS] = { 0 };//测试是否展开的雷盘
	InitBoard(textboard, ROWS, COLS, '0');


	InitBoard(mineboard, ROWS, COLS, '0');
	InitBoard(findboard, ROWS, COLS, '*');
	SetMine(mineboard, ROWS, COLS, count);
	FindMine(mineboard, findboard,textboard, x, y);

}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新选择!\n");
			break;
		}

	} while (input);

	system("pause");
	return 0;
}

game.c源文件:包含游戏函数game()中的所有功能函数,如:

                                                                              初始化雷盘函数InitBoard ()
                                                                              展示雷盘函数ShowBoard()
                                                                              埋雷函数SetMine()
                                                                              计算雷数函数Compute()
                                                                              展开雷阵函数Open()
                                                                              排雷函数FindMine();

#include"game.h"


void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch)
{
	memset(&board[0][0], ch, rows*cols * sizeof(board[0][0]));
}


void ShowBoard(char findboard[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("   ");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d  ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", findboard[i][j]);
		}
		printf("\n");
	}
}


void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count)
{
	int i = 0;
	int j = 0;
	while (count != 0)
	{
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (mineboard[i][j] == '0')
		{
			mineboard[i][j] = '1';
			count--;
		}
	}
}

void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y)
{
	findboard[x][y] = mineboard[x - 1][y]
		+ mineboard[x - 1][y - 1]
		+ mineboard[x][y - 1]
		+ mineboard[x + 1][y - 1]
		+ mineboard[x + 1][y]
		+ mineboard[x + 1][y + 1]
		+ mineboard[x][y + 1]
		+ mineboard[x - 1][y + 1]
		- 7 * '0';
	
}

void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y)
{
	textboard[x][y] = '1';
	if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1)
	{
		Compute(findboard, mineboard, x, y);
		if (findboard[x][y] == '0')
		{			
				Compute(findboard, mineboard, x - 1, y);
				Compute(findboard, mineboard, x - 1, y - 1);
				Compute(findboard, mineboard,  x, y - 1);
				Compute(findboard, mineboard,  x + 1, y - 1);
				Compute(findboard, mineboard, x + 1, y);
				Compute(findboard, mineboard,  x + 1, y + 1);
				Compute(findboard, mineboard, x, y + 1);
				Compute(findboard, mineboard,  x - 1, y + 1);
				if (findboard[x - 1][y] == '0')
				{	
					if (textboard[x - 1][y] == '0')
					{
						Open(findboard, mineboard, textboard, x - 1, y);
					}	
				}

				if (findboard[x][y - 1] == '0')
				{			
					if (textboard[x][y - 1] == '0')
					{
						Open(findboard, mineboard, textboard, x, y - 1);
					}
				}

				if (findboard[x + 1][y] == '0')
				{				
					if (textboard[x + 1][y] == '0')
					{
						Open(findboard, mineboard, textboard, x + 1, y);
					}
				}

				if (findboard[x][y + 1] == '0')
				{		
					if (textboard[x][y + 1] == '0')
					{
						Open(findboard, mineboard, textboard, x, y + 1);
					}
				}

		}
	}
}


void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y)
{
	ShowBoard(mineboard, ROW, COL);

	int ret = ROW * COL - MINE_NUM;
	int count = 0;
	while (1)
	{
		int time0 = 0;
		int time1 = 0;
		int time2 = 0;
		
		ShowBoard(findboard, ROW, COL);
		time1 =(unsigned int) time(NULL);
		printf("请输入你要排雷的坐标:>");
		scanf("%d%d", &x, &y);
		if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1)
		{
			count++;
			if (mineboard[x][y] == '1')
			{
				if (count == 1)
				{
					SetMine(mineboard, ROWS, COLS, count);
					mineboard[x][y] = '0';
					Open(findboard, mineboard,textboard, x, y);
				}
				else
				{
					time2 = (unsigned int)time(NULL);
					time0 = time2 - time1;
					printf("很遗憾,你被炸死了!  所用时间:%ds\n", time0);
					ShowBoard(mineboard, ROW, COL);
					break;
				}

			}
			else
			{
				ret--;
				Open(findboard, mineboard, textboard, x, y);
			}
		}
		else
		{
			printf("输入坐标有误,请重新输入!\n");
		}
		if (ret == 0)
		{
			time2 = (unsigned int)time(NULL);
			time0 = time2 - time1;
			printf("恭喜你,游戏通关!  所用时间:%ds\n",time0);
			ShowBoard(mineboard, ROW, COL);
			break;
		}
	}
}

game.h头文件:包含各种功能函数的声明;

#ifndef  __GAME_H__
#define  __GAME_H__

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

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUM 10//游戏难度对应的雷数

//初始化雷盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch);
//展示雷盘
void ShowBoard(char findboard[ROWS][COLS], int row, int col);
//埋雷
void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count);
//计算雷数
void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y);
//展开雷阵
void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y);
//排雷
void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS],char textboard[ROWS][COLS], int x, int y);


#endif //__GAME_H__



猜你喜欢

转载自blog.csdn.net/Watery________1314/article/details/83051300