C语言实现——简版扫雷

继续延续书写小游戏的想法,这次为大家带来简易版的扫雷行动

有任何问题都可以私信小编哟minghanhan778

C语言实现——简版扫雷_第1张图片

C语言实现——简版扫雷_第2张图片

目录

一、扫雷游戏预估功能分析

二、扫雷游戏各功能实现

三、扫雷游戏代码呈现

总结


一、扫雷游戏预估功能分析

像写三子棋一样,做一定的提前分析,分析出要有哪些初步的功能,提前定义好常量,不能把代码写死!

首先,扫雷肯定要埋雷,那么要将有雷和没雷进行区分,第一个想到的就是一个二维数组!其次面向于玩家,要进行选点排雷,那么肯定需要另外一个二维数组进行排查,所以经过分析,我们核心就是对两个二维数组进行一系列操作!在二维字符数组和普通的二维整型数组,我选用了可以更加灵活的二维字符数组,字符数组对于放入内容更加多样化,相信屏幕前的你也这么认为吧!

C语言实现——简版扫雷_第3张图片

有了“三子棋”的经验,扫雷看起来也没有那么复杂。 

需要的功能如下:

一个菜单 menu();

一个进入游戏的game();

扫雷打印 DisplayBoard();

每次玩之前的初设数组InitBoard();

进行随机布雷的SetMine();

玩家进行排雷的FindMine();

......

重点

而我想补充的是,我们可以分文件进行书写代码,例如一个text1.c中进行主函数的书写,一个game.c进行各类函数的书写,一个game.h的头文件进行函数的各项声明!

C语言实现——简版扫雷_第4张图片

原因其实很简单,分三块内容写,能让你清晰的知道你写了什么,还有社么没写,逻辑更加明了,不至于在一个文件内上下翻转鼠标滚轮,找半天也不知道在哪里,甚至有的时候,找到了都不知道改什么了非常痛苦! 一旦分开,你在game.h中因为要写函数的声明,所以你可以清晰的知道写了哪些函数,而不用乱翻一个文件,找来找去!而在game.c中在去写要书写的函数,与主函数分割公开,实现清晰不凌乱!   想要实现清晰的思路,只需要简单的几步就是在两个.c文件中加上includ"game.h"即可,注意!“”不是<>,只有库函数才用<>

C语言实现——简版扫雷_第5张图片

二、扫雷游戏各功能实现

首先我们知道,玩家在选择一个位置后,要先判读是不是雷!如果不是雷就要判断,在他周围的八个格里有几个雷!但是一旦选择的坐标在边边角角上,进行排查的时候就很容易越界!(吃过亏的宝子们一定知道我在说什么吧,全是泪啊,痛哭saaaad)

tips:解决的办法就是在定义数组的时候,多加一圈,例如要写9*9的扫雷游戏,那么我就多加一圈,变成11*11的数组,把外围的数组设置成“无雷”,这样及不妨碍我们正常书写排查雷的函数,也不用在提心吊胆的写,害怕数组越界!听懂掌声谢谢!

其次排查雷的函数怎么写呢,以及如何判定游戏胜利,都是关键的问题

三、扫雷游戏代码呈现

头文件——game.h  代码如下: 

#pragma once
#include
#include
#include
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EasyMineCount 10
void InitBoard(char board[ROWS][COLS], int rows, int cols,char ch);

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);

源文件——game.c 代码如下:

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char ch) {

	for (int i = 0; i < rows; i++) {
		for (int j = 0; j < cols; j++) {
			board[i][j] = ch;
		}
	}
}


void DisplayBoard(char board[ROWS][COLS], int row, int col) {

	int j = 0;
	int i = 0;
	printf("*****扫雷游戏*****\n");
	for (j = 0; j <= col; j++) {
		printf("%d ", j);
	}
	printf("\n");
	for (int i = 1; i <= row; i++) {
		printf("%d ", i);
		for (int j = 1; j <= col; j++) {
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("*****扫雷游戏*****\n");
}

void SetMine(char board[ROWS][COLS], int row, int col) {

	int count = EasyMineCount;
	while (count) {
		//随机数范围1-9
		int x = rand() % row + 1;
		int y = rand() % col + 1;
			if (board[x][y] == '0') {
				board[x][y] = '1';
				count--;
		}
	}

}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
	int x = 0;
	int y = 0;
	int count = 0;
	int i = 0;
	int j = 0;
	int win = 0;
	while (win < (row * col - EasyMineCount)) {
		printf("输入排雷坐标:>");
		scanf("%d%d", &x, &y);
		count = 0;
		if (x >= 1 && x <= row && y >= 1 && y <= col) {
			if (mine[x][y] == '1') {
				printf("抱歉您踩到雷了,被炸死啦saaaaad游戏结束!\n");
				DisplayBoard(mine, row, col);
				return;
			}
			win++;
			for (i = x - 1; i <= x + 1; i++) {
				for (j = y - 1; j <= y + 1; j++) {
					if (mine[i][j] == '1') {
						count++;

					}
				}
			}
			show[x][y] = count + '0';
			DisplayBoard(show, row, col);
		}
		else {
			printf("输入坐标不合法,请重新输入坐标!\n");
		}
	}
	printf("恭喜你避开所有雷♥\n");
}

源文件——text1.c 代码如下:

#define _CRT_SECURE_NO_WARNINGS
#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};//排查
	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');

	//设置雷
	SetMine(mine, ROW, COL);
	
	//打印
	DisplayBoard(show, ROW, COL);
	//DisplayBoard(show, ROW, COL);
	//选坐标找雷
	FindMine(mine,show,ROW,COL);

}
int main() {
	srand((unsigned int)time(NULL));
	int input = 0;
	do {
		
		menu();
		printf("\n请选择-->");
		scanf("%d", &input);

		switch (input) {
		case 1 :
			game();
			break;
		case 0 :
			printf("再见!退出游戏!\n");
			break;
		default:
			printf("输入有误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}


总结

简易版扫雷,到此为止,之后会续更其他小游戏和知识点分享,尽情期待!♥

你可能感兴趣的:(c语言,visual,studio,code)