# include<># include <># include <># include <># pragma comment(lib,””) //引用Windows Multimedia APT int score =0; //全局变量********整型的分数char s[5]; //全局变量****字符型的分数struct player_ //自定义的结构体,并顺便定义一个结构体变量 {char name[20];int score_;}player[11];/***************函数声明*****************/void record_(); //记录彼此成绩函数void welcome( ); //欢迎界面函数void instructions( ); //游戏说明界面函数void gane (int rank2); //游戏函数void record ( ); //显示记录函数int rank_(char rank1); //等级选择函数void goodbye ( ); //退出界面函数 /**************主函数**************/int main (){ char rank1; //rank1接受从键盘输入的字符,根据字符判断等级 int rank2=15; // 控制延时时间,从而控制速度 intsign=1; // 当做标记,用于标记是否弹出MessageBox对话框welcome ( ); //调用欢迎界面函数 instructions ( ); //调用游戏什么函数 record( ); //调用显示记录函数 InputBox(player[10].name,20,"请输入玩家昵称"; //以对话框形式获取用户输入函数 rank1=getch();//读入一个字母 rank2=rank_(rank1); //调用等级函数 game (rank2); //调用游戏函数 HWND wnd =GetHWnd(); while (sign) //sign作为标记,执行循环 if (MessageBox(wnd,"游戏结束!!!\n再来一局,挑战更高分数","询问",MB_YESNO|MB_ICONQUESTION)==IDYES) game (rank2); else { sign=0; goodbye( ); } closegraph( ); return 0;}/***************记录本次成绩函数***************/void record_(){ FILE*fp; //文件指针 int i,j; struct player_t; //定义结构体变量t,冒泡法比较大小时用 player[10].score_=score; //把该局的分数赋给该局用户的结构体变量中 fp=fopen("记录.dat","rb"); //打开二进制文件 for (i=0;i<10;i++) { fread(player[i].name,20,l,fp); //读入记录中的成绩和名字 fread (&player[i].score_,4,l,fp); } fclose(fp); //关闭二进制文件 for (j=0;j<10;j++) //冒泡法排序 for (i=0;i<10-j;i++) if (player[i].score_) { t=player[i]; player[i]=player[i+1]; player[i+1]=t; } fp=fopen("记录.dat","wb"); //打开文件 for (i=0;i<10;i++) //把排好序列的数据存入记录文件 { fwrite(player[i].name,20,l,fp); fwrite (&player[i].score_,4,l,fp); } fclose(fp); //关闭文件} /****************欢迎界面函数****************/ void welcome ( ) { char ch; mciSendString("open\"res\\Sleep \"alias mymusic",NULL,0,NULL); initgraph(640,480); //初始化画图界面 IMAGE img; //定义IMAGE对象 loadimage (&img,"res\\"); //读取图片到img对象中 putimage (0,0,&img); //在坐标(0,0)位置显示IMAGE对象 ch=getch(); //吸收掉一个按键 cleardevice(); //清屏 } /***************游戏说明界面函数**************/ void instructions() { int c=255; //控制变色的变量 setcolor(YELLOW); //设置颜色 setfont (30,0,"黑体"); //设置字体 outtextxy(0,0,"游戏说明"); //输出文字 setcolor(WHITE); setfont(28,0,"宋体"); outtextxy(0,30,"一、每次游戏下落200个字母"); //输出文字 outtextxy(0,58,"二、请按数字键选择游戏等级"); outtextxy(0,86,"三、统计被击中的个数"); setfont(30,0,"华文行楷") outtextxy (20,220,"等级一二三四 五六七八九"); outtextxy(20,260,“按键 1 2 3 4 5 6 7 8 9”); while (!kbhit()) //kihit()作用是判断是否有字幕输入 { setcolor(RGB(c,255,0)); setfont (80,0,"楷体"); outtextxy(140,130,"请选择等级"); setcolor(RGB(c,0,255)); setfont(100,0,"Wickenden Cafe NDP"); outtextxy(100,135,"Let's go!!!"); c-=25; //控制颜色的变量自减 if(c<0)c=255; //控制颜色的变量小于0时,再把255赋给c cleardevice(); //清屏 } /***************退出界面函数***************/ void goodbye() {int c=255; //控制变色变量 cleardevice(); //清屏 setcolor(YELLOW); setfont (48,0,"黑体"); outtextxy (104,120,"的最终成绩是: "); setfont (48,0,"华文楷体"); setcolor(RGB(255,255,0)); outtextxy(140,320,"按任意键退出游戏"); setcolor(YELLOW); setfont(48,0,"黑体"); outtextxy (104,120,"的最终成绩是: "); outtextxy(104,70,player[10].name); record_(); //调用记录本次成绩函数 while(!kbhit()) { setcolor(RGB(255,0,c-100)); //设置颜色 setfont(100,0,”Wickenden Café NDP”);outtextxy(400,90,s); //输出数字setcolor(RGB(c,0,255));setfont(48,0,”黑体”);if (score==200)outtextxy(100,200,”全部击中!!!”);elseif(score>190)outtextxy(100,200,”不错!继续加油!”);elseouttextxy(100,200,”不要灰心!继续加油!”);c-=25;if(c<0)c=255;Sleeep(20); //延时20秒}getch( ); //提供给用户时需要等待输入后再退出} /**************等级选择函数**************/int rank_(char rank1){int rank2;switch(rank1) //判断字符,确定等级{case’0’:rank2=11;break;case’1’:rank2=10;break; case’2’:rank2=9;break; case’3’:rank2=8;break;case’4’:rank2=7;break;case’5’:rank2=6;break;case’6’:rank2=5;break;case’7’:rank2=4;break;case’8’:rank2=3;break;case’9’:rank2=2;break;default:rank2=15;break;}return rank2;} /**************显示记录函数***********/void record( ){FILE *p; //文件指针int a[10],j;char b[10][10];fp=fopen(“记录。dat”,”rb”); //打开文件for (j=0;j<10;j++){fread(player[j].name,20,1,fp); //读取文件中的信息fread(&player[j].score_,4,1,fp);}fclose(fp); //关闭文件setfont(60,0,”Arial”);setcolor(RGB(250,250,0));outtextxy(250,0,”TOP10”);for(j=0;j<10;j++){sprintf(“b[j],%d”,player[j].score_); //把整型转换为字符型setcolor(RGB(0,100,255));setfont(40,0,”Arial”);outtextxy(420,50+40*j,b[j]);outtextxy(120,50+40*j,player[j].name); //输出名字 /**********游戏函数******************/void game (int rank2){cleardevice( ); //清屏score=0; //清除掉原有的分数outtextxy(0,0,”玩家:”);outtextxy(90,0,player[10].name);setfont(20,0,”Arial”);outtextxy(100,460,” 人生有享受片刻优雅恬适的权力,让打字母游戏放松你一下吧!”);int i;char target; //目标字母char key; //用户的按键intx,y; //字母的位置int flag =1; //标记是否按了退出键int sum=0; //成绩计数int num =200; //规定下落字母的个数 srand (time(NULL)); //随机时间种子,设置第一个随机函数的值setfillstyle(BLACK); //设置下面矩形内图的颜色setcolor(YELLOW); //line(0,450,640,450); //用3条线规定一下工作区line(0,440,640,440); //用3条线规定一下工作区line(0,40,640,40); //用3条线规定一下工作区 while (flag&&num){setfont(40,0,”宋体”); //设置字母的字体和大小i=rand()%2; //rand()函数返回0~32767之间的一个整数if(i)target=97+rand()%26; //产生任意小写字母elsetarget=65+rand()%26; //产生任意大写字母x=rand()%610; //产生任意下落位置for (y=41;y<380;y++){setcolor (RGB(255,0,255));outtextxy(x,y,target); //显示字母 if(kbhit()){key=getch(); //获取用户按键if ((key==target)||( key==target-32)||( key==target+32)){score++; //分数统计sprintf(s,”%d”score);setfont(30,0,”Arial”);outtextxy(500,0,“分数”);outtextxy(600,0,s); //输出分数bar(x-10,y-10,x+35,y+50); // 击中用黑框形擦去字母break; //跳出循环,进行下一个字母}else if (key==27) //判断是否按了{flag=0; //若果按ESC,退出游戏主循环break;}}Sleep(rank2); //控制清除字母的时间爱你也就是控制下落速度bar(x,y,x+35,y+60); //擦最下面的字符}num--; //计数}}