用C语言实现扫雷小游戏

多文件实现扫雷游戏,并满足:第一次不被炸死 ,当坐标周围没雷,可以实现展开
创建两个12*12的数组,一个实现埋雷等操作mine[12][12],另一个则是用户所见的界面board[12][12]。
在mine.h中进行一些文件引入和定义及声明

mine.h
#ifndef _MINE_H_
#define _MINE_H_
#pragma warning (disable:4996)
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<time.h>
#define ROW 12
#define COL 12
#define MINE_NUM 20
#define TOTAL 100
void ShowBoard(char board[][COL], int row, int col);
void SetMine(char mine[][COL], int row,int col,int count);
char GetMine(char mine[][COL], char board[][COL], int row, int col);//char ->'0'-'8'
void Game();

#endif

在mine.c中进行扫雷游戏的实现
SetMine() :对mine[ROW][COL]进行埋雷操作
ShowBoard():玩家所见到的游戏界面
GetMine():当未踩到雷时,显示四周雷的个数,如果四周雷的个数为0,则对周围雷的个数进行展开。
GetRandIdex():通过time种子,获得埋雷的随机数

实现Game()的过程分析

  • 先创建两个数组,并对其进行初始化和填充
  • 对mine数组进行埋雷操作
  • show一下board数组,让用户见到游戏界面
  • 用户输入位置,判断输入是否合法
    在这里插入图片描述
mine.c
#include"mine.h"
int GetRandIdex(int start, int end)
{
	return rand() % (end - start + 1) + start;
}

void SetMine(char mine[][COL], int row, int col,int count)
{
	srand((unsigned long)time(NULL));
	int _count = 0;
	while (_count < count)
	{
		int x = GetRandIdex(1, 10);
		int y = GetRandIdex(1, 10);
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			_count++;
		}
	}
}
void ShowBoard(char board[][COL], int row, int col)
{
	printf("   ");
	int i = 1;
	for (; i <= 10; i++)
	{
		printf("%3d", i);
	}
	printf("\n----");
	for(i = 1; i <= 10; i++)
	{
		printf("---");
	}
	printf("\n");
	for (i = 1; i <= 10; i++)
	{
		printf("%3d|", i);
		int j = 1;
		for (; j <= 10; j++)
		{
			printf(" %c|", board[i][j]);
		}
		printf("\n----");
		int k = 1;
		for (; k <= 10; k++)
		{
			printf("---");
		}
		printf("\n");
	}
}
char GetMine(char mine[][COL],char board[][COL], int row, int col)
{
	board[row][col] = (mine[row - 1][col - 1] + mine[row - 1][col] + mine[row - 1][col + 1] + \
		mine[row][col - 1] + mine[row][col + 1] + mine[row + 1][col - 1] + \
		mine[row + 1][col] + mine[row + 1][col + 1] - 7 * '0');//(+'0'-8*'0')
	if (board[row][col] == '0')
	{
		if (board[row - 1][col - 1] == '?')
			GetMine(mine, board, row - 1, col - 1);
		if (board[row - 1][col] == '?')
			GetMine(mine, board, row - 1, col);
		if (board[row - 1][col + 1] == '?')
			GetMine(mine, board, row - 1, col + 1);
		if (board[row][col - 1] == '?')
			GetMine(mine, board, row, col - 1);
		if (board[row][col + 1] == '?')
			GetMine(mine, board, row, col + 1);
		if (board[row + 1][col - 1] == '?')
			GetMine(mine, board, row + 1, col - 1);
		if (board[row + 1][col] == '?')
			GetMine(mine, board, row + 1, col);
		if (board[row + 1][col + 1] == '?')
			GetMine(mine, board, row + 1, col + 1);
	}
}

void Game()
{
	char mine[ROW][COL];
	char board[ROW][COL];
	memset(mine, '0', sizeof(mine));
	memset(board, '?', sizeof(board));
	SetMine(mine, ROW, COL, MINE_NUM);
	int x = 0;
	int y = 0;
	int count = TOTAL;
	while (1)
	{
		ShowBoard(board,ROW,COL);
		printf("请选择坐标:\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW - 2 && y >= 1 && y <= COL - 2)
		{
			if (mine[x][y] == '1'&& count == TOTAL)
			{
				mine[x][y] = '0';
				SetMine(mine, ROW, COL, 1);
				count--;
			}
			if (mine[x][y] == '0')
			{
				GetMine(mine, board, x, y);
				count--;
				if (count <= 20)
				{
					printf("恭喜你,你已经获得了胜利!\n");
					break;
				}
			}
			else
			{
				printf("不好意思,你已经被炸死了!\n");
				ShowBoard(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("你输入的坐标有误,请重新输入:\n");
		}
	}
}

主函数实现,实现menu函数让用户进行选择进行游戏(调用Game()进入扫雷游戏)或退出游戏(选择2之间break退出循环)

main.c
#include"mine.h"

void Menu()
{
	printf("###########################\n");
	printf("###1.Play         2.Exit###\n");
	printf("###########################\n");
	printf("Please Select:");
}

int main()
{
	int quit = 0;
	int select = 0;
	while (!quit)
	{
		Menu();
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Game();
			break;
		case 2:
			printf("拜拜!");
			quit=1;
		default:
			printf("选择错误,请重新选择:");
			break;
		}
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44930562/article/details/90376523