简易版扫雷游戏

一、功能模块

1.菜单打印,进行选择

先打印一份菜单,一目了然 选择开始或退出

void Menu()
{
	printf("-----------****************----------\n");
	printf("***********    1.玩游戏    **********\n");
	printf("***********    0.退出游戏  **********\n");
	printf("-----------****************----------\n");

}

2.生成扫雷棋盘并初始化

生成棋盘

我们这里做的是 9*9 的棋盘,那为何变成了11*11的棋盘了呢?

这里就是,防止在读取周围雷的信息造成数组越界,我们将数组上下左右都增加一格;

而且不仅防止了数组越界,还使数组的下标与编号一致。

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

char Mine[ROWS][COLS];
char Show[ROWS][COLS];

注意:方便代码的编写与修改我们用define定义数字

将存放雷的信息与显示信息分开可以防止数据类型过多。

设置两个char类型的数组可以在初始化时使用一函数就够了。

初始化棋盘

初始化棋盘函数部分

void InitBoard(char arr[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++)
		{
			arr[i][j] = set;
		}
	}
}

再调用函数初始化棋盘

InitBoard(Mine, ROWS, COLS, '0');
InitBoard(Show, ROWS, COLS, '*');

3.布置雷

因为是9*9的棋盘格,所以先生成两个一到九的随机数,表示行和列,对雷数组(Mine)的信息进行修改从而达到存放雷的效果,不过在此之前我们要判断该位置是否被修改过。其中count是设定雷的个数的

随机数的实现是通过 rand())和srand()函数。

	srand((unsigned int)time(NULL));
void SetMine(char arr[ROWS][COLS], int row, int col)
{
    int count = EASY_COUNT;
    while (count)
    {
        int x = rand() % row + 1;//1-10
        int y = rand() % col + 1;//1-10
        
        if (arr[x][y] == '0')
        {
            arr[x][y] = '1';
            count--;
        }
    }
}

4.排查雷

排雷是通过输入两个数字形成坐标判断该位置是否有雷。

情况1:输入数字是有范围的(1<=x<=row)(1<=y<=col),无效范围会提示你重新输入,有效范围则会有以下情况。

情况2:该位置是雷

踩雷游戏结束

情况3:该位置不是雷,

会显示该放方格周围一圈雷的个数。

在这里就要提到一个计算周一圈雷的个数的函数了,如下:

//计算周围雷的个数
static int GetMintCount(char arr1[ROWS][COLS], int x, int y)
{
    return arr1[x - 1][y] + arr1[x + 1][y] + arr1[x][y - 1]
        + arr1[x][y + 1] + arr1[x - 1][y - 1] + arr1[x - 1][y + 1]
        + arr1[x + 1][y - 1] + arr1[x + 1][y + 1] - 8 * '0';
}

当未踩雷时,需要多次排雷,通过循环来达到效果,什么时候排雷成功呢?

我们知道 雷的个数和棋盘的格数是已知的,所以循环条件为 连续排雷未踩雷的次数等于棋盘的格数减去雷的个数,则排雷成功。

下面是排雷的函数

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 < row * col - EASY_COUNT)
    {
        printf("请输入要排查的坐标:");
        scanf("%d %d", &x, &y);

        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (Mine[x][y] == '1')
            {
                printf("\n很遗憾,你被炸死了\n");
                DisplayBoard(Mine, ROW, COL);
                break;
            }
            else
            {
                int n = GetMintCount(Mine, x, y);
                Show[x][y] = n + '0';
                DisplayBoard(Show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("坐标非法,请重新输入\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功!\n");
        DisplayBoard(Mine, ROW, COL);

    }
}

扫雷的函数模块已完成

5.用main函数组装

将它们用main函数组装即可

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		Menu();
		printf("请进行选择:>");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				Play();
				break;
			case 0:
				printf("退出游戏!\n");
			default:
				printf("选择错误,请重新选择!\n");
				break;
		}
	} while (input);

	return 0;
}

二、扫雷简易版全部代码

game.h声明函数

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10

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

//初始化
void InitBoard(char arr[ROWS][COLS], int row, int col, char set);
//打印
void DisplayBoard(char arr[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char arr[ROWS][COLS], int row, int col);
//找雷
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col);

game.c函数的实现

#include"game.h"

void InitBoard(char arr[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++)
		{
			arr[i][j] = set;
		}
	}
}


void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
    printf("--------------------------\n");
    printf("| ");
    for (int i = 0; i <= row; i++)
    {
        printf("%d ", i);
    }
    printf(" |\n");
    for (int i = 1; i <= row; i++)
    {
        printf("| %d ", i);
        for (int j = 1; j <= col; j++)
        {
            printf("%c ", arr[i][j]);
            if (j == row)
            {
                printf(" |");
            }
        }
        printf("\n");
    }
    printf("--------------------------\n\n");
}


void SetMine(char arr[ROWS][COLS], int row, int col)
{
    int count = EASY_COUNT;
    while (count)
    {
        int x = rand() % row + 1;//1-10
        int y = rand() % col + 1;//1-10
        
        if (arr[x][y] == '0')
        {
            arr[x][y] = '1';
            count--;
        }
    }
}


//计算周围雷的个数
static int GetMintCount(char arr1[ROWS][COLS], int x, int y)
{
    return arr1[x - 1][y] + arr1[x + 1][y] + arr1[x][y - 1]
        + arr1[x][y + 1] + arr1[x - 1][y - 1] + arr1[x - 1][y + 1]
        + arr1[x + 1][y - 1] + arr1[x + 1][y + 1] - 8 * '0';
}

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 < row * col - EASY_COUNT)
    {
        printf("请输入要排查的坐标:");
        scanf("%d %d", &x, &y);

        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (Mine[x][y] == '1')
            {
                printf("\n很遗憾,你被炸死了\n");
                DisplayBoard(Mine, ROW, COL);
                break;
            }
            else
            {
                int n = GetMintCount(Mine, x, y);
                Show[x][y] = n + '0';
                DisplayBoard(Show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("坐标非法,请重新输入\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功!\n");
        DisplayBoard(Mine, ROW, COL);

    }
}

test.c扫雷的过程

#include"game.h"

void Menu()
{
	printf("-----------****************----------\n");
	printf("***********    1.玩游戏    **********\n");
	printf("***********    0.退出游戏  **********\n");
	printf("-----------****************----------\n");

}

void Play()
{
	char Mine[ROWS][COLS];
	char Show[ROWS][COLS];
	//初始化
	InitBoard(Mine, ROWS, COLS, '0');
	InitBoard(Show, ROWS, COLS, '*');
	//打印
	//DisplayBoard(Mine, ROW, COL);
	DisplayBoard(Show, ROW, COL);
	//布置雷
	SetMine(Mine, ROW, COL);
	//DisplayBoard(Mine, ROW, COL);
	//排查雷
	FindMine(Mine, Show, ROW, COL);

}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		Menu();
		printf("请进行选择:>");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				Play();
				break;
			case 0:
				printf("退出游戏!\n");
			default:
				printf("选择错误,请重新选择!\n");
				break;
		}
	} while (input);

	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值