扫雷(C语言实现)

用C语言的数组和函数知识简单实现扫雷游戏。

文章目录


前言

用C语言中的数组来实现扫雷游戏中雷的存储,用函数来实现扫雷游戏的各部分功能。


一、扫雷游戏的分析和设计

1.扫雷游戏的分析

1.1 实现功能

(1)菜单:控制游玩和退出

(2)棋盘:打印一个9*9的棋盘界面

  

(3)随机布置雷:默认随机布置10个雷

1.2 游戏玩法

(1)排查雷:通过坐标的方式来排查是否有雷

(2)显示非雷格周围雷的个数:

2.扫雷游戏的设计

2.1 数据结构设计

要实现9*9的棋盘,不难想到用二维数组来实现。

1.如果要显示非雷格周围雷的个数,就要考虑是否越界的问题:

可以选择周围多加一圈防止越界访问,因此要定义11*11的二维数组

2.要设计一份考卷,则要分别设计出问卷答案

   扫雷也是如此,要分别设计出mine棋盘show棋盘

mine棋盘是随机好布置雷的棋盘,show棋盘是给用户看的,用来排查雷的棋盘。

对应的数组则是:

char mine[11][11]={0};//用来存放布置好雷的信息
char show[11][11]={0};//用来存放排查出雷的个数的信息

3.随机雷的布置:(伪随机)

通过时间戳来实现伪随机数

a+rand()%(b-a+1);//生成a~b的随机数
srand((unsigned int)time(NULL));//使用time函数的返回值设置种子

要实现随机雷的布置,也就是实现随机坐标,即生成横坐标x的随机数纵坐标y的随机数。

 2.2 文件结构设计

对于代码较多的项目,采用多个文件的形式对函数进行分装。

1.test.c//文件中写游戏的测试逻辑
2.game.h//文件中写游戏需要的数据类型和函数声明
3.game.c//文件中写游戏的函数实现

二、扫雷游戏的代码实现(参考)

1.game.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 EASY_COUNT 10//自定义游戏难度系数(雷的个数)
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set);//初始化棋盘
void DisplayBoard(char arr[ROW][COL],int row, int col);//打印棋盘
void SetMine(char arr[ROW][COL],int row,int col);//布置雷
void FindMine(char mine[ROW][COL],char show[ROW][COL],int row,int col);//排查雷

2.game.c

#include"game.h"

2.1 初始化模块

//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
	//1.遍历棋盘
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

2.2 打印模块

//打印棋盘
void DisplayBoard(char arr[ROW][COL], int row, int col)
{
	printf("------扫雷游戏------\n");
	for (int i = 0; i <= row; i++)
	{
		//1.打印行号
		printf("%-2d", i);
	}
	printf("\n");
	for (int i = 1; i <=row; i++)
	{
		//2.打印列号
		printf("%-2d", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%-2c", arr[i][j]);
		}
		printf("\n");
	}
}

2.3 布置雷模块

//布置雷
void SetMine(char arr[ROW][COL], int row, int col)
{
	int difficulty = EASY_COUNT;//根据难度布置雷的个数
	while(difficulty--)
	{
		//x轴随机数1~row
		int x = 1 + rand() % row;
		//y轴随机数1~col
		int y = 1 + rand() % col;
		//布置雷
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
		}
	}
}

2.4 排查雷模块 

//排查雷
int GetMineCount(char arr[ROW][COL], int x, int y)
{
	return arr[x - 1][y - 1] + arr[x][y - 1] + arr[x + 1][y - 1] + arr[x - 1][y] + arr[x + 1][y] + arr[x - 1][y + 1] + arr[x][y + 1] + arr[x + 1][y + 1] - 8 * '0';
}
void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	int residue = row * col - EASY_COUNT;
	while (win < residue)
	{
		printf("请输入要排查的坐标:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了!\n");
				DisplayBoard(mine, row, col);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, row, col);
				win++;
			}
		}
		else
			printf("坐标输入非法,请重新输入:\n");
	}
	if (win == residue)
		printf("恭喜你,排雷成功!\n");
}

3.text.c

#include"game.h"
int main()
{
  int input=0;
  do
  {
    menu();
    printf("请输入:\n");
    scanf("%d",&input);
    switch(input)
    {
      case 1:
        game();
        break;
      case 0:
        printf("退出成功!\n");
        break;
      defalut:
        printf("输入错误,请重输:\n");
    }
  }while(input);
  return 0;
}

3.1 菜单模块

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

3.2 游戏模块

void game()
{
	char mine[ROWS][COLS];//存放布置好的雷
	char show[ROWS][COLS];//存放排查出雷的信息
	//1.初始化棋盘
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show, ROWS, COLS, '*');
	//2.打印棋盘
	DisplayBoard(show, ROW, COL);
	//3.布置雷
	SetMine(mine,ROW,COL);
	//4.排查雷
	FindMine(mine,show,ROW,COL);
}

三、扫雷游戏的拓展

1.是否可以选择游戏难度:

(1)简单9*9棋盘,10个雷

(2)中等16*16棋盘,40个雷

(3)困难30*16棋盘,99个雷

2.是否可以标记雷

3.是否可以加上排雷的时间显示

4.如果周围没有雷,可以自动展开一片

......


总结

本文首先分析了扫雷游戏的大体功能和玩法,并尝试用C语言的数组和函数知识去抽象游戏模型,最后进行了C语言代码的模拟实现。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值