C语言从零开始完成简易扫雷游戏

一.前文

        此文章用于介绍用c语言完简易扫雷游戏,无指针内容,从零开始一步步直到游戏编写完成。

二.游戏实现的基本框架

1.构建菜单 用户选择play or  exit

2.进入游戏后 对棋盘进行初始化,形成9*9的棋盘

3.用户进行随机坐标选择,如果不是雷,排查出周围雷的个数,显示在棋盘上

4.用户找出全部雷或被雷炸到后,游戏结束,再次回到菜单

三.游戏菜单和基本原理的实现

1.游戏菜单的实现

进行初步菜单的打印,用户可自由选择play或者exit。

2.游戏基本原理的实现

将option即用户的选择初始化为1,保证while循环至少执行一次,用户可以根据菜单进行选择

scanf函数收集用户输入的值 将其分为3种情况

1.输入 1 一play,执行游戏程序

2.输入0一exit,打印退出游戏,此时option=0,循环不会再次执行,程序结束

3.用户输入的既不是1也不是0,打印输入错误,option=1,循环再次执行,用户再次选择

四.游戏程序的基本框架及游戏程序中单个函数功能的实现、
41.基本框架

 1.首先咱们进行棋盘的创建,将雷的位置设置为1,非雷的位置设置为0,但是考虑到对雷排查时,如果周围是1个雷,那么在棋盘上显示的值就是1,1的值与雷1的值容易造成混淆,所以我们创建两个棋盘,show棋盘用户给用户进行展示,全部用‘” * “覆盖,hide棋盘用于底层逻辑的判断,0不是雷,1是雷。

2.chumine函数,在棋盘中随机生成10个雷,完成对雷的设置

3.print函数的作用是对棋盘的打印,给用户展示全是  *  的棋盘

4.while循环排查坐标,直至游戏失败或者成功

5.countmine函数在hide棋盘中对坐标进行检查,是雷则结束游戏,不是则将周围雷的数量显示

6.成功或者失败后 ,flag=0,while循环不再继续,再次回到菜单,用户可以选择再来一局或者退出(在主函数中实现)

4.2棋盘的创建

1.给用户展示中,显示的是9*9的棋盘,但考虑到后续对雷的排查,排查程序中自动排查周围的8个雷,但是如果排查的位置是最边上的一排/列,就需要编写更加复杂的程序进行更准确的排查,所以,我们将棋盘扩大一周,避免上述的问题发生(仍然给用户展示9*9的棋盘,也就是整个棋盘的一部分被隐藏)如图所示,蓝色部分用户可看到的,蓝色和绿色部分是整个棋盘。

 上述代码成功创建两个11行11列的数组,但没有准确赋值

4.3棋盘的初始赋值

 

 

 (c和k分别是显示棋盘的行和列,n为对数组所赋的值)

利于init函数对hide棋盘全赋值为0,对show棋盘全赋值为   *      。

4.4雷的布置

1.c语言中提供了一个函数叫 srand ,用来初始化随机数的生成器的

通过  srand  函数的参数  seed  来设置  rand 函数生成随机数时的种子

2.首先利用时间戳对rand种子进行赋值,保证每次生成的坐标都是随机值(不赋值rand产生的随机值,会在后续重复生成)

 3.生成雷的坐标后,如果此位置不是雷,就布置雷,如果此位置是雷,i减小1,保证雷能够布置10个。

4.5棋盘的打印函数

布置好雷后,打印show棋盘,给用户展示出9*9的棋盘供选择排查的坐标

 

 效果图

4.6进入while循环,对棋盘上位置进行雷的排查以及对游戏结束的判定

 进入循环后,用户可自由选择排查的坐标,当将全部非雷位置排查完(n==71,n为排查次数,一共有71个不是雷的坐标)或排查到雷后,flag=0,循环不再进行,游戏结束

 

 

 

 排查雷的原理是:将周围8个位置的字符相加,再减去七个字符’0‘,这样显示的字符对应的刚好是周围雷的个数(0在char储存的是其对应的ASCLL码值,如下图,0对应的值为48,1是49,依次类推)

 

 

 

 排查后,n(排查次数)+1,当排查次数n=71时,游戏成功,游戏程序结束

当排查到雷时,会打印“此处是雷,游戏结束”并且将雷的坐标赋值为x打印出show棋盘,,flag会被赋值为0,游戏程序结束

 

