初试简单的扫雷游戏编程(C语言)

        本文仅为个人初学者经验,记录作用大于实际借鉴作用(应该也没人会看见我这种初学者的初级代码╮(╯▽╰)╭)

        最开始构想了一个很简单的思维导图,同时也学习了相关的代码知识,由于是个先前有过案例的编程题,就没有在开始的时候构想太多的思路和想法。

        同时,我个人认为编程更加偏向于要进行许多试错,所以开始只需要为自己找好框架和目标即可。

        介于整个程序的功能,设置一个单独的头文件game.h。game.c进行自定义函数的编写,main.c进行总体的运行。

        在最开始会给玩家一个选择,先输出一个菜单说明如何使用,再为一个整型变量的重新赋值,同时因为游戏应该可以循环进行,所以使用do-while循环结构。

        简单输入1开始游戏,而输入0退出游戏,如果输入其他值则重新循环且要求输入1或者0,由此使用switch语句

        头文件一类均放置于game.h中。

#include "game.h"
int main()
{
    //玩家最初会做出的选择,游戏还是退出
    int i=0;
    //游戏为可循环的总函数类型 do-while
    //设计菜单,menu自定义函数
    do
    {
        menu();
        scanf("%d",&i);
        //当输入1的时候开始游戏,输入0的时候退出游戏,输入非零数据的时候重新输入 switch
        switch (i)
        {
            case 1:
                printf("开始游戏,请选择要排查的坐标\n");
                //game()函数,需要进行游戏的所有功能
                game();
                break;
            case 0:
                printf("退出成功\n");
                break;
            default:
                printf("输入数据有误,请重新输入\n");
        }
    }while(i);
    return 0;
}

         后期编程思路主要成线形,均已写在注释之中

头文件game.h

#ifndef game_h
#define game_h
#endif /* game_h */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define HS 11//定义初始键盘的横坐标值
#define LS 11//定义初始键盘的纵坐标值
#define H HS-2//定义可见键盘或埋雷键盘的横坐标值
#define L LS-2//定义可见键盘或埋雷键盘的纵坐标值
#define X 10//定义雷的个数
void menu();
void game();
void C(char arr[HS][LS],int hs,int ls,char i);
void P(char arr[HS][LS],int hs,int ls);
void M(char arr[HS][LS],int hs,int ls);
void T(char arr[HS][LS],char arr2[HS][HS],int hs,int ls);

game.c

#include "game.h"
//打印菜单的函数
void menu()
{
    printf("***********  1.game  ***********\n");
    printf("***********  0.exit  ***********\n");
}
//初始化棋盘的函数
void C(char arr[HS][LS],int hs,int ls,char i)
{
    for (hs=0; hs<=HS; hs++)
    {
        for (ls=0; ls<=LS; ls++)
        {
            arr[hs][ls] = (char)i;
        }
    }
}
//打印棋盘1的函数
//为增强可视性,将在二维数组的0列0行加上数字的注释
void P(char arr[HS][LS],int hs,int ls)
{
    //打印第一行的列数注释
    for (hs=0; hs<=H; hs++)
    {
        printf("%d ",hs);
    }
    //打印棋盘
    printf("\n");
    for (hs=1; hs<=H; hs++)
    {
        //打印第一列的行数注释
        printf("%d ",hs);
        
        for (ls=1; ls<=L; ls++)
        {
            printf("%c ",arr[hs][ls]);
        }
        printf("\n");
    }
}
//对于初始值均为1的棋盘而埋下值为0的雷
void M(char arr[HS][LS],int hs,int ls)
{
    int i1,i2;//定义雷的横纵坐标
    int i=0;//定义雷的个数
    srand((unsigned)time(NULL));
    while(i<X)
    {
        i1 = rand()%9+1;//i1的值为1-9
        i2 = rand()%10;//i2的值为0-9
        while(arr[i1][i2]!='0'&&i2>=1)
        {
            arr[i1][i2]='0';
            i++;//每有一个雷成功埋下,计数一次
        }
    }
}
//排查坐标3*3范围内有多少个雷
void T(char arr1[HS][LS],char arr2[HS][HS],int hs,int ls)
{
    //定义排查的横纵坐标
    int i1,i2;
    //定义雷的个数
    char i = '0';
    //开始排查
    for (i1=hs-1; i1<=hs+1; i1++)
    {
        for (i2=ls-1; i2<=ls+1; i2++)
        {
            if(arr2[i1][i2]=='0')
            {
                i++;
            }
        }
    }
    arr1[hs][ls] = i;
    P(arr1, HS, LS);
}
void game()
{
    //扫雷有两个棋盘,一个玩家可见的,且雷不可见的棋盘1;一个不可见的,且雷可见的棋盘2
    //棋盘1的表现为*,且被选中之后会展示周围3*3方阵的雷点数量
    //棋盘2的表现为1、0。0为雷而1为非雷
    char arr1[HS][LS];
    char arr2[HS][LS];
    //玩家会输入的两个整形坐标值
    int a = 0;
    int b = 0;
    //玩家已经排除的雷的个数
    int i = 0;
    //棋盘的实际横纵单位数(用int类型初始化)
    int h = H;
    int l = L;
    //将棋盘初始化
    C(arr1, HS, LS, '*');
    C(arr2, HS, LS, '1');
    //对棋盘2进行埋雷
    M(arr2, H, L);
    //玩家仅需可见棋盘1
    P(arr1, HS, LS);
    do
    {
    printf("请输入需要排查的横纵坐标值\n");
    scanf("%d%d",&a,&b);
        if(a<=9&&b<=9&&a>0&&b>0)
        {
            if(arr2[a][b]=='1')
            {
                //告诉玩家该坐标附近3*3范围内还有多少雷
                T(arr1,arr2,a,b);
                i++;
            }
            else
            {
                //先展示原先游戏中的雷的个数,再说明游戏失败
                P(arr2, HS, LS);
                printf("游戏失败,踩到雷了\n");
                break;
            }
        }
        else
        {
            printf("输入数据有误,请重新输入\n");
        }
    }while(i<(h*l-X));
    if(i==(h*l-X))
    {
        printf("恭喜你,排除了所有的雷\n");
    }
    else
    {
        printf("需要重新开始吗?\n");
    }
}

在这里尤其感谢B站up主 哔哩大学计算机学院,以及他的视频对于我学习C语言的帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值