Opuscolo 2022-06-04 11:35 采纳率: 50%
浏览 113
已结题

C语言大丰收游戏设计,编译环境dev-c++

C语言,编译环境dev-c++,应用ege图形库, 大丰收是一款锻炼玩家反应能力的游戏,游戏中玩家通过控制左右键控制可爱的小猴子在地面上平行移动,来接取天空中飘落的水果。接到不同的水果会得到不同的分数,桃子10分,西瓜20分,菠萝30分,接到炸弹扣40分,接不到水果也会扣10分,当扣分达到500游戏结束(扣分只计算没接到水果)。

  • 写回答

1条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2022-06-04 12:35
    关注
    
    /////////////////////////////////////////////////////////
    // 程序名称:大丰收
    // 编译环境:Visual C++ 6.0,EasyX 20130610(beta)
    
    //
    #include <graphics.h>
    #include <conio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <IOSTREAM>
    #include <STRING>
    using namespace std;
    #pragma comment(lib, "msimg32.lib")
    #pragma comment(lib, "Winmm.lib")
    
    void printmenu();
    void printscore();
    void monkeymove();
    void printguanshu(int);
    void paixu();
    void paixu2();
    
    
    typedef struct targets    //-----------------控制水果属性的结构体链表
    {
        short type;            //-----------------随机产生水果的种类
        float x;            //-----------------坐标
        float y;
        float speed;        //-----------------下落的速度
        struct targets* node;
    }target;
    
    struct scores            //-----------------分数系统
    {
        int score0;            //-----------------得分数
        int score1;            //-----------------扣分数
        int score2;            //-----------------最高的分数
        char name[20];        //-----------------用户信息
        char name1[20];        //-----------------最高姓名
    }score;
    
    struct _monkey            //-----------------猴子的属性
    {
        float x;            //-----------------坐标
        float y;
        float speed;        //-----------------速度    
    } monkey;
    
    
    int main()
    {
        MessageBox(NULL,"游戏通过键盘的左右键控制小猴左右移动,上键控制小猴的跳动,按住shift可以加速,点击确定后,输入用户名,后回车,点击开始按钮开始游戏,游戏中点击暂停键可以暂停游戏,移开鼠标后再次点击暂停键开始,点击结束键可以结束游戏","杨盼的游戏说明",MB_OK);//-------------------排名的部分
        FILE * fp1;            //-----------------记录玩家姓名成绩
        FILE * fp;            //-----------------记录最高分
        FILE * fp2;            //-----------------记录玩家成绩
        FILE * fp3;            //-----------------记录玩家姓名
        fp1=fopen("排名2.txt","a");
        fp2=fopen("排名3.txt","a");
        fp3=fopen("test.txt","a");
        if ((fp=fopen("排名.txt","r"))==NULL)    //-----判断排名文件不存在       
        {
            cout<<"当前不存在排名"<<endl;        //-----不存在提示
            fp=fopen("排名.txt","w");            //-----以只写的方式建立一个txt文件
            paixu();
            paixu2();
            cout<<"请输入玩家的姓名:";            //-----输入用户名并将用户名保存到txt
            cin>>score.name;                    //-----输入玩家的名字
            score.score0=0;                        //---- 初始化
            score.score1=0;
            score.score2=0;
        }
        else
        {  
            score.score0=0;
            score.score1=0;
            fp=fopen("排名.txt","r+");            //------判断文件存在打开
            fscanf(fp,"%s",&score.name1);        //------读取排名的名字为name1
            fscanf(fp,"%d",&score.score2);        //------读取排名的分数为score2
            paixu();
            paixu2();
            cout<<"请输入玩家的姓名:";
            cin>>score.name;                    //------当前玩家的名字为name
        }
        
        int speed=10;
        cout<<"请输入水果的移动速度,要量力而行啊!推荐值10-30: ";    // 可以用户自行设定速度speed为结构体的speed赋值
        cin>>speed;
        
        
        srand((unsigned int)time(NULL));
        initgraph (750,480, NOCLOSE);                                                // 初始窗口大小
        mciSendString("open targets\\明天的记忆.mp3 alias mymusic", NULL, 0, NULL);    // 打开音乐
        mciSendString("play mymusic", NULL, 0, NULL);                                // 播放音乐
    
        
        MOUSEMSG m,m1,m2;
        int guanshu=1;    //------------------------------关卡全局变量
        IMAGE img_scoredel;
        loadimage(&img_scoredel, "targets\\scoredel.bmp");
        
        
        IMAGE img_xigua;
        loadimage(&img_xigua, "targets\\xigua.bmp");
        
        IMAGE img_taozi;
        loadimage(&img_taozi, "targets\\taozi.bmp");
        
        IMAGE img_boluo;
        loadimage(&img_boluo, "targets\\boluo.bmp");
        
        HDC            dstDC = GetImageHDC();  
        HDC            srcDC;
        
        IMAGE img_zhadan;
        loadimage(&img_zhadan, "targets\\zhadan.bmp");
        
        IMAGE img;
        loadimage(&img, "targets\\monkey.bmp");
        
        IMAGE imgbeijing;
        loadimage(&imgbeijing, "targets\\背景.jpg",640,480);
        
        IMAGE imgbeijing1;
        loadimage(&imgbeijing1, "targets\\背景1.jpg",640,480);
        
        printmenu();
        putimage(0, 0, &imgbeijing);
        BeginBatchDraw();
        target *head=NULL, *point=NULL, *pre=NULL;
        int count=0;
        
        int i=0;
        int s2=1;
        monkey.x=3200; monkey.speed=0; monkey.y=3800;
        
        while(1)
        {
            //-------------开始暂停结束控制部分
            
            if(MouseHit())                    //-------------------- 判断是否按鼠标
            {
                m=GetMouseMsg();
                switch(m.uMsg)
                {
                    case WM_LBUTTONDOWN:    //-------------------- 鼠标左键
                    
                        if(m.x>=670&&m.x<=720&&m.y>=0&&m.y<=50)        // 满足开始坐标--------开始
                        {
                            while(1)
                            {
                                if(MouseHit())                        // 判断是否按鼠标
                                {
                                    m1=GetMouseMsg();
                                    switch(m1.uMsg)
                                    {
                                        case WM_LBUTTONDOWN:
                                            if(m1.x>=670&&m1.x<=720&&m1.y>=60&&m1.y<=110)    // 满足暂停坐标进入死循环---------暂停
                                            {
                                                while(1)
                                                {
                                                    Sleep(20);
                                                    
                                                    m2=GetMouseMsg();
                                                    if(MouseHit())    //---------------------判断再次点击跳出循环继续
                                                    {
                                                        if(m2.uMsg==WM_LBUTTONDOWN && m2.x>=670&&m2.x<=720&&m2.y>=60&&m2.y<=110)
                                                        {
                                                            break;
                                                        }
                                                        
                                                    }
                                                }
                                            }
    
                                            if(m1.x>=670&&m1.x<=720&&m1.y>=120&&m1.y<=170)    //----------结束
                                            {
                                                closegraph();
                                                return 0;
                                            }
    
                                            break;
                                    }
                                }
                            
                                i=rand();
                                if(guanshu==1)
                                {
                                    putimage(0,0,&imgbeijing);    //------------ 清屏
                                }
                                else
                                {
                                    putimage(0,0,&imgbeijing1);    //------------ 清屏
                                }
                                
                                printscore();
                                monkeymove();
                                printguanshu(guanshu);
                            
                            
                                srcDC = GetImageHDC(&img);
                                TransparentBlt(dstDC, monkey.x/10, monkey.y/10, 60, 60, srcDC, 0, 0, 60, 60, RGB(0,0,0));
                                
                                if((i%1000)<=30 && count<15)    //-------------生成水果链表 赋随机值
                                {
                                    point=head;
                                    head=(targets*)malloc(sizeof(targets));
                                    ++count;
                                    head->speed=speed;
                                    head->type=(i%6);
                                    head->x=(i%6000);
                                    head->y=-10;
                                    head->node=point;
                                }    
                            
                                for(pre=point=head;point!=NULL;pre=point,point=point->node)
                                {
                                    
                                    if(abs(point->y-monkey.y)<=300 && abs(monkey.x-point->x)<=300) // 碰到水果的条件    
                                    {
                                        
                                        if (point->type==3)        //------------桃子加分
                                        {
                                            putimage(700,450,&img_scoredel);
                                            score.score0+=10;
                                        }
                                        
                                        if (point->type==1)        //------------西瓜加分
                                        {  
                                            putimage(700,450,&img_scoredel);
                                            score.score0+=20;
                                        }
                                        
                                        if (point->type==2)        //------------菠萝加分
                                        {
                                            putimage(700,450,&img_scoredel);
                                            score.score0+=30;        
                                        }
                                        
                                        if (point->type==0)        //------------炸弹减分
                                        {   
                                            putimage(700,450,&img_scoredel);
                                            score.score0-=40;        
                                        }
                                        
    
                                        if(head==point)            //------------遍历链表消除满足条件的水果
                                        {
                                            head=point->node;
                                            free(point);
                                            --count;
                                            point=head;
                                            if(point==NULL)
                                                break;
                                            continue;
                                        }
                                        pre->node=point->node;
                                        free(point);
                                        --count;
                                        point=pre;
                                        continue;
                                    }
    
                                    if(point->y > 5000)        //------------边界5000
                                    {                        //------------没有接到的水果扣分
                                        if (point->type==3)    //------------桃子
                                        {
                                            score.score1+=10;
                                        }
                                    }
                                    
                                    if(point->y > 5000)
                                    {
                                        if (point->type==1)    //------------西瓜
                                        {
                                            score.score1+=10;
                                        }
                                    }
                                    
                                    if(point->y > 5000)
                                    {
                                        if (point->type==2)    //-------------菠萝
                                        {
                                            score.score1+=10;
                                        }
                                    }
                                    
                                
                                    if(score.score0>500)    //-------------当得分达到500进入第二关
                                    {
                                        guanshu=2;
                                    }
                                    
                                    if (score.score1>500)    //-------------当没接到水果扣分达到500要求退出游戏
                                    {
                                        MessageBox(NULL,"你输了,系统将保存您当前的用户名和得分","杨盼提醒您",MB_OK);
                                        
                                        fprintf(fp1,"%s ",score.name);    //-写入所有玩家信息
                                        fprintf(fp1,"%d\0",score.score0);
                                        fprintf(fp2,"%d\0",score.score0);
                                        fprintf(fp3,"%s ",score.name);
                                        
                                        
                                        if(score.score0>score.score2)    //判断  如果当前用户的得分大于最高的历史得分  那么则覆盖最高
                                        {
                                            fp=fopen("排名.txt","w");
                                            fprintf(fp,"%s ",score.name);
                                            fprintf(fp,"%d",score.score0);
                                            
                                        }
                                        exit(0);
                                    }
                                
                                    if(point->y>5000)    //---------------消除超界的水果
                                    {   
                                        
                                        if(head==point)
                                        {
                                            head=point->node;
                                            free(point);
                                            --count;
                                            point=head;
                                            if(point==NULL)
                                                break;
                                            continue;
                                        }
                                        pre->node=point->node;
                                        free(point);
                                        --count;
                                        point=pre;
                                        continue;
                                    }
                                
                                
                                    if (point->type==3)    //-------------------------根据type的随机值显示不同的水果
                                    {
                                        
                                        srcDC = GetImageHDC(&img_taozi);    //-----桃子
                                        TransparentBlt(dstDC,point->x/10,point->y/10, 60, 50, srcDC, 0, 0, 60, 50, RGB(0,0,0));
                                    }
                                    
                                    if (point->type==1)
                                    {
                                        
                                        srcDC = GetImageHDC(&img_xigua);    //------西瓜
                                        TransparentBlt(dstDC,point->x/10,point->y/10, 60, 50, srcDC, 0, 0, 60, 50, RGB(0,0,0));
                                    }
                                    
                                    if (point->type==2)
                                    {
                                        
                                        srcDC = GetImageHDC(&img_boluo);    //------菠萝
                                        TransparentBlt(dstDC,point->x/10,point->y/10, 60, 50, srcDC, 0, 0, 60, 50, RGB(0,0,0));
                                    }
                                    
                                    if (point->type==0)
                                    {
                                        
                                        srcDC = GetImageHDC(&img_zhadan);    //-------炸弹
                                        TransparentBlt(dstDC,point->x/10,point->y/10, 50, 100, srcDC, 0, 0, 50, 100, RGB(0,0,0));
                                    }
                                    
                                    if(guanshu==1)
                                    {
                                        (point->y) = (point->y) + (point->speed) + 5*(point->type);    //------------------第一关---------------------------------控制不同水果的速度  通过type
                                    }
                                    else
                                    {
                                        (point->y) = (point->y) + (point->speed) + 2*(point->type);    //------------------第二关---------------------------------控制不同水果的速度  通过type
                                        (point->x) = (point->x)+3*s2*(point->type);
                                        s2=-s2;
                                    }
                                }
    
                                FlushBatchDraw();
                                Sleep(10);
                            }
                        }
                    }
            }
        }
    
        return 0;
    }
    
    
    void printmenu()
    {
        outtextxy(680,20,"开始");
        rectangle(670,0,720,50);
    
        outtextxy(680,80,"暂停");
        rectangle(670,60,720,110);
    
        outtextxy(680,140,"结束");
        rectangle(670,120,720,170);
    
        char s[20];
    
        sprintf(s, "%d", score.score2);    // 显示最高分玩家名和分
        outtextxy(680, 230, s);
        outtextxy(680, 200, score.name1);
        outtextxy(640, 180, "最高用户名得分");
    }
    
    
    void printscore()
    {
        char s[20];                            // 整形转换字符输出
    
        sprintf(s, "%d", score.score0);        // 记分
        outtextxy(640, 400, "当前总得分数");
        outtextxy(700, 450, s);
        
        sprintf(s, "%d", score.score1);
        outtextxy(640, 350, "总扣分");
        outtextxy(700, 375, s);
    }
    
    
    void printguanshu(int x)
    {
        IMAGE img_scoredel;
        loadimage(&img_scoredel, "targets\\scoredel.bmp");
    
        switch(x)
        {
            case 1 :
                outtextxy(640,300,"第一关");
                break;
            case 2 :
                putimage(640,300,&img_scoredel);
                outtextxy(640,250,"第二关");
                break;
        }
    }
    
    
    void monkeymove()
    {
        #define KEYDOWN(vk_code)    ((GetAsyncKeyState(vk_code) & 0x8000) ?1:0)
        #define KEYUP(vk_code)        ((GetAsyncKeyState(vk_code) & 0x8000) ?0:1 )
        
        if(KEYDOWN(VK_LEFT) && monkey.x>0)    //----------------------上下左右控制部分
        {
            if(KEYDOWN(VK_SHIFT))            //----------------------shift加速,向左
            {
                monkey.x-=40;
            }
            else
            {
                monkey.x-=20;
            }
        }
        
        else if(KEYDOWN(VK_RIGHT) && monkey.x<5800)    //---------------向右
        {
            if(KEYDOWN(VK_SHIFT))
            {
                monkey.x+=40;
            }
            else
            {
                monkey.x+=20;
            }
        }
        
        if(KEYDOWN(VK_UP)&&monkey.y==3800)            //--------------向上
        {
            monkey.speed=45;
        }
        
        if (KEYDOWN(VK_SPACE))    //----------------------------------暂停
        {
            system("pause");
            
        }
        
        monkey.y-=monkey.speed;
        
        if(monkey.y>=3800)        //---------------------------------超界限处理
        {
            monkey.y=3800;
            monkey.speed=0;
        }
        else
            monkey.speed--;
        
    }
    
    
    void paixu()
    {
        FILE *fin;
        int x[3],t;
        int i,j;
        
        fin=fopen("排名3.txt","r");
        for (i=0;i<3;i++) fscanf(fin,"%d",&x[i]);
        fclose(fin);
        for (i=0;i<3;i++)
            for (j=i+1;j<3;j++)
                if (x[i] > x[j]){ t=x[i];x[i]=x[j];x[j]=t;};
                for (i=0;i<3;i++) 
                    cout<<x[i]<<endl;
    }
    
    
    void paixu2()
    {
        FILE *fin;
        char a[10];
        char b[10];
        char c[10];
        
        fin=fopen("test.txt","r");
        
        fscanf(fin,"%s%s%s",a,b,c);
        fclose(fin);
        
        cout<<a<<endl<<b<<endl<<c<<endl;
    }
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月4日
  • 修改了问题 6月4日
  • 创建了问题 6月4日

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振