扫雷游戏的设计与实现

扫雷游戏的设计与实现

  • 扫雷游戏的介绍与规则
  • 扫雷游戏的具体实现
    • 1.打印游戏菜单
    • 2.创建置雷图与展示图
    • 3.初始化两张地图
    • 4.布置地雷
    • 5.打印展示图(置雷图)
    • 6.排查雷
    • 7.统计周围雷数
    • 8.游戏结果
      • test.c
      • game.c
      • game.h

扫雷游戏的介绍与规则

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

扫雷游戏的具体实现

1.打印游戏菜单

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

2.创建置雷图与展示图

在游戏开始之前,我们需要创建两个二维数组,一个用来存放布置地雷的信息,一个用来给玩家展现所需要的信息。

    char mine[ROWs][COLs];//置雷图
	char show[ROWs][COLs];//展示图

3.初始化两张地图

因为两张地图规格相同,因此我们用同一个函数来初始化即可,又由于两张地图的功能不同,我们要将它们赋为不同的元素,所以,我们需要单独传一个参数,用来控制这个不同的元素

void init_board(char board[ROWs][COLs], int rows, int cols,char ret)
{
	int i;
	for (i = 0; i < rows; i++)
	{
		int j;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;//初始化
		}
	}
}

4.布置地雷

通过生成随机数来控制地雷生成的位置
需要将生成的随机数转化为地图相应的规格之内
还需注意是否重复布置地雷

void set_mine(char mine[ROWs][COLs], int row, int col)
{
	int count = easy_count;//将常量的值转化为变量
	while (count)
	{
		int x = rand() % row + 1;//生成行随机值
		int y = rand() % col + 1;//生成列随机值
		if (mine[x][y] == '0')//判断是否重复置雷
		{
			mine[x][y]='1';//布置地雷
			count--;//布置完成一个雷
		}
	}
}

5.打印展示图(置雷图)

void print_board(char board[ROWs][COLs], int row, int col)
{
	int i, j;
	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");
	}
}

6.排查雷

现在是正式进入玩游戏的阶段

1.选择一个想要排查的坐标
2.在确认坐标过后,对坐标的合法性进行判断
3.判断是否重复排查

有两种结果

(1)踩雷
打印置雷图
游戏结束
(2)未踩雷
统计该坐标地雷的个数
将其赋给展示图相应的元素
打印展示图
游戏继续

7.统计周围雷数

在置雷图中,地雷为‘1’,非地雷为‘0’,因此,可以将周围的字符相加,最后转化为数字

int get_num(char mine[ROWs][COLs], int x, int y)
{
	return mine[x-1][y-1] + mine[x-1][y] + mine[x-1][y+1]
		+ mine[x][y-1] + mine[x][y+1]+mine[x+1][y-1]
		+mine[x+1][y]+mine[x+1][y+1]-'0'*8;
}

8.游戏结果

只有两种情况
1.被炸死
2.排雷成功

创建一个变量,初始化为0,用来统计非雷的个数
每成功排雷一次,变量加一,当达到非雷个数时,排雷成功

void find_mine(char mine[ROWs][COLs], char show[ROWs][COLs], int row, int col)
{
	int x, y,win=0;
	while (win<row*col-easy_count)
	{
		printf("请输入坐标\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("坐标已被排查\n");
				continue;
			}
			if (mine[x][y] == '1')
			{
				system("cls");
				printf("很抱歉,你被炸死了\n");
				print_board(mine,ROW,COL);
				break;
			}
			else
			{
				int n = get_num(mine,x,y);
				show[x][y] = n + '0';
				system("cls");
				print_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
	if (win == row * col - easy_count)
	{
		system("cls");
		printf("恭喜你,排雷成功\n");
		print_board(mine, ROW, COL);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void play()
{
	char mine[ROWs][COLs];
	char show[ROWs][COLs];
	init_board(mine,ROWs,COLs,'0');
	init_board(show, ROWs, COLs,'*');
	//print_board(show,ROW,COL);
	//print_board(mine, ROW, COL);
	set_mine(mine,ROW,COL);
	print_board(mine, ROW, COL);
	print_board(show, ROW, COL);
	//print_board(mine,ROW,COL);
	find_mine(mine,show,ROW,COL);
}

void test()
{
	int sel;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &sel);
		switch (sel)
		{
		case 1:
			system("cls");
			printf("开始游戏\n");
			play();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("没有该选项\n");
			break;
		}
	} while (sel);
}
int main()
{
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
	printf("*****************\n");
	printf("*****1.play******\n");
	printf("*****0.exit******\n");
	printf("*****************\n");
}
void init_board(char board[ROWs][COLs], int rows, int cols,char ret)
{
	int i;
	for (i = 0; i < rows; i++)
	{
		int j;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}
void print_board(char board[ROWs][COLs], int row, int col)
{
	int i, j;
	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 set_mine(char mine[ROWs][COLs], int row, int col)
{
	int count = easy_count;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y]='1';
			count--;
		}
	}
}
int get_num(char mine[ROWs][COLs], int x, int y)
{
	return mine[x-1][y-1] + mine[x-1][y] + mine[x-1][y+1]
		+ mine[x][y-1] + mine[x][y+1]+mine[x+1][y-1]
		+mine[x+1][y]+mine[x+1][y+1]-'0'*8;
}
void find_mine(char mine[ROWs][COLs], char show[ROWs][COLs], int row, int col)
{
	int x, y,win=0;
	while (win<row*col-easy_count)
	{
		printf("请输入坐标\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("坐标已被排查\n");
				continue;
			}
			if (mine[x][y] == '1')
			{
				system("cls");
				printf("很抱歉,你被炸死了\n");
				print_board(mine,ROW,COL);
				break;
			}
			else
			{
				int n = get_num(mine,x,y);
				show[x][y] = n + '0';
				system("cls");
				print_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
	if (win == row * col - easy_count)
	{
		system("cls");
		printf("恭喜你,排雷成功\n");
		print_board(mine, ROW, COL);
	}
}

game.h

#pragma once
#define ROWs 11
#define COLs 11
#define ROW 9
#define COL 9
#define easy_count 80
#include
#include
#include
#include
void menu();
void init_board(char board[ROWs][COLs], int rows, int cols, char ret);
void print_board(char board[ROWs][COLs], int row, int col);
void set_mine(char mine[ROWs][COLs],int row,int col);
void find_mine(char mine[ROWs][COLs], char show[ROWs][COLs],int row,int col);
int get_num(char mine[ROWs][COLs], int x, int y);

你可能感兴趣的:(游戏,算法,c语言)