C语言,编译环境dev-c++,应用ege图形库, 大丰收是一款锻炼玩家反应能力的游戏,游戏中玩家通过控制左右键控制可爱的小猴子在地面上平行移动,来接取天空中飘落的水果。接到不同的水果会得到不同的分数,桃子10分,西瓜20分,菠萝30分,接到炸弹扣40分,接不到水果也会扣10分,当扣分达到500游戏结束(扣分只计算没接到水果)。
1条回答 默认 最新
关注 ///////////////////////////////////////////////////////// // 程序名称:大丰收 // 编译环境: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; }
解决 无用评论 打赏 举报
悬赏问题
- ¥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时钟芯片不启振