扫雷游戏的实现

要实现扫雷,首先应该有一个基本的游戏菜单,打印我们的游戏开始选项和退出游戏选项,当用户选择玩游戏,在运行游戏函数,在玩完一把之后应该再次打印菜单询问玩家是否要再来一把,这个可以使用do while语句循环来实现。

重点在于游戏函数的算法实现,包括雷的随机设置与存储,9*9的扫雷界面的初始化,当我们选择试探一个格子我们应该统计这个格子周围的8个坐标有多少雷,因此还要实现排查雷函数。

再深层次的思考,如果试探边界的坐标是否有雷,我们再来统计周围8个坐标可能会越界,与其每次点击都判断周围坐标是否越界,不如我们设置为11*11的雷盘,并且在最外围一圈保证无雷,这样就可以正确反馈周围雷数量的同时提高效率。

上面是一些开始的思路。直接展示代码

头文件"game.h"

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9 
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 80

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

//雷盘初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);

//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col);

//布置雷
void SetMine(char board[ROWS][COLS],int row,int col);

//扫雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.


源文件game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
	int i = 0;
	int j = 0;
	for(i = 0;i <rows ;i++)
	{
		for(j = 0;j<cols;j++)
		{
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
	int i = 0;
	int j = 0;
	//打印列号
	for(j = 0;j <= col;j++)
	{
		printf("%d ",j);
	}
	printf("\n");
	for(i = 1;i <= row;i++)
	{
		//打印行号
		printf("%d ",i);
		for(j = 1;j <= col;j++)
		{
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char board[ROWS][COLS],int row,int col)
{
	int count = EASY_COUNT;//10棵
	while(count)
	{
		int x = rand()%row+1; //使雷横纵坐标处于1-9
		int y = rand()%col+1;
		if(board[x][y]== '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

//'3'-'0'=3以此类推

int Get_mine_count(char mine[ROWS][COLS],int x,int y)
{
	int sum = 0;
	int i = 0;
	int j = 0;
	for(i = x-1;i<=x+1;i++)
	{
		for(j = y-1;j<=y+1;j++)
		{
			sum = sum + (mine[i][j]-'0');
		}
	}
	return sum;
}

void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while(win < row*col-EASY_COUNT )
	{
		printf("美女,请输入你想排查的坐标:");
		scanf("%d,%d",&x,&y);
		if(x>=1 && x <= row && y>=1 && y<=col)
		{
			//坐标合法
			//踩雷
			if(mine[x][y] == '1')
			{
				printf("很遗憾,此处是雷区,但是黑骑士挡在了你的身前\n");
				printf("再来一把,救回忠心耿耿的黑骑士吧!\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			//未踩雷
			else
			{
				int count = Get_mine_count(mine,x,y);
				show[x][y] = count+ '0';
				DisplayBoard(show,row,col);
				win++;
			}
		}
		else
		{
			printf("这不合法,公主请重新输\n");
		}
	}
	if(win == row*col-EASY_COUNT )
	{
		printf("赢了!你太强了!\n");
		DisplayBoard(mine,ROW,COL);
	}
}

//实现一点一大片的效果,连锁判断,应该使用递归
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.


源文件test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

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

void game()
{
	//雷的信息存储
	//1.布置好的雷的信息
	char mine[ROWS][COLS] = {0};
	//2.排查出的雷的信息
	char show[ROWS][COLS] = {0}; 
	//初始化
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');
	//打印雷盘
//	DisplayBoard(mine,ROW,COL);
	DisplayBoard(show,ROW,COL);
	//布置雷
	SetMine(mine,ROW,COL);
	DisplayBoard(mine,ROW,COL);
	//扫雷
	FindMine(mine,show,ROW,COL);

}

void test()
{
	int input= 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			printf("游戏开始!\n");
			game();
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;	
		}
		/*if(input == 0)
		{
			printf("游戏结束!\n");
			break;
		}else if(input == 1)
		{
			printf("游戏开始!\n");
			game();
		}*/
	}while(input);
}

int main()
{
	test();
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.


运行结果:

8.7C语言学习日志_扫雷