扫雷简易版(C语言)

用C语言实现简易版扫雷

文章目录


前言

先简单说明一下游戏玩法,玩家需要在n*n的棋盘里面扫雷,玩家如果点击的位置里面有雷,则游戏结束,反之,该位置则显示周围含有的地雷数量,如此循环,直到玩家找出所有不是雷的位置,则游戏胜利。


一、游戏界面打印

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

#define Easy_mine_count 79

这里是游戏界面的一个设置,这个游戏我打算以一个test.c(游戏的大概逻辑)和一个game.c(游戏的具体实现)以及一个头文件game.h来声明game.c中的函数

下面是游戏界面的代码以及样例展示

void menu()//打印游戏界面
{
	printf("****************\n");
	printf("****************\n");
	printf("****1.play******\n");
	printf("****0.exit******\n");
	printf("****************\n");
	printf("****************\n");
	printf("请输入1开始游戏或者0退出游戏\n");
}

玩家输入1开始游戏,0则退出游戏 

void test()
{
	
	
	int input = 0;
	do {
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1: {
			printf("游戏开始\n");
			game();
			break;
		}
		case 0:
			printf("你已退出游戏,期待下次光临\n");
			break;
		}
	} while (input);
}

界面展示

二、棋盘设置

先将头文件关于棋盘大小以及雷的数量说明

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

#define Easy_mine_count 79

row和col表示玩家玩的棋盘的行数和列数,ROWS和COLS则是底层数组实际大小,由于方便游戏实现,所以我们将数组扩大。

1.棋盘初始化

我将用两个二维数组来实现棋盘,其中一个mine数组用来存放地雷,1则表示是地雷,0则表示不是地雷,另外一个show数组用来展示给玩家看,初始化为*,玩家扫雷后,该位置会显示周围地雷数量。

代码如下(示例):

这是数组初始化函数,可以将给定的字符c放进数组里

void InitBoard(char arr[ROWS][COLS], int row, int col, char c)
{
	int i, j;
	for(i=0;i<=row+1;i++)
		for (j = 0; j <= col+1; j++)
		{
			arr[i][j] = c;
		}
}

mine数组初始化为0

show数组初始化为 * 

//棋盘初始化
InitBoard(mine, ROW, COL, '0');
InitBoard(show, ROW, COL, '*');

2.棋盘埋雷

由于每局游戏的地雷位置都得是随机的,所以我们需要生成两个随机数来确定雷的横坐标和纵坐标,具体代码和埋好雷的棋盘展示如下:

代码如下(示例):

//埋雷
SetMine(mine, ROW, COL,Easy_mine_count);
//展示埋好雷的棋盘
DisplayBoard(mine, ROW, COL);
//埋雷
void SetMine(char arr[ROWS][COLS], int row, int col, int count)
{
	int x, y;
	
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (arr[x][y] != '1')
			{
				arr[x][y] = '1';
				count--;
			}
		}
	}
}

三.打印棋盘

棋盘埋好雷后,就将show数组展示给玩家,具体代码和展示样例如下,为了观察雷是否埋好,下面也会展示埋好雷的棋盘:

//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	printf("--------扫雷---------\n");
	int i, j;
	for (i = 0; i <= row; i++)
		printf("%d ", i);
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("--------扫雷---------\n");
}

四.排查雷

准备工作做好后,玩家则开始输入排查坐标,下面需要两个函数,一个是判断玩家是否踩到雷,如果踩到,则游戏结束,如果没踩到,则展示排查坐标周围的地雷数量,函数GetMine则统计排查坐标附近的地雷数量,并将其输入到对应的show数组中

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int game_count = row*col-Easy_mine_count;
	while (game_count)
	{

		int x, y;
		printf("请输入排查的坐标x(1-%d),y(1-%d)\n", row, col);
		scanf("%d %d", &x, &y);
		if (mine[x][y] == '1')
		{
			printf("很遗憾,你踩到地雷了,我只能说,菜就多练,游戏结束\n");
			printf("这是雷的分布\n");
			DisplayBoard(mine, row, col);
			break;
		}
		else
		{
			int count = GetMine(mine, x, y);
			show[x][y] = count + '0';
			game_count--;
			DisplayBoard(show, row, col);
		}
	}
	if (game_count == 0)
		printf("恭喜你,成功排完所有的雷\n");
}

