C语言大作业——猜谜游戏


 

为了可玩性强行加的
void wan()//玩游戏,获得能量与money
{
    printf("这是一个小游戏,我劝你最好玩一下!<( ̄︶ ̄)>\n");
    int p,n,i,t,a[10],b,d,e,j;
    printf("文字密码规则:\t红:1\t绿:2\t黄:3\t蓝:4\t紫:5\t青:6\t白:0\n");
    printf("例如输出:这是绿色文本,密码就是2\n");
    printf("请选择游戏难度:\t1、简单\t2、困难\t3、极难\n");
    scanf("%d",&p);
    char yanse[][7]={"白","红","绿","黄","蓝","紫","青",};
    struct node* head, * tail, * m;
    head = (struct node*)malloc(sizeof(struct node));//先在头指针开辟一个存储空间,但是不储存数据
    head->data = 9;
    head->next = NULL;//初始化头指针指向空指针
    tail = NULL;//尾指针初始化为空指针
    n=p*3;
    i = 0;
    while (i<n)
    {
        Sleep(1234);
        m = (struct node*)malloc(sizeof(struct node));
        srand(time(NULL));
        t=rand()%1000;//随机数
        t=t%10;
        if(t>=7)
           m->data = t-5;
        else
           m->data = t+1;
        m->next = NULL;//p的指向下一个指针为空指针
        if (head->next == NULL)
            head->next = m;//固定头指针指向的指针,然后保持不变
        else
            tail->next = m;//此时的空间是新开辟的空间,tail->next即是上一个空间p->next
        tail = m;//为指针指向p,可以理解作为一个桥梁,用来储存是一个指向的空间
        srand(time(NULL));
        a[i] = (rand()%10+m->data+2) %10; // 生成随机数
        if(a[i]>=7)
            a[i] = a[i]-5;
        i++;
    }
    printf("\n");
    b=0;
    for (j = 0, m = head->next; j < n; m = m->next,j++)
    {
        printf("\033[3%dm",m->data);//改变输出颜色
        e=a[j];
        printf("%5s",yanse[e]);
        b=b*10+e;
    }
    printf("\n");
    Sleep(2000); // 等待
    printf("\033[1A\033[2K"); // 清除上一行的内容
    printf("\033[0m");
    printf("请输入密码:");
    scanf("%d",&d);
    if(b==d)
    {
        printf("Win!\n");
        energy+=n*300;
        money+=n*2;
        printf("energy+%d,money+%d\n",n*300,n*2);//输出
    }
    else
        printf("Fail!\n");
    Em(&energy,&money);
}

 源代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