五.游戏程序演示及完整代码

需要c语言相关资料v(L240325y)

 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
//扫雷游戏
//1.构建菜单 用户选择play or  exit
//2.进入游戏后 对棋盘进行初始化,形成9*9的棋盘
//3.进行底层逻辑设置,将雷设置为1,非雷设置为0;显示给用户的棋盘用*覆盖
//4.用户进行随机坐标选择,如果不是雷,排查出周围雷的个数,显示在棋盘上
//5.用户找出全部雷或被雷炸到后,游戏结束,再次回到菜单
void menu()
{
    printf("**************1.play**********\n");
    printf("**************0.exit**********\n");
    printf("请选择-\n");

}
void init(char arr[][11], int c, int k, char n);
void print(char arr[11][11], int c, int k);
void countmine(char arr[11][11], char arr2[11][11], int x, int y);
void chumine(char arr[11][11], int c, int k);
void game()//游戏程序
{
    int c = 9;//棋盘的长
    int k = 9;//棋盘的宽
    char show[11][11];//初始化展示给用户的棋盘
    char hide[11][11];//初始化隐藏的棋盘
    int flag = 1;//判断是否结束游戏
    int n = 0; //判断是否结束游戏
    init(show, c, k, '*');//对展示棋盘进行初始赋值
    init(hide,c,k,'0');//对隐藏棋盘进行初始赋值
    
    chumine(hide, c, k);//生成雷
    
    print(show, c, k);//棋盘的打印
    print(hide, c, k);//棋盘的打印
    while (flag)//排查雷的循环程序
    {
        printf("请选择排查位置的坐标\n");
        int x, y;
        scanf("%d %d", &x, &y);//选择排查的坐标
        countmine(hide,show, x, y);//对坐标进行检查,是雷则结束游戏,不是则将周围雷的数量显示
        print(show, c, k);//打印排查后的几盘
        n++;//排查次数的增加,更趋近于游戏结束
        if (hide[x][y] == '1')//如果是雷
            flag = 0;//游戏结束的标志
        if (n == 2)//如果排查71次之后都没有被雷炸到
        {
            flag = 0;//游戏结束的标志
            printf("游戏成功\n");//打印游戏成功
        }
    }
}
void init(char arr[11][11],int c,int k,char n)
{
    for (int i = 0; i < c+2; i++)
    {
        for (int m = 0; m < k+2; m++)
        {
            arr[i][m] = n;
        }
    }
}
void print(char arr[11][11], int c, int k)//接收数组,行,列
{
    printf("     0123456789\n");//为了美观和方便选择,在上方打印出y坐标
    for (int i = 1; i <=c; i++)
    {
        printf("     %d", i);//为了美观和方便选择,在侧方打印出x坐标
        for (int m = 1; m <=k; m++)
        {
            printf("%c", arr[i][m]);//对数组打印
        }
        printf("\n");
    }
}
void countmine(char arr[11][11],char arr2[11][11],int x, int y)
{
    if (arr[x][y] == '1')//是雷,打印游戏结束
    {
        arr2[x][y] = 'x';
        
        printf("此处是雷,游戏结束\n");
        
    }
    else//不是雷,显示周围雷的数量
        arr2[x][y] = arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + arr[x][y + 1] + arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 7*'0';
}
void chumine(char arr[11][11], int c, int k)
{
    for (int i = 0; i < 79; i++) //循环10ci,布置10个雷
    {
        int x = rand() % 9 + 1;//生成雷的坐标
        int y = rand() % 9 + 1;
        if (arr[x][y] != '1')//如果此位置不是雷,就布置雷
            arr[x][y] = '1';
        else i--;//如果此位置是雷,i减小1,保证雷能够布置10个
    }
}
    
int main()
{
    srand((unsigned int)time(NULL));//对rand种子进行随机编写
    int option=1;//初始option为1,保证菜单至少出现一次,给用户选择的机会
    while (option)
    {
        menu();//显示菜单
        scanf("%d", &option);//用户的输入
        if (option == 1)//选择1,进行游戏
        {
            game();//游戏程序函数
        }
        else if (option == 0)//选择0,退出
        {
            printf("退出游戏\n");
            break;
        }
        else //选择错误
        {
            printf("选择错误,请重新选择\n");
        }
    }
    return 0;

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值