C基础扫个雷儿~

本文介绍了如何通过C语言实现扫雷游戏,包括随机埋雷、统计雷数、用户交互和判断胜负。使用rand()函数生成伪随机数,以及time()函数设置随机种子。展示了初始化棋盘、打印界面、埋雷和用户扫描过程的关键代码段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1.功能实现思路,我们需要给用户展示扫雷界面,需要埋雷,需要统计用户选择展开位置周围雷的总数目,并在显示界面展示给用户看,需要判断输赢,可重复/退出游戏

2.我们可以通过设置成两种扫雷界面,不给用户看到具体埋雷的那个界面

3.可以通过使用rand进行随机埋雷,需引用头文件stdlib.h,rand的使用前需用srand((unsigned int)time(NULL))

4.time时间戳函数,time(NULL)用来获取系统现在时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数(使用需引用头文件time.h),srand实现随机数需要先给他一个随机值,此处srand函数(需要引用头文件stdlib.h),(unsigned int)是将time转换为无符号整形。

5.真正产生随机数是不可能的,只能产生伪随机数。

6.srand函数的使用是为了rand()使用做准备。rand()用来实现随机埋雷。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define ROW 9
#define ROWS ROW+2//统计雷数用
#define RANK 9
#define RANKS RANK+2//统计雷数用
#define mine 9
#include<stdlib.h>
#include<time.h>

void meau();
void initialize(char chess[ROWS][RANKS],char set);
void print(char chess[ROWS][RANKS]);
void Mine(char mine1[ROWS][RANKS]);
void begscan(char show[ROWS][RANKS], char chess[ROWS][RANKS]);

//功能实现
#include "mine.h"
void meau()
{
    printf("----------------------\n");
    printf("------1.开始游戏------\n");
    printf("------0.退出游戏------\n");
    printf("----------------------\n");
}

 
void initialize(char chess[ROWS][RANKS],char set)//初始化11
{
    int i;
    int j;
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < RANKS; j++)
        {
            chess[i][j]=set;
        }
    }
}
void print(char chee[ROWS][RANKS])//打印雷盘
{
    int i;
    int j;

    printf("--------扫雷--------\n");

    for (i = 0; i <=ROW; i++)
    {
        printf("%d ", i);
    }
    printf("\n");            
    for (i = 1; i <= ROW; i++)
    {
        printf("%d ", i);
        for (j = 1; j <=RANK; j++)
        {
            printf("%c ", chee[i][j]);
        }
        printf("\n");
    }
    printf("--------扫雷--------\n");
}

void Mine(char mine1[ROWS][RANKS])//随机埋雷
{
    int x;
    int y;
    int count = mine;

    while (count)
    {
        x = rand() % ROW+1;
        y = rand() % RANK+1;
        if (mine1[x][y] == '0')
        {
            mine1[x][y] = '1';//雷
            count--;
        }
        
    }
}

int minenumber(char chess[ROWS][RANKS], int x, int y)
{

    return chess[x - 1][y] +
        chess[x - 1][y - 1] +
        chess[x][y - 1] +
        chess[x + 1][y - 1] +
        chess[x + 1][y] +
        chess[x + 1][y + 1] +
        chess[x][y + 1] +
        chess[x - 1][y + 1]-8*'0';


}



void begscan(char show [ROWS][RANKS],char chess[ROWS][RANKS])
{
    int i;
    int j;
    int num=0;
    while (num<ROW*RANK-mine)
    {
        printf("请输入坐标");
        scanf("%d %d", &i, &j);
        if (i <=ROW && j <=RANK && i > 0 && j > 0)//考虑用户习惯没有0 0输入的概念
        {
            if (chess[i][j] == '1')
            {
                printf("你输了\n");
                print(chess);
                break;

            }
            else
            {
                int count=minenumber(chess, i, j);//统计周围雷数
                show[i][j] = count + '0';//  转型;
                print(show);
                num++;
            }
        }
        else
        {
            printf("坐标输入错误请重新输入");
        }
    }
    if (num == ROW * RANK - mine)
    {
        printf("你赢了\n");
        print(chess);
    }
}

//测试
#include"mine.h"
void game()
{
    char chess[ROWS][RANKS] = { 0 };
    char show[ROWS][RANKS] = { 0 };
    /*srand((unsigned int)time(NULL));*/
    initialize(chess,'0');//初始化存放布置好的雷的信息
    initialize(show,'*');//初始化存放排查出的雷的信息
    Mine(chess);//埋雷
    print(show);//打印棋盘
    begscan(show,chess);//找雷
    
}


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

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值