C语言实现低配版“扫雷”小游戏

C语言实现“低配版”——扫雷小游戏

​ 用C语言完成的小游戏——“扫雷”,这是一个有年代感的游戏,经久不衰也恰恰证明了这款游戏的趣味性,接下来,就用我们的所学来实现这个游戏。

​ 游戏例图:

游戏开始
游戏结束

​ 首先,我们应该先思考如何去一步步完成它,开始我们建立3个主要文件。mine

mine_sweeps.c mine_sweeps.h test.c

mine_sweeps.c 用于存放函数体的文件。

mine_sweeps.h 用于存放全局变量和头文件还有mine_sweeps.h中的函数声明

test.c是用来测试游戏的可行性

在test.c搭建基本选项
void menu()
{
	printf(" *******************\n");
	printf(" |     1.play      |\n");
	printf(" |     0.exit      |\n");
	printf(" ******************\n");
}
int main()
{
	srand((unsigned int)time(NULL));//随机数生成函数
	int input = 0;
	do 
	{
		menu();
		printf("plase input number:>");
		scanf("%d", &input);//分支选择
		switch (input)
		{
		case 1://开始游戏
			mine_sweep();
			break;
		case 0://退出游戏
			printf("game over!\n");
			break;
		default://重新输入
			printf("input wrong,plase input again!\n");
			break;
		}

	} while (input);
	return 0;
}

输入不同的数字会有不同的提示,这一点的设计会让玩家清楚现在正处于什么形势。

mine_sweep.h设计函数的实现和理清游戏步骤

#pragma once
//实现游戏需要包含的头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//含雷棋盘
#define ROW 9
#define COL 9
//实际棋盘
#define ROWS ROW+2
#define COLS COL+2
//雷数量
#define MINE 10//控制游戏体验

//初始化数组
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_board(char board[ROWS][COLS], int row, int col);
//排查雷
void find_board(char board[ROWS][COLS],char show[ROWS][COLS],int row,int col);

此文件主要是函数声明和宏,改变其中数字可以把难度提升!!!

“mine_sweeps.c”

里面包含了游戏实现需要的主要函数

初始化棋盘函数,其中传递的字符决定了打印的效果。

//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char set)//set是将函数初始化
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

打印棋盘函数,要注意打印的效果,特别是行号和列好的控制,虽然两个数组是11x11,但是我们实际打印的只有9x9。

//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	//打印列号
	for (i = 0; i <=col; 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");
	}
}

布置雷函数,要使用我们设定好的数量然后放置相同数量的雷,可以设定count等于雷的数量,千万不可以用于++或者–,因为宏不可赋值。

//布置雷
void set_board(char board[ROWS][COLS], int row, int col)
{
	int count = MINE;
	while (count)
	{
		int x = rand() % row + 1;//随机数库函数
		int y = rand() % col + 1;//随机数库函数
		if ('0' == board[x][y])
		{
			board[x][y] = '1';//含雷先设定为字符1
			count--;
		}
	}
}

生成随机数的函数:rand,是跟随srand一起使用的库函数。使用时必须引用 stdilb.h 头文件。srand生成的随机数会被rand接收,不过这个函数生成随机数是需要一个随机数来转换成随机数,这时候就要使用到我们的时间戳——time库函数,使用时必须引用 time.h头文件。这时候在main函数中将一个空指针传递给我们的time(NULL)就可以产生随机数了!!在使用rand时需要产生你需要的数字需要使用算数操作符,比如你需要0~9的数字,只需要rand%10。

排查雷函数主要是用于最后玩家输入的游戏体验,需要合适的提示和界面打印。

