不成熟扫雷的实现

前言:这次的扫雷游戏的实现,是对前面所有所学内容的总结。

目录

一.开局页面的书写。

二.棋盘的创建。

    1.创建数组

    2.打印棋盘

    3.布置雷

三.玩家扫雷行为的实现


一.开局页面的书写

作为模拟游戏的代码,在我们的程序开始时,首先必须有个开局的页面,同时在页面开始时,我希望玩家用有选择是否要玩的的权利,所以前面的开局界面的代码我是这样写的:

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

}
void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//扫雷
			//游戏框架的实现区域
			break;
		case 0:
			printf("退出游戏\n");
		default:
		{
			printf("选择错误\n");
			break;
		}
		}
	} while (input);
}


int main()
{
	test();
	return 0;
}

现在展示开局页面的代码已经就绪,让我们来看一下效果

不成熟扫雷的实现_第1张图片

 注:下面是都当前代码的主要标释

不成熟扫雷的实现_第2张图片

 二.棋盘的创建

这里是整个博客里面最主要的地方,在接下来的创建棋盘过程中,由于代码过多,我会把代码全部分开,创建三个文件

1.game.h文件:存放头文件,函数的声明,符号的声明

2.game.c文件:存放函数的定义。

3.test.c文件:进行函数的调试

这里的分文件编写代码,我在上一次的博客中有过讲述以Add加法函数来介绍代码的分割_m0_62812354的博客-CSDN博客不太了解的同学可以看看,同时别忘了给他点个赞,谢谢。

不成熟扫雷的实现_第3张图片

 1.创建数组

 不成熟扫雷的实现_第4张图片

 由这个图我们很明显可以感受到要打印出棋盘,应该是用二维数组。

      首先我们来讲一下,如何实现藏有地雷的扫雷棋盘,在我的代码中,我的思想是创建两个棋盘,一个是底层的,可以清楚的看到哪里有地雷的棋盘,一个是展示给玩家看的,经过加工的棋盘,玩家通过显露在外面的棋盘所线路的信息,来推测底层棋盘中地雷存放的位置。

不成熟扫雷的实现_第5张图片

       这里使用0 1来表示有无地雷的原因我后面会提到,用 * 是为了遮住地雷的位置。

因为在表层棋盘里,我们要用 * 来表示位置,而底层棋盘与表层棋盘我希望它们可以相互照应,所以,两个期盼的打印都是用char类型

不成熟扫雷的实现_第6张图片

 2.打印棋盘

但这里还有个问题,我们知道扫雷游戏有提示你,你所点击的区域周围有几个地雷,当这个区域在中间还好说,但是如果在边上的话,如果你想要排查雷的个数时势必会有数组越界的问题,那我们应该怎样解决这个问题呢?

这里有个办法就是扩大棋盘(或者是限制区域),也就是说,我可以通过你扩大我棋盘的面积,我只给你打印了9*9的棋盘让你进行玩耍,但实际上,我真正的棋盘应该是11*11的大小,你所进行操作的范围始终在我棋盘的中间。

 不成熟扫雷的实现_第7张图片

所以有下面的代码

//这是在test.c里的代码
void menu()
{
	printf("***************************\n");
	printf("***************************\n");
	printf("*********  1.play  ********\n");
	printf("*********  0.exit  ********\n");
	printf("***************************\n");
	printf("***************************\n");

}

void game()
{
	
	//创建数组
	char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
	char show[ROWS][COLS] = { 0 };//存放排查出的信息

	//初始化mine数组为全字符‘0’
	Initboard(mine, ROWS, COLS, '0');
	//初始化show数组为全字符‘*’
	Initboard(show, ROWS, COLS, '*');
    //打印棋盘
    Displayboard(mine, ROW, COL);
	Displayboard(show, ROW, COL);
}
void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//扫雷
			game();
			break;
		case 0:
			printf("退出游戏\n");
		default:
		{
			printf("选择错误\n");
			break;
		}
		}
	} while (input);
}


int main()
{
	test();
	return 0;
}

 不成熟扫雷的实现_第8张图片


//这是在game.c里的代码
#include 

#include "game.h"

void Initboard(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 Displayboard(char board[ROWS][COLS], int row, int col)
{
	//1-9
	int i = 0;
	int j = 0;
	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 ", board[i][j]);
		}
		printf("\n");
	}
}

//这是game.h里的代码
#include 
#define ROW 9
#define COL 9
#define EASY_COUNT 10

#define ROWS ROW+2
#define COLS COL+2
//3.函数的声明
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char set);
 
//打印棋盘
void Displayboard(char board[ROWS][COLS],int row,int col);

 不成熟扫雷的实现_第9张图片

这三份代码组合的效果如下

不成熟扫雷的实现_第10张图片

3.布置雷

这一块涉及到一些其他知识由于篇幅过长,我将会在下一次的博客中进行讲述,在这里大家只要知道,这里是通过产生随机坐标来存放地雷的