//获得坐标附近的地雷数量
int GetMine(char arr[ROWS][COLS], int x, int y)
{
	int i, j;
	int count = 0;
	for(i=x-1;i<=x+1;i++)
		for (j = y - 1; j <= y + 1; j++)
		{
			count += arr[i][j] - '0';
		}
	return count;
}

上面就是所有游戏的思路以及代码呈现


总结

游戏的实现不算太难,总的来说就是内容太多,只要肯花时间,相信你也能写出一个高级版的扫雷游戏。

下面给出所有代码展示

tset.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void game()
{
	srand((unsigned int)time(NULL));
	char mine[ROWS][COLS] = { 0 };//存放地雷
	char show[ROWS][COLS] = { 0 };//存放排查后的信息
	//棋盘初始化
	InitBoard(mine, ROW, COL, '0');
	InitBoard(show, ROW, COL, '*');

	//打印棋盘
	DisplayBoard(show, ROW, COL);
	/*DisplayBoard(mine, ROW, COL);*/

	//埋雷
	SetMine(mine, ROW, COL,Easy_mine_count);
	//展示埋好雷的棋盘
	DisplayBoard(mine, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
}

void test()
{
	
	
	int input = 0;
	do {
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1: {
			printf("游戏开始\n");
			game();
			break;
		}
		case 0:
			printf("你已退出游戏,期待下次光临\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

game.c 

#include"game.h"

void menu()//打印游戏界面
{
	printf("****************\n");
	printf("****************\n");
	printf("****1.play******\n");
	printf("****0.exit******\n");
	printf("****************\n");
	printf("****************\n");
	printf("请输入1开始游戏或者0退出游戏\n");
}

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

//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	printf("--------扫雷---------\n");
	int i, j;
	for (i = 0; i <= row; i++)
		printf("%d ", i);
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("--------扫雷---------\n");
}

//埋雷
void SetMine(char arr[ROWS][COLS], int row, int col, int count)
{
	int x, y;
	
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (arr[x][y] != '1')
			{
				arr[x][y] = '1';
				count--;
			}
		}
	}
}
//获得坐标附近的地雷数量
int GetMine(char arr[ROWS][COLS], int x, int y)
{
	int i, j;
	int count = 0;
	for(i=x-1;i<=x+1;i++)
		for (j = y - 1; j <= y + 1; j++)
		{
			count += arr[i][j] - '0';
		}
	return count;
}

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int game_count = row*col-Easy_mine_count;
	while (game_count)
	{

		int x, y;
		printf("请输入排查的坐标x(1-%d),y(1-%d)\n", row, col);
		scanf("%d %d", &x, &y);
		if (mine[x][y] == '1')
		{
			printf("很遗憾,你踩到地雷了,我只能说,菜就多练,游戏结束\n");
			printf("这是雷的分布\n");
			DisplayBoard(mine, row, col);
			break;
		}
		else
		{
			int count = GetMine(mine, x, y);
			show[x][y] = count + '0';
			game_count--;
			DisplayBoard(show, row, col);
		}
	}
	if (game_count == 0)
		printf("恭喜你,成功排完所有的雷\n");
}

game.h 

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu();
#define ROW 9
#define COL 9
#define	ROWS ROW+2
#define	COLS COL+2

#define Easy_mine_count 10
//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int row, int col, char c);

//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col);

//埋雷
void SetMine(char arr[ROWS][COLS], int row, int col, int count);

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

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值