//排查雷
void find_board(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;;
	while (win<row*col-MINE)
	{
		printf("please input x y:>");
		scanf("%d %d", &x, &y);
		if (x > 0 && x < row  && y>0 && y < col)
		{
			if ('1' == board[x][y])
			{
				printf("很遗憾,你被炸死了*_*\n");
				print_board(board, ROW, COL);
			}
			else
			{
				//统计雷的个数
				int count=count_board(board, x, y);//返回的值就是该位置九宫格里的含雷数
				show[x][y] = count+'0';
				print_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("x,y wrong,please input again!\n");
		}
	}
	if (win==col*row-MINE)
		printf("YOU WINING!!!\n");
}

统计雷函数不用在mine_sweep.h中声明的函数,因为他是用于排查雷需要的函数,具体如下:

//统计雷
int count_board(char board[ROWS][COLS],int x, int y)
{
	int count = 0; 
		count += '0';
		count=board[x-1][y-1]
			+board[x-1][y]
			+board[x-1][y+1]
			+board[x][y-1]
			+board[x][y]
			+board[x][y+1]
			+board[x+1][y-1]
			+board[x+1][y]
			+board[x+1][y+1]-
			9 * '0';
	return count;
}

以上是每个函数的实现。

具体组成

mine_sweep.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//含雷棋盘
#define ROW 9
#define COL 9
//实际棋盘
#define ROWS ROW+2
#define COLS COL+2
//雷数量
#define MINE 80

//初始化数组
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_board(char board[ROWS][COLS], int row, int col);
//排查雷
void find_board(char board[ROWS][COLS],char show[ROWS][COLS],int row,int col);

mine_sweep.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"mine_sweep.h"

//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char set)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	//打印列号
	for (i = 0; i <=col; 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_board(char board[ROWS][COLS], int row, int col)
{
	int count = MINE;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if ('0' == board[x][y])
		{
			board[x][y] = '1';
			count--;
		}
	}
}

//统计雷
int count_board(char board[ROWS][COLS],int x, int y)
{
	int count = 0; 
		count += '0';
		count=board[x-1][y-1]
			+board[x-1][y]
			+board[x-1][y+1]
			+board[x][y-1]
			+board[x][y]
			+board[x][y+1]
			+board[x+1][y-1]
			+board[x+1][y]
			+board[x+1][y+1]-
			9 * '0';
		/*count=mine[x - 1][y - 1] +
			mine[x][y - 1] +
			mine[x + 1][y - 1] +
			mine[x - 1][y] +
			mine[x + 1][y] +
			mine[x - 1][y + 1] +
			mine[x][y + 1] +
			mine[x + 1][y + 1] - 8 * '0';*/
	return count;
}
//排查雷
void find_board(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;;
	while (win<row*col-MINE)
	{
		printf("please input x y:>");
		scanf("%d %d", &x, &y);
		if (x > 0 && x < row  && y>0 && y < col)
		{
			if ('1' == board[x][y])
			{
				printf("很遗憾,你被炸死了*_*\n");
				print_board(board, ROW, COL);
			}
			else
			{
				//统计雷的个数
				int count=count_board(board, x, y);
				show[x][y] = count+'0';
				print_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("x,y wrong,please input again!\n");
		}
	}
	if (win==col*row-MINE)
		printf("YOU WINING!!!\n");
}

test.c

```#define _CRT_SECURE_NO_WARNINGS 1
#include"mine_sweep.h"

void menu()
{
	printf(" * ————————*\n");
	printf(" |     1.play      |\n");
	printf(" |     0.exit      |\n");
	printf(" * ————————*\n");
}

void mine_sweep()
{
	char board[ROWS][COLS] = { 0 };//带雷
	char show[ROWS][COLS] = { 0 };//不带雷
	//初始化棋盘
	init_board(board, ROWS, COLS,'0');
	init_board(show, ROWS, COLS,'*');
	//打印棋盘
	//print_board(board, ROW, COL);
	print_board(show, ROW, COL);
	//布置雷
	set_board(board, ROW, COL);
	print_board(board, ROW, COL);
	//排查雷
	find_board(board, show, ROW, COL);

}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do 
	{
		menu();
		printf("plase input number:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			mine_sweep();
			break;
		case 0:
			printf("game over!\n");
			break;
		default:
			printf("input wrong,plase input again!\n");
			break;
		}

	} while (input);
	return 0;
}

以上就是该小游戏的全部函数,因为技术有限,并不能完全实现与电脑游戏一模一样的体验。不过我还是会继续深造,努力将他实现成原有的功能,谢谢观看😀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值