扫雷,超详细解答~

本文详细介绍了使用Python实现的扫雷游戏,涵盖了开始菜单、雷盘初始化、随机埋雷、用户操作与递归开屏。通过实例展示了如何运用菜单设计、数据结构(如字符数组和递归)以及关键算法(如Counst_Mine和Open)。
摘要由CSDN通过智能技术生成

目录

一、总体思路

1.开始菜单实现

2.雷盘和用户盘初始化和打印

3.随即设置雷

4.用户扫雷和判断

5.递归实现开屏

二、各个部分实现

三、工程下载

四、总结


一、总体思路

1.开始菜单实现

2.雷盘和用户盘初始化和打印

3.随即设置雷

4.用户扫雷和判断

5.递归实现开屏

二、各个部分实现

1.菜单

int main ()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	
	return 0;
}

2.初始化

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

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

3.埋雷

void Set_mine(char arr[ROWS][COLS], int row, int col)
{
    int counst = MY_MINE;
    while (counst)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (arr[x][y] == '0')
        {
            arr[x][y] = '1';
            counst--;
        }
    }
}

4.扫雷

注意输入合法性,计算场上剩余雷的个数判断输赢

void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x, y;
    while (1)
    {
        printf("选择:");
        scanf("%d %d",&x,&y);
        if (x > 0 && x <= ROW && y > 0 && y <= COL)
        {
            if (mine[x][y] == '1')
            {
                printf("YOU DIE!\n");
                Print(mine, ROW, COL);
                break;
            }
            else
            {
                Open(mine, show, x, y);
                Print(show, ROW, COL);
            }
        }
        else
        {
            printf("输入错误!\n");
        }
        int counst = 0;
        for (int i = 1; i <= ROW; i++)
        {
            for (int j = 1; j <= COL; j++)
            {
                if (show[i][j] == '*')
                {
                    counst++;
                }
            }
        }
        if (counst == MY_MINE)
        {
            printf("YOU WIN!\n");
            break;
        }
    }
}

5.递归实现开屏

分开来设计,先计算一个格子周围有多少个雷

然后如果周围没有雷,则递归计算周围八个格子,没有雷用空格代替,否则返回雷的数量

int Counst_Mine(char mine[ROWS][COLS], int row, int col)
{
    int counst = 0;
    for (int i = row - 1; i <= row + 1; i++)
    {
        for (int j = col - 1; j <= col + 1; j++)
        {
            if (mine[i][j] == '1')
            {
                counst++;
            }
        }
    }
    return counst;
}

void Open(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    if (Counst_Mine(mine, row, col) == 0)
    {
        show[row][col] = ' ';
        if ((row - 1) > 0 && (col - 1) > 0 && show[row - 1][col - 1] == '*')
            Open(mine, show, row - 1, col - 1);
        if ((row - 1) > 0 && (col) > 0 && show[row - 1][col] == '*')
            Open(mine, show, row - 1, col);
        if ((row - 1) > 0 && (col + 1) > 0 && show[row - 1][col + 1] == '*')
            Open(mine, show, row - 1, col + 1);
        if ((row) > 0 && (col - 1) > 0 && show[row][col - 1] == '*')
            Open(mine, show, row, col - 1);
        if ((row) > 0 && (col + 1) > 0 && show[row][col + 1] == '*')
            Open(mine, show, row, col + 1);
        if ((row + 1) > 0 && (col - 1) > 0 && show[row + 1][col - 1] == '*')
            Open(mine, show, row + 1, col - 1);
        if ((row + 1) > 0 && (col) > 0 && show[row + 1][col] == '*')
            Open(mine, show, row + 1, col);
        if ((row + 1) > 0 && (col + 1) > 0 && show[row + 1][col + 1] == '*')
            Open(mine, show, row + 1, col + 1);
    }
    else
    {
        show[row][col] = '0' + Counst_Mine(mine, row, col);
    }
}

三、工程下载

链接:https://pan.baidu.com/s/1FxalX9UIbcgGYsLFDmKJhg 
提取码:2233

四、总结

        扫雷相对于三字棋来说,难点在于递归实现开屏,其他方面差不多。

通过两个小项目的回忆,我感觉差不多了,接下来可能就是数据结构了,这也是我觉得自己基础不太行的原因,学到数据结构后面还要继续学C++,不然后面只用C可能实现不了,只是我觉得这段时间要好好调整一下了,不然可能跟不上后面的节奏。

        其实我也认为偶尔休息一下不算什么,在我看来,间接性的不自律也是更好自律的一部分,加油吧,我回来了!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

penguin_bark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值