int energy=0,money=0;
void Begin();//goto语句 switch语句
void Former();//文件
void Save();//文件
void Out();
void Grameexplain();
void mid();
void end();
void wan();//链表,增加可玩性,两关,去往另外两个选择,一维数组,
void background();
void Kouhao();//字符串
void one();
void two();
void three();//二维数组
void four();
void Em(int *e,int *m);//能量,钱总结,指针
void Xs();
void Xiansuo();
typedef struct//结构体,
{
    int energy;
    int money;
}Load;
void Em(int *e,int *m)
{
    printf("你现在的能量为:%d,你的余额是:%d元\n",*e,*m);
    if(*e<100)
    {
     printf("能量不足,你倒下了。\nGame over!");
     exit(0);//强制返回到主函数
    }
    if(*m<-5)
    {
     printf("负债过多,无法进行!\nGame over!");
     exit(0);//强制返回到主函数
    }
}
void background()
{
    printf("这是一个风雨交加的夜晚,你才下课……\n");
    getchar();  // 等待用户按enter键
    printf("你一个人背着书包走在回寝的路上。\n");
    getchar();  // 等待用户按enter 键
    printf("你打着伞,看着昏暗的道路,满天的大雨和拥挤的学生,和面前的三条路,\n");
    getchar();
    printf("你决定:\n");
}
struct node//先定义一个结构体,里面包含数据与结构体指针
{
int data;
struct node* next;
};
void wan()//玩游戏,获得能量与money
{
    printf("这是一个小游戏,我劝你最好玩一下!<( ̄︶ ̄)>\n");
    int p,n,i,t,a[10],b,d,e,j;
    printf("文字密码规则:\t红:1\t绿:2\t黄:3\t蓝:4\t紫:5\t青:6\t白:0\n");
    printf("例如输出:这是绿色文本,密码就是2\n");
    printf("请选择游戏难度:\t1、简单\t2、困难\t3、极难\n");
    scanf("%d",&p);
    char yanse[][7]={"白","红","绿","黄","蓝","紫","青",};
    struct node* head, * tail, * m;
    head = (struct node*)malloc(sizeof(struct node));//先在头指针开辟一个存储空间,但是不储存数据
    head->data = 9;
    head->next = NULL;//初始化头指针指向空指针
    tail = NULL;//尾指针初始化为空指针
    n=p*3;
    i = 0;
    while (i<n)
    {
        Sleep(1234);
        m = (struct node*)malloc(sizeof(struct node));
        srand(time(NULL));
        t=rand()%1000;//随机数
        t=t%10;
        if(t>=7)
           m->data = t-5;
        else
           m->data = t+1;
        m->next = NULL;//p的指向下一个指针为空指针
        if (head->next == NULL)
            head->next = m;//固定头指针指向的指针,然后保持不变
        else
            tail->next = m;//此时的空间是新开辟的空间,tail->next即是上一个空间p->next
        tail = m;//为指针指向p,可以理解作为一个桥梁,用来储存是一个指向的空间
        srand(time(NULL));
        a[i] = (rand()%10+m->data+2) %10; // 生成随机数
        if(a[i]>=7)
            a[i] = a[i]-5;
        i++;
    }
    printf("\n");
    b=0;
    for (j = 0, m = head->next; j < n; m = m->next,j++)
    {
        printf("\033[3%dm",m->data);//改变输出颜色
        e=a[j];
        printf("%5s",yanse[e]);
        b=b*10+e;
    }
    printf("\n");
    Sleep(2000); // 等待
    printf("\033[1A\033[2K"); // 清除上一行的内容
    printf("\033[0m");
    printf("请输入密码:");
    scanf("%d",&d);
    if(b==d)
    {
        printf("Win!\n");
        energy+=n*300;
        money+=n*2;
        printf("energy+%d,money+%d\n",n*300,n*2);//输出
    }
    else
        printf("Fail!\n");
    Em(&energy,&money);
}
void one()
{
    Load lo={250,5};
    energy+=lo.energy;
    money+=lo.money;
    Em(&energy,&money);
    printf("\n");
    Sleep(1000);
    printf("你选择了走隐蔽的小路(中路)\n");
    getchar();  // 等待用户按enter键
    printf("人太多了,雨又这么大,为了避免摔倒,聪明的你选择了走中间隐蔽的小路回寝室。");
    getchar();  // 等待用户按键
    printf("虽然没有路灯,道路黑暗,但你并不害怕,反而因为雨势心情不虞的你心情放松愉悦起来。");
    getchar();  // 等待用户按键
    printf("这时,你听到了一个奇怪的声音。虽然这个声音被淅淅沥沥的大雨遮盖,但你可是拥有两只完整的耳朵的人,一下就听到了,并且走上前观察。");
    getchar();  // 等待用户按键
    printf("性感的身材,圆圆的猫眼,穿着昂贵的皮草,在大雨中瑟瑟发抖。\n此时此景,你同情心爆发,伸出手想要解救这个可怜的猫学姐。");
    getchar();  // 等待用户按键
    printf("喵!");
    getchar();  // 等待用户按键
    printf("刚伸出手,一声凄厉的猫叫出现。");
    getchar();  // 等待用户按键
    printf("你只好收回手,看着学姐远去。");
    getchar();  // 等待用户按键
    printf("你回寝室睡觉了。\n");
    Em(&energy,&money);
}
void two()
{
    int n2;
    Load lo={300,5};
    energy+=lo.energy;
    money+=lo.money;
    Em(&energy,&money);
    printf("你选择了拿出手机刷视频(下路)\n");
    getchar();
    printf("刚打开抖音,一片红光就反射到你的脸上。\n你刷到了杀人视频,满屏的马赛克让你不开心,你选择:\n");
    Sleep(1000);
T:
    printf("1、关掉手机\n2、刷下一个视频\n3、关掉抖音,刷快手\n");
    scanf("%d",&n2);
    if(n2==1)
    {
        energy+=250;
        printf("你的能量加250!\n");
    }
    else if(n2==2)
    {
        money+=1;
        printf("你的余额加1!\n");
    }
    else if(n2==3)
    {
        money+=3;
        printf("你的余额加3!\n");
    }
    else
    {
        printf("请不要做无效的选择!请重新输入!\n");
        goto T;
    }
    Sleep(1000);
    printf("刷着刷着,忽然一股香味吸引了你,你看了过去,却只看到一个飞过去的黑影。\n");
    getchar();
    printf("你想了想,没有在意,到了寝室,就睡觉了。\n");
    Em(&energy,&money);
}
void three()//二维数组
{
    int i;
    int n3;
    Load lo={150,10};
    energy+=lo.energy;
    money+=lo.money;
    Em(&energy,&money);
    char changs[][20]={"红肠","脆骨大肠","都要","不买了","保存进度","调取进度"};
    char priaces[][20]={"2块","3块","5块","0块","有事先走一步","让我康康"};
    printf("你选择了去超市买根淀粉肠(上路)\n");
    getchar();
    printf("深夜就应该放毒,在这个冰冷孤独的夜晚,你需要一根炽热的淀粉肠来温暖你空虚的胃。\n");
    getchar();
    printf("于是饥饿的你选择了最上面的路,走到了最近的便利店。\n");
    getchar();
    for(i=0;i<6;i++)
    {
        printf("%-5d %-10s %-10s\n",i+1,changs[i],priaces[i]);
    }
H:
    printf("阿姨问你选什么肠,你看着手机了的余额10块钱,你选择:\n");
    scanf("%d",&n3);
    if(n3==1)
    {
        energy+=100;
        money-=2;
        printf("你的能量加100!\n");
    }
    else if(n3==2)
    {
        energy+=200;
        money-=3;
    }
    else if(n3==3)
    {
        energy+=399;
        money-=5;
    }
    else if(n3==4)
    {
        printf("你控制住了自己的欲望,战胜了百分之99的玩家!\n");
        goto F;
    }
    else if(n3==5)
    {
        Save();
    }
    else if(n3==6)
    {
        Former();
    }
    else
    {
        printf("请不要做无效的选择!请重新输入!");
        goto H;
    }
    Em(&energy,&money);
    printf("\n");
    getchar();
    printf("你拿着热腾腾的红肠,刚准备美滋滋地咬上一口——\n");
    getchar();
    printf("这时,一声猫叫惊到了你,一个黄色的身影闪过,你被撞到了,红肠滚到了远处。\n");
    getchar();
    printf("你愤怒的看向罪魁祸首。\n");
    getchar();
    printf("看清过后,你一愣,那是才大一的你惹不起的人物,你只好一笑了之。\n");
    getchar();
F:
    printf("没办法,你只好回寝室睡觉了。\n");
}
void four()
{
    Load lo={500,1};
    energy+=lo.energy;
    money+=lo.money;
    printf("energy+%d,money+%d\n",500,1);//输出
    printf("\n");
    getchar();
    Em(&energy,&money);
    printf("你选择了都不选,直接回寝室睡觉\n");
    getchar();
    printf("成年人不做选择,孤傲的你不会顺从。\n");
    getchar();
    printf("你决定回去睡觉。\n");
    getchar();
    printf("你睡了一个好觉。\n");
    energy+=500;
    printf("energy+%d,money+%d",500,0);
    printf("\n");
    Sleep(1000);
    Em(&energy,&money);
}
void Begin()//goto语句 switch语句
{
    int n,t;
    background();
    printf("\n");
    Sleep(1000);
    printf("1、走隐蔽的小路(中路)\n");
    printf("2、拿出手机刷视频(下路)\n");
    printf("3、去超市买根淀粉肠(上路)\n");
    printf("4、都不选,直接回寝室睡觉\n");
    printf("5、随机选择\n");
    printf("6、保存进度\n");
    printf("7、调取进度\n");
L:
    printf("请输入你的选择:\n");
    scanf("%d",&n);
    switch(n)
    {
    case 1:
        one();
        break;
    case 2:
        two();
        break;
    case 3:
        three();
        break;
    case 4:
        four();
        break;
    case 5:
	    srand(time(NULL));
	    t=rand()%1000;//随机数
	    if(t>70)
        {
            one();
        }
        else if(t>30)
        {
            two();
        }
        else if(t>0)
        {
            three();
        }
        else
        {
            four();
        }
        break;
    case 6:
        Save();
        break;
    case 7:
        Former();
        break;
    default:
        printf("输错啦!\n请再输一次:");
        goto L;
        break;
    }
}
void Former()//文件,加载游戏
{
    FILE *fp;
    if((fp=fopen("demo-a.txt","r"))==NULL)//判断文件是否成功打开
    {
        printf("打开失败!\n");
        exit(0);//打开不成功,用exit(0)终止程序
    }
    else
    {
        fscanf(fp,"%d,%d",&energy,&money);
        fclose(fp);
        printf("游戏进度加载成功!\n");
    }
}
void Save()//文件,保存游戏
{

    FILE *fp;
    if((fp=fopen("demo-a.txt","w"))==NULL)//判断文件是否成功打开
    {
        printf("打开失败!\n");
        exit(0);//打开不成功,用exit(0)终止程序
    }
    else
    {
        fscanf(fp,"%d,%d",&energy,&money);
        fclose(fp);
        printf("游戏进度保存成功!\n");
    }
}
void Out()
{
    printf("恭喜你经受住了考验,没有打开这个好玩的游戏。\n");
    getchar();
    printf("人生如谜,而你没有走进来。\n");
    getchar();
    printf("谢谢游玩!\n");
}
void Grameexplain()
{
    printf("规则介绍:\n");
    getchar();
    printf("人生如谜语,前路看自己\n");
    getchar();
    printf("这是一个解密型小游戏,请您跟随指示进行您内心的选择,最后解出谜底。\n");
    getchar();
    printf("每个选择都会导向不同的结果,希望您慎重选择!\n");
    getchar();
    printf("本游戏由本人倾力编写,本人拥有所有解释权。\n");
    getchar();
    printf("最后,请您谨记我们的口号:\n");
    getchar();
    printf("谜语之内,游戏之间。纵使星移斗转,天翻地覆,你自无忧无惧,因为世界为你而生!\n");
    getchar();
    printf("祝您游戏愉快!\n");
}
void Kouhao()//字符串
{
    char kh[50];
    Sleep(1000);
    printf("请输入剩下口号:\n");
    printf("谜语之内,游戏之间。纵使星移斗转,天翻地覆,你自无忧无惧,因为——\n");
    printf("\n");
    scanf("%s",kh);
    if((strcmp(kh,"世界为你而生!"))==0)
       {
           printf("恭喜你,答对了!\n");
           energy+=500;
           money+=50;
           printf("energy+500,money+50");
           Em(&energy,&money);
           printf("这是一条神奇的回寝路,四个时间线同时进行!\n");
       }
    else
        {
            printf("真遗憾,答错了!\n");
            printf("请记住:世界为你而生!\n");
        }
}
void mid()
{
    printf("第二天,你一觉睡到日上三竿,错过了早八,才知道今天停课了。\n");
    getchar();
    printf("你惊喜过后,不免疑惑,打听过后才知道,原来是你的大学突然爆出一个新闻:\n");
    getchar();
    printf("在学校教学楼旁边的草地里发现了一个被水浸泡的发烂的红色尸体!\n");
    getchar();
    printf("如果不是昨晚的大雨,这个尸体可能永远不会被发现!\n");
    getchar();
    printf("你看着那个红色尸体,想起昨晚的一幕幕,你恍然大悟!\n");
    getchar();
    printf("淀粉肠督察大队立即包围现场,宣布提供线索者,可以加学分!\n");
    getchar();
    printf("同学们激动不已议论纷纷,对着那个红色淀粉肠尸体指指点点,都在猜测谁是凶手\n");
    getchar();
    printf("而这个答案只有你知道!(或许你也不知道?)\n");
}
void end()
{
    printf("\n");
    Sleep(1000);
    printf("你知道了来龙去脉!\n");
    getchar();
    printf("四个时间线同时进行!\n");
    getchar();
    printf("猫学姐被走小路的你惊跑了,\n");
    getchar();
    printf("逃向了下面的便利店,却不小心弄掉了刚斥巨资买烤肠的你。\n");
    getchar();
    printf("而下路的你也注意到了猫学姐,只是没有在意。\n");
    getchar();
    printf("而烤肠被一夜风雨冲刷到教学楼旁的草坪,直到第二天被人们发现。\n");
    getchar();
    printf("你心里明白其实真正导致这一切的是你,但是你不想认罪,就冷酷无情地让可怜无辜的猫学姐做了替罪羊!\n");
    getchar();
    printf("不愧是你!\n");
}
void Xiansuo()
{
    int i,n,t;
    Em(&energy,&money);
    char xs[][10]={"外形","时间跳跃","时间倒流","答题"};
    char pay[][10]={"5块","5块","7块","free"};
    char en[][10]={"200","400","500","free"};
    printf("              money    energy\n");
    for(i=0;i<4;i++)
    {
        printf("%-4d%-10s%-10s%-10s\n",i+1,xs[i],pay[i],en[i]);
    }
    scanf("%d",&n);
    if(n==1)
    {
        money-=5;
        energy-=200;
        Em(&energy,&money);
        printf("你刷抖音时看到的身影是黄色。\n");
    }
    else if(n==2)
    {
        money-=5;
        energy-=400;
        Em(&energy,&money);
        srand(time(NULL));
	    t=rand()%1000;
	    if(t>88)
        {
            money-=5;
            energy-=250;
            printf("跳跃成功!\n");
            one();
        }
        else if(t>66)
        {
            money-=5;
            energy-=300;
            printf("跳跃成功!\n");
            two();
        }
        else if(t>44)
        {
            money-=10;
            energy-=150;
            printf("跳跃成功!\n");
            three();
        }
        else
            printf("跳跃失败!\n");
    }
    else if(n==3)
    {
        money-=7;
        energy-=500;
        Em(&energy,&money);
        srand(time(NULL));
	    t=rand()%1000;
	    if(t>99)
            {
                printf("倒流成功!\n");
                Begin();
            }
        else if(t>88)
            printf("哦豁,倒流失败!\n");
        else
            {
                printf("倒流成功!\n");
                Xs();
            }
    }
    else
    {
         Kouhao();
    }
}
void Xs()
{
    int i,n,c=0;
    char xiongshou[][20]={"抖音","脆骨大肠","你自己","猫学姐","我要买线索 "};
    Em(&energy,&money);
    Sleep(1000);
    do{
    printf("\n");
    printf("请选择你心中的凶手:\n");
    printf("\n");
    for(i=0;i<5;i++)
    {
        printf("%-4d%-4s\n",i+1,xiongshou[i]);
    }
    scanf("%d",&n);
    if(n==4)
    {
        printf("哇!答对了!恭喜你打败了百分之%d的玩家,学分upup!\n",99-c*33);
        c=4;
        end();
        printf("\n");
        printf("谜语之内,游戏之间。纵使星移斗转,天翻地覆,你自无忧无惧,因为世界为你而生!\n");
        printf("\n");
        printf("Game over!\n");
        exit(0);
    }
    else if(n==5)
    {
        Xiansuo();
        Xs();//递归
    }
    else
     {
         c++;
         printf("他不是凶手,你还有%d次机会!\n",3-c);
    }
    }while(c<3);
    if(c==3)
    {
        end();
        printf("然而这个计划失败了,你被淀粉肠督察队抓住了!\n");
        printf("\n");
        printf("Game over!\n");
        exit(0);
    }
}
int main()
{
    int n;
    printf("欢迎来到解密游戏!\n");
    getchar();
    printf("请输入你的选择:\n");
O:
K:
F:
    printf("1、开始游戏\n2、读取存档\n3、保存游戏\n4、退出游戏\n5、游戏说明\n");
    scanf("%d",&n);
    switch(n)
    {
    case 1:
        Begin();
        printf("\n");
        wan();
        mid();
        Xs();
        break;
    case 2:
        Former();
        goto F;
        break;
    case 3:
        Save();
        break;
    case 4:
        Out();
        break;
    case 5:
        Grameexplain();
        goto O;
        break;
    default:
        printf("输错啦!\n请再输一次:\n");
        goto K;
        break;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值