扫雷小游戏详解

1,打印菜单

输入1就是玩游戏,输入0就是退出游戏;后面会增加标记雷的功能,就是多加一个按键就是了;

游戏是设计循环的,可以一直玩,除非是按0退出游戏,这个就用while和switch一起实现的;

 

2,一个头文件game.h和两个源文件text.c和game.c

game.h头文件是用于放置要用的头文件的,保证了库函数的使用和其他数据的定义,如宏定义;

还有就是主要是用于text.c中的大部分函数的定义;

两个源文件是要引game.h的,要#include "game.h"引用才可以使用头文件game.h中的东西;

text源文件主要是游戏的整体框架,main函数在这里用;game.c中主要是game函数中的函数的实现都在这里实现的;

3.主要的小游戏的代码实现game()函数的详细介绍

3.1棋子的实现(二维数组)

设置一个二维数组用来放置雷和显示扫雷界面等等功能;我们先定义mine[Rows][Cols]这个二维数组设置棋子;再定义一个show的二维数组,大小是一样的,这样的作用是为了雷的布置和雷数量的显示;再定义一个初始化两个数组函数Mine,设置两个for循环将mine数组都初始化为‘0’,show初始化为‘*’;最重要的是把棋盘+2,上下加2,左右也扩展2的大小,主要是为了数雷的个数的时候在边角那里计数时会发生数组的越界访问,故在上下左右都扩大一圈,更方便对雷的计数;

Mine函数的第四个参数是为了将两个数组都初始化为不同的棋盘,想要怎么搞就直接往上传就是了,这样就实现了两个棋盘初始化(就是二维数组里放的数据嘛);

 

3.2棋盘的实现

定义一个Mineboard()函数用于对棋盘的打印;就是直接打印两个二维数组里面的数据嘛,上面已经都实现好了的,直接用printf函数打印就是了,不过直接可以再将棋盘装饰一下,我就是上下两端写了“扫雷游戏”就是了,最有用的是为了方便玩家坐标的输入,我们实现棋盘的时候要把坐标都显示出来,行数和纵数都在棋盘上面和左边显示出来方便玩家对坐标的输入。

3.3雷的设置

雷的随机设置还得用我以前写过的博客“猜数字小游戏”中详细介绍过的,作用就是随机生成数字嘛,我们将随机生成的数字设置为坐标就行;但是注意随机生成的数字范围要在1~row(棋盘的大小,是会发生变化的),所以x=rand()%row+1;这里的+1是为了对应棋盘范围,因为不加1的话x的范围是0~8的;在设置y=rand()%col+1;随机生成雷的坐标,我是设置了10个雷,用循环来控制雷的生成数量嘛;

void Mineset(char mine[Rows][Cols], int row, int col) {
	int n = 10;
	while (n) {
	int x = rand() % row + 1;
	int y = rand() % col + 1;
	if (x <= row && x >= 1 && y <= col && y >= 1) {
		mine[x][y] = '1';
		n--;
	}
	}
}

3.4猜雷(游戏开始)

坐标的输入,首先要求符合棋盘的二维数组的范围符合要求才行,不符合就提醒一下,符合就判这个位置放的是不是雷,要是是的话就直接结束本次扫雷游戏了;要不是雷的话我们就要计算雷的个数是吧;把周围8个位置都看一遍,我这里对雷的设置是‘1’,如果‘1’-‘0’就是1呗,所以看看8个位置加起来再减去8个‘0’就是返回雷的个数,后面放在显示函数show时又加‘0’转换成字符进行雷个数的显示;最后要是把所有雷都排完了我们就赢了,所以除了雷的坐标都点完后就是赢了,所以排雷的时候用while循环,排一个减一个雷嘛,我这里是用坐标数进行循环的,所有的坐标数减去雷的数量不就是所有非雷数量嘛;

int minenum(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] - 8 * '0';

}
void Findmine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) {
	int rets = 0;
	while (rets<row*col-10) {
		int x = 0, y = 0;
		printf("请输入坐标>\n");
		scanf("%d%d", &x, &y);
		if (x <= row && x >= 1 && y <= col && y >= 1) {
			if (mine[x][y] == '1') {
				printf("肯定是失误了,你怎么可能会输?只能再来一局了\n");
				Initshow(show, Row, Col);
				break;
			}
			else
			{
				int ret = minenum(mine, x, y);
				show[x][y] = ret + '0';
				rets++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入:\n");
		}
		Initshow(show, Row, Col);
	}
}

3.5总代码

game.c

#include "game.h"
void Mine(char board[Rows][Cols], int rows, int cols, char set) {
	int i = 0, j = 0;
	for (i = 0; i < rows; i++) {
		for (j = 0; j < cols; j++) {
			board[i][j] = set;
		}
	}
}
void Initshow(char show[Rows][Cols], int row, int col) {
	int i = 0, j = 0;
	printf("--------欢迎来到扫雷游戏--------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++) {
		printf("%d ", i);
		for (j = 1; j <= col; j++) {
			printf("%c ", show[i][j]);
		}
		printf("\n");
	}
	printf("--------欢迎来到扫雷游戏--------\n");
}
void Mineset(char mine[Rows][Cols], int row, int col) {
	int n = 10;
	while (n) {
	int x = rand() % row + 1;
	int y = rand() % col + 1;
	if (x <= row && x >= 1 && y <= col && y >= 1) {
		mine[x][y] = '1';
		n--;
	}
	}
}
int minenum(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] - 8 * '0';

}
void Findmine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) {
	int rets = 0;
	while (rets<row*col-10) {
		int x = 0, y = 0;
		printf("请输入坐标>\n");
		scanf("%d%d", &x, &y);
		if (x <= row && x >= 1 && y <= col && y >= 1) {
			if (mine[x][y] == '1') {
				printf("肯定是失误了,你怎么可能会输?只能再来一局了\n");
				Initshow(show, Row, Col);
				break;
			}
			else
			{
				int ret = minenum(mine, x, y);
				show[x][y] = ret + '0';
				rets++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入:\n");
		}
		Initshow(show, Row, Col);
	}
}

text.c

#include "game.h"
void menu() {
	printf("*************************\n");
	printf("****      1.play     ****\n");
	printf("****      0.exit     ****\n");
	printf("*************************\n");
}
void game() {
	char mine[Rows][Cols] = { 0 };
	char show[Rows][Cols] = { 0 };
	Mine(mine, Rows, Cols,'0');
	Mine(show, Rows, Cols,'*');
	Initshow(show, Row, Col);
	Mineset(mine, Row, Col);
	//Initshow(mine, Row, Col);
	//Mineset(mine, Row, Col);
	Findmine(mine, show, Row, Col);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请输入>\n");
		scanf("%d", &input);
		switch (input) {
		case 1:game();
			break;
		case 0:printf("退出游戏\n");
			break;
		default:
			break;
		}
	} while (input);
	return 0;
}

game.h

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define Row 9
#define Col 9
#define Rows Row+2
#define Cols Col+2
void Mine(char board[Rows][Cols], int rows , int cols, char set);
void Initshow(char show[Rows][Cols], int row, int col);
void Mineset(char mine[Rows][Cols], int row, int col);
void Findmine(char mine[Rows], char show[Rows][Cols], int row, int col);

4.结语

感谢大家的阅读,后面会完善这个小游戏的,增加对雷的标记和周围雷数量为0时候炸开一片的两个功能,让这个小游戏更贴近真正的扫雷游戏;敬请期待!!1

猜你喜欢

转载自blog.csdn.net/qq_68844357/article/details/124595365