#define _CRT_SECURE_NO_WARNINGS  1
//这是在test.c里的代码
#include "x.h"
void menu()
{
	printf("***************************\n");
	printf("***************************\n");
	printf("*********  1.play  ********\n");
	printf("*********  0.exit  ********\n");
	printf("***************************\n");
	printf("***************************\n");

}

void game()
{

	//创建数组
	char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
	char show[ROWS][COLS] = { 0 };//存放排查出的信息

	//初始化mine数组为全字符‘0’
	Initboard(mine, ROWS, COLS, '0');
	//初始化show数组为全字符‘*’
	Initboard(show, ROWS, COLS, '*');
	//打印棋盘
	//Displayboard(mine, ROW, COL);
	//Displayboard(show, ROW, COL);


//布置雷
	Setmine(mine, ROW, COL);
	Displayboard(show, ROW, COL);
	Displayboard(mine, ROW, COL);
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//扫雷
			game();
			break;
		case 0:
			printf("退出游戏\n");
		default:
		{
			printf("选择错误\n");
			break;
		}
		}
	} while (input);
}


int main()
{
	test();
	return 0;
}

 不成熟扫雷的实现_第11张图片


#define _CRT_SECURE_NO_WARNINGS  1
#include 
//这是game.c里的代码
#include "x.h"//x.h是我随意命名的头文件的名字

void Initboard(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 Displayboard(char board[ROWS][COLS], int row, int col)
{
	//1-9
	int i = 0;
	int j = 0;
	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 ", board[i][j]);
		}
		printf("\n");
	}
}
void Setmine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	//随机 横1-9 纵1-9
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

不成熟扫雷的实现_第12张图片


#pragma once
//这是game.h里的代码
#include 
#include 
#include 


#define ROW 9
#define COL 9
#define EASY_COUNT 10

#define ROWS ROW+2
#define COLS COL+2
//3.函数的声明
//初始化棋盘
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 mine[ROWS][COLS], int row, int col);

 效果如下

不成熟扫雷的实现_第13张图片三.玩家扫雷行为的实现

,由前面的图看,我已经为每个数字的坐标做好了注释,那么接下来玩家就可以通过输入坐标的形式进行扫雷,

#pragma once
//game.h里面包含的东西
//1.头文件的包含
#include 
#include 
#include 





//2.符号的声明

#define ROW 9
#define COL 9
#define EASY_COUNT 10

#define ROWS ROW+2
#define COLS COL+2
//3.函数的声明
//初始化棋盘
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 mine[ROWS][COLS],int row,int col);

//排雷
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

#define _CRT_SECURE_NO_WARNINGS  1
#include 

#include "game.h"

void Initboard(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 Displayboard(char board[ROWS][COLS], int row, int col)
{
    //1-9
    int i = 0;
    int j = 0;
    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 ", board[i][j]);
        }
        printf("\n");
    }
}

void Setmine(char mine[ROWS][COLS], int row, int col)
{
    int count = EASY_COUNT;
    //随机 横1-9 纵1-9
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;

        if (mine[x][y] == '0')
        {
            mine[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 win = 0;
    while (win");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
        {
            if (mine[x][y] == '1')
            {
                printf("很遗憾你被炸死了\n");
                Findmine(mine, show, ROW, COL);
                break;
            }
            else
            {
                //计算x,y坐标周围有几个雷
                int n = get_mine_count(mine, x, y);
                show[x][y] = n + '0';
                Displayboard(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("请输入合法的坐标\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你");
        Displayboard(mine, ROW, COL);
    }
}

int get_mine_count(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';
}


#define _CRT_SECURE_NO_WARNINGS  1

#include "game.h"
void menu()
{
	printf("***************************\n");
	printf("***************************\n");
	printf("*********  1.play  ********\n");
	printf("*********  0.exit  ********\n");
	printf("***************************\n");
	printf("***************************\n");

}


void game()
{
	
	//创建数组
	char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
	char show[ROWS][COLS] = { 0 };//存放排查出的信息

	//初始化mine数组为全字符‘0’
	Initboard(mine, ROWS, COLS, '0');
	//初始化show数组为全字符‘*’
	Initboard(show, ROWS, COLS, '*');

	//打印棋盘
	/*Displayboard(mine, ROW, COL);
	Displayboard(show, ROW, COL);*/
	//布置雷
	Setmine(mine,ROW,COL);
	Displayboard(show, 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:
			//扫雷
			game();
			break;
		case 0:
			printf("退出游戏\n");
		default:
		{
			printf("选择错误\n");
			break;
		}
		}
	} while (input);
}


int main()
{
	test();
	return 0;
}

效果如下:

不成熟扫雷的实现_第14张图片

这样我们就完成了一个并不成熟的扫雷。

最后,喜欢的记得点一个赞,谢谢

你可能感兴趣的:(c语言)