0
点赞
收藏
分享

微信扫一扫

扫雷C语言写法详解

那小那小 2022-02-10 阅读 114

        相信大家对扫雷一定都不陌生吧!但是你敢信仅仅使用一些C语言的初阶基础知识就能够制作一个扫雷简单小游戏?hhh,今天,我将带领大家一起走进扫雷,探究其基础算法奥秘。

一、基本思路

首先,既然是玩游戏,我们应该设计相应的菜单。

输入1后继续让玩家选择游戏难度:

 

char** show_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));//二维数组动态内存分配

for (int i = 0; i < ROW + grade * 4; i++) {
	show_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
	memset(show_board[i], ' ', (COL + grade * 4));//数组全部赋值为空格
}

char** mine_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));

for (int i = 0; i < ROW + grade * 4; i++) {
	mine_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
	memset(mine_board[i], '0', (COL + grade * 4));//数组全部赋值为‘0’
}

 二、代码实现

Step1.画图

Step2. 埋雷

static void SetMines(char **board,char **lei_board,int grade)
{
	int i = 1;
	int x, y;
	while (i <= NUM+grade*20) {
		x = rand() % (ROW-2+4*grade) + 1;
		y = rand() % (COL-2+4*grade) + 1;
		if (board[x][y] != BOOM) {
			board[x][y] = BOOM;
			lei_board[x][y] = '*';
			i++;
		}
	}
}

Step3.计算周围雷的个数

统计函数直接通过简单的函数返回来实现:

static int CountMine(char **board,int x,int y)
{
	return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
		board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + \
		board[x + 1][y] + board[x + 1][y + 1] - 8 * '0';
}

 三、完整代码

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

#define BOOM '1'
#define ROW 8
#define COL 8
#define NUM 10

static void SetMines(char **board,char **lei_board,int grade)//埋雷
{
	int i = 1;
	int x, y;
	while (i <= NUM+grade*20) {
		x = rand() % (ROW-2+4*grade) + 1;
		y = rand() % (COL-2+4*grade) + 1;
		if (board[x][y] != BOOM) {
			board[x][y] = BOOM;
			lei_board[x][y] = '*';
			i++;
		}
	}
}
static void Showboard(char **board,int grade)//面板制作
{
	printf(" ");
	for (int i = 1; i <= ROW-2+4*grade; i++) {
		printf(" %3d", i);
	}
	printf("\n");

	for (int i = 1; i <= ROW-2+4*grade; i++){
		printf("   ");
		for (int k = 1; k <= COL-2+4*grade; k++) {
			printf("----");
		}
		printf("\n");
		printf("%2d|",i);
		for (int j = 1; j <= COL-2+4*grade; j++){
			printf(" %c |",board[i][j]);
		}
		printf("\n");
	}
	printf("   ");
	for (int k = 1; k <= COL-2+4*grade; k++) {
		printf("----");
	}
	printf("\n");
}
static int CountMine(char **board,int x,int y)//统计周围雷的数目
{
	return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
		board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + \
		board[x + 1][y] + board[x + 1][y + 1] - 8 * '0';
}

void Game(int grade)//游戏函数,grade为游戏难度等级
{
	
	char** show_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
	for (int i = 0; i < ROW + grade * 4; i++) {
		show_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
		memset(show_board[i], ' ', (COL + grade * 4));
	}
	char** mine_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
	for (int i = 0; i < ROW + grade * 4; i++) {
		mine_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
		memset(mine_board[i], '0', (COL + grade * 4));
	}
	char** lei_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
	for (int i = 0; i < ROW + grade * 4; i++) {
		lei_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
		memset(lei_board[i], ' ', (COL + grade * 4));
	}
	
	SetMines(mine_board,lei_board,grade);
	int x = 0, y = 0;
	int total = 0;
	while (1)
	{
		
		Showboard(show_board, grade);
		printf("请输入坐标:");
		//printf("%d", '*');
		scanf("%d %d", &x, &y);
		if (!(x > 0 && x <= ROW + 4 * grade - 2 && y > 0 && y <= COL + 4 * grade - 2)) {
			printf("扫雷的位置有问题!\n");
			continue;
		}
		if (show_board[x][y] != ' ') {
			printf("该位置已经扫过了!\n");
			continue;
		}
		if (mine_board[x][y] == '1') {
			printf("对不起,你被炸死了!\n");
			Showboard(lei_board, grade);
			break;
		}
		else {
			int count = CountMine(mine_board, x, y);
			show_board[x][y] = count + '0';
			total++;
			system("cls");
		}
		if ((ROW - 2) * (COL - 2) - total <= NUM) {
			printf("恭喜你,游戏通过!\n");
			break;
		}
	}
	for (int i = 0; i < ROW + grade * 4; i++) {
		free(show_board[i]);
	}
	free(show_board);
	for (int i = 0; i < ROW + grade * 4; i++) {
		free(mine_board[i]);
	}
	free(mine_board);
	for (int i = 0; i < ROW + grade * 4; i++) {
		free(lei_board[i]);
	}
	free(lei_board);
}

void Menu()
{
	printf("#########################################\n");
	printf("##                 1.play              ##\n");
	printf("##                 0.exit              ##\n");
	printf("#########################################\n");
}

int main()
{
	srand((unsigned long)time(NULL));
	int quit = 0;
	while (!quit)
	{
		int select;
		Menu();
		printf("请输入游戏选项:");
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			printf("#########################################\n");
			printf("##                 1.easy              ##\n");
			printf("##                 2.middle            ##\n");
			printf("##                 3.difficult         ##\n");
			printf("#########################################\n");
			printf("请输入游戏难度:");
			scanf("%d", &select);
			switch (select)
			{
			case 1:
				Game(0);
				break;
			case 2:
				Game(1);
				break;
			case 3:
				Game(2);
				break;
			}
			break;
		case 0:
			quit = 1;
			printf("感谢使用!");
			break;
		default:
			printf("输入有误,请重新输入!\n");
			break;
		}

	}
	
}

        期待大家在这个代码的基础上加入更多创新与改进,写出用户体验感更好,更加智能高端的扫雷程序!!!

 

举报

相关推荐

0 条评论