使用C语言实现扫雷游戏基础版(最基础的练手项目)

一.主要实现的功能要求

• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷
◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束
◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束
简单的游戏界面
在这里插入图片描述

二 .解题思路及代码实现

在这里插入图片描述

1.将功能按照模块进行划分,最终以函数的形式进行实现。
2.要完成那些函数:菜单函数,游戏函数(棋盘初始化函数,棋盘展示函数,设置类函数,排查雷函数,雷的个数计数函数)
3.按照游戏逻辑在含有main函数的源文件中调用自定义的函数。

test.c源文件:主要的执行文件

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <time.h>
#include "game.h"//自己定义的函数头文件,在调用的时候,需要使用你双引号引起来。
//排雷游戏的书写,先进行主要逻辑的框架书写。
//1.菜单打印
//2.按照输入的值,选择是否要玩游戏
//3.可以进行重复游戏
void menu();
void game();
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);

		switch (input) 
		{
		case 1:
			game();
			break;
		case 0:
			printf("欢迎下次光临!!!\n");
			break;
		default:
			break;

		}



	} while (input);

	return 0;
}
void menu(void)
{
	printf("********扫雷游戏********\n");
	printf("********1.play*******\n");
	printf("********0.exit*******\n");
	printf("***********************\n");

}
//游戏功能要完成哪些功能?
//1.初始化棋盘
// (1)需要两个棋盘,一个用来存储雷的位置,另一个用来初始化棋盘
// (2)棋盘是9行9列,但是在这里打印11行11列,这样在排查雷的时候完全不需要考虑边界问题
// 相当于在棋盘周围,全部放上数字字符0
//2.打印棋盘
// (1)相当于将初始化后的数组给答应出来
// (2)为了更好地进行扫雷,所以要进行行列标注
// 
//3.布置雷
//  (1)产生随机数
// (2)重复设置10个雷
// (3)递减
// 
//4.排查雷
//(1)输入的坐标在棋盘的范围之内
//(2)是否是雷?是游戏结束,不是,则统计周围雷的个数,继续判断
//(3)最终所有的格子被点完,则退出循环
void game()
{
	char mine[ROWS][COLS];//布置雷的信息
	char show[ROWS][COLS];//存放排查出雷的个数

	inital_board(mine, ROWS, COLS,'0');//初始化mine全为字符零
	inital_board(show, ROWS, COLS,'*');//初始化show全为字符*
	display_board(show,ROW,COL);//打印的时候只需要,打印九成九的就可以了
	Set_Mine(mine, show, ROW, COL);//设置雷
	display_board(mine, ROW, COL);//打印的时候只需要,打印九成九的就可以了

	Find_Mine(mine, show, ROW, COL);//排查雷
	//set_mine();
	//find_mine();
}

game.h函数声明和数据类型定义文件

#include <stdio.h>
//文件中所需要的数据类型和函数声明
#define ROW 9
#define COL 9
#define ROWS ROW+2//在进行全局变量的时候一定不能加;
#define COLS COL+2
#define EASYCOUNT 10
void inital_board(char board[ROWS][COLS], int row, int col, char set);
void display_board(char board[ROWS][COLS], int row, int col);
void Set_Mine(char board[ROWS][COLS],int row,int col);
void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void Get_MineCount(char mine, int row, int col);

game.c自定义函数

#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"
#include <time.h>
#include <stdlib.h>
//函数的实现
void inital_board(char board[ROWS][COLS], int row, int col, char set)
{
	int i=0;//对于新命名的变量一定要进行初始化
	for (i; i < ROWS; i++)
	{
		int j=0;//为什么要对j进行重复初始为零?因为从每一行都要打印该列的元素
		for (j; j <COLS; j++)
		{
			board[i][j] = set;
		}
	}
	
}
void display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("---------扫雷游戏--------\n");
	for (i; i <=ROW; i++)
	{
		printf("%d  ", i);
	}
	printf("\n");

	for (i=1; i <=ROW; i++)
	{
		printf("%d  ", i);
		int j = 0; 
		for (j=1; j <=COL; j++)
		{
			printf("%c  ", board[i][j]);
			
		}
		printf("\n");
	}
}
void Set_Mine(char board[ROWS][COLS], int row, int col)
{
	int count = EASYCOUNT;
	while (count)
	
	{ 
		int i = 0;
		int j = 0;
		i = rand() % ROW + 1;
		j = rand() % COL + 1;
		if (board[i][j] == '0')
		{
			board[i][j] = '1';
			count--;

		}

	}
}
static int GetMineCount(char mine[ROWS][COLS], int row, int col)//row,col为排查雷输入的坐标
{
	int x = row-1;
	int y = col-1;
	int count = 0;
	for (x=row-1; x<=row+1; x++)//
	{
		for (y=col-1; y<=col+1; y++)
		{
			
			//如果该坐标周围的前一行/后一行/前一列/后一列当中点的字符为1则加一
			if ((x == row - 1 || x == row +1|| y == col-1 || y == col+1)&& mine[x][y] == '1')
			{
				count++;
			}
		}
	}
	return count;
}


 void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < ROW * COL - EASYCOUNT)
	{
		printf("请输入你要排查的坐标:\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (mine[x][y] == '1')
			{
				printf("很抱歉,您被炸死了\n");
				display_board(show, ROW, COL);
				break;
			}
				
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count+'1'-1;
				display_board(show, ROW, COL);
				win++;
			}

		}
		else
			printf("非法坐标,请重新输入。\n");

	}
	if (win == ROW * COL - EASYCOUNT)
	{
		printf("恭喜你,排雷成功\n");
	}

	
	
}

三.总结

第一次完成,几百行的代码,作以下的几点总结。1.代码的书写,一定要规范,不要懒,不然你不不知道自己想要表达什么意思,尤其是一些函数当中的参数。2.在写代码的过程中一定要,一边写,一边调试,不然到后面,积累的错误越多,越梳理不出来逻辑。3.虽然逻辑上很简单,但是过程中还是遇见了很多问题,所以不能眼高手低。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值