C语言实现打飞机游戏
本文实例为大家分享了C语言实现打飞机游戏的具体代码,供大家参考,具体内容如下
#include#include #include #include #defineU1 #defineD2 #defineL3 #defineR4 typedefstructnode//己方飞机的节点 { intx; inty; structnode*next; }node; typedefstructBullet { intx; inty; intstatus;//01表示此处是否有子弹 structBullet*next; }Bullet;//子弹模型节点 typedefstructEnemy { intx; inty; intstatus;//01表示此节点是否存在飞机 }Enemy;//敌机节点 //全局变量// node*head,*p; EnemyEhead[30]; Bullet*HBullet,*q,*H; intStatus,score=0; intBulletStatus,s=1; intadd_1=1,add_2=0; //函数声明// voidPos();//固定光标 voidCreateMap();//创建游戏界面 voidCreateAircraft();//创建自己的飞机 voidprintAircraft();//打印自己的飞机 voidAircraftmove();//自己飞机的移动 voidCreateEnemyAircraftModel();//创建敌机的模型结构体数组 voidCreateEnemyAircraft();//创建一架敌方飞机 voidEnemyAircraftMove();//敌机的移动 voidCreateBulletModel();//创建子弹的模型 voidShoot();//发射子弹 voidBulletmove();//子弹的移动 intGetBulletStatus();//获取是否有子弹存在 voidJudgeCollide();//判定是否击中敌机 voidJudgeGameOver();//判定是否与敌机相撞 //为了防止在运行别的函数时这个函数无法运行,所以讲起嵌入每一个循环的函数中,保证不遗漏任何情况. voidPause();//暂停 voidControlGame();//控制游戏主程序 voidGameStart();//游戏开的的预先运行函数集合 voidEndGame();//结束游戏 /* ■飞机的基本模型 ■■■第一行为机头,敌机的设定只需用到机头,机身仅仅只是打印出来,并没有实际内容 ■■■下两行为机身 */ voidPos(intx,inty)//设置光标位置 { COORDpos; pos.X=x; pos.Y=y; HANDLEhOutPut; hOutPut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutPut,pos); } voidCreateMap() { system("modeconcols=100lines=55"); inti; for(i=0;i<=67;i+=2)//上下边 { Pos(i,0); printf("■"); Pos(i,50); printf("■"); } for(i=0;i<=50;i++)//左右边 { Pos(0,i); printf("■"); Pos(66,i); printf("■"); } Pos(80,8); printf("您的得分%d",score); Pos(70,20); printf("Space:发射子弹"); Pos(70,22); printf("ESC:退出游戏"); Pos(70,24); printf("Enter:暂停"); Pos(70,26); printf("用↑.↓.←.→控制飞机"); Pos(70,28); printf("F1:加速敌机的产生"); Pos(70,30); printf("F2:减缓敌机的产生"); Pos(80,40); printf("特别说明:"); Pos(70,42); printf("敌机从地图下飞出不结束游戏"); } voidCreateAircraft() { node*q; inti; head=(node*)malloc(sizeof(node));//链表形式创建飞机,x,y分别为显示的坐标 head->x=32; head->y=47; q=head; for(i=0;i<=4;i+=2) { p=(node*)malloc(sizeof(node)); head->next=p; p->x=30+i; p->y=48; head=p; } for(i=0;i<=4;i+=2) { p=(node*)malloc(sizeof(node)); head->next=p; p->x=30+i; p->y=49; head=p; } p->next=NULL; head=q; p=head; } voidprintAircraft() { while(p!=NULL) { Pos(p->x,p->y); printf("■"); p=p->next; } p=head; } voidAircraftmove() { JudgeGameOver(); JudgeCollide(); Sleep(50); if(Status==U)//向上飞行 { while(p!=NULL) { p->y=p->y-1; Pos(p->x,p->y); printf("■"); p=p->next; } p=head; Pos(p->x-2,p->y+3); printf(""); Pos(p->x,p->y+3); printf(""); Pos(p->x+2,p->y+3); printf(""); } if(Status==D)//向下飞行 { while(p!=NULL) { p->y=p->y+1; Pos(p->x,p->y); printf("■"); p=p->next; } p=head; Pos(p->x,p->y-1); printf(""); Pos(p->x-2,p->y); printf(""); Pos(p->x+2,p->y); printf(""); } if(Status==L)//向左飞行 { while(p!=NULL) { p->x=p->x-2; Pos(p->x,p->y); printf("■"); p=p->next; } p=head; Pos(p->x+2,p->y); printf(""); Pos(p->x+4,p->y+1); printf(""); Pos(p->x+4,p->y+2); printf(""); } if(Status==R)//向右飞行 { while(p!=NULL) { p->x=p->x+2; Pos(p->x,p->y); printf("■"); p=p->next; } p=head; Pos(p->x-2,p->y); printf(""); Pos(p->x-4,p->y+1); printf(""); Pos(p->x-4,p->y+2); printf(""); } } voidCreateEnemyAircraftModel() { intj; for(j=1;j<=30;j++)//结构体数组表示敌军飞机最多同时存在30架,也许不可能有那么多,数字用的稍大. {//每一个值表示一架飞机,敌机只需知道其机头坐标 Ehead[j].x=-1; Ehead[j].y=1; Ehead[j].status=0; } } voidCreateEnemyAircraft()//创建出一架新的飞机 { JudgeCollide(); JudgeGameOver(); srand((unsigned)time(NULL)); intj; for(j=1;j<=20;j++) { if(Ehead[j].status==0) { JudgeGameOver(); while(Ehead[j].x%2!=0)//保证机头x为偶数,对其格子. { Ehead[j].x=rand()%62+3; } Ehead[j].y=1; Ehead[j].status=1; Pos((Ehead[j].x),(Ehead[j].y)); printf("■"); break; } } } voidEnemyAircraftMove()//模拟敌机向下飞行的函数 { Sleep(100); if(s>=15)//控制敌机飞机的出现频率 { CreateEnemyAircraft(); s=1; } s=s+add_1; JudgeCollide(); JudgeGameOver(); intj; for(j=1;j<=30;j++) { if(Ehead[j].status==1&&Ehead[j].y==1)//特殊情况 { Pos(Ehead[j].x,Ehead[j].y); printf(""); } if(Ehead[j].status==1&&Ehead[j].y==2)//特殊情况 { Pos(Ehead[j].x,Ehead[j].y); printf(""); Pos(Ehead[j].x-2,Ehead[j].y-1); printf(""); } if(Ehead[j].status==1&&3<=Ehead[j].y&&Ehead[j].y<=49) { Pos(Ehead[j].x,Ehead[j].y); printf(""); Pos(Ehead[j].x-2,Ehead[j].y-1); printf(""); Pos(Ehead[j].x-2,Ehead[j].y-2); printf(""); } if(Ehead[j].status==1&&Ehead[j].y==50)//特殊情况 { Pos(Ehead[j].x-2,Ehead[j].y-1); printf(""); Pos(Ehead[j].x-2,Ehead[j].y-2); printf(""); } if(Ehead[j].status==1&&Ehead[j].y==51)//特殊情况 { Pos(Ehead[j].x-2,Ehead[j].y-2); printf(""); } } for(j=1;j<=20;j++)//将每一个敌机机头向下移动一位 { if(Ehead[j].status==1) { if(Ehead[j].y<=52) { Ehead[j].y=Ehead[j].y+1; } if(Ehead[j].y>=53) { Ehead[j].status=0; } } } for(j=1;j<=20;j++) { if(Ehead[j].status==1&&Ehead[j].y==2)//特殊情况 { Pos(Ehead[j].x,Ehead[j].y); printf("■"); Pos(Ehead[j].x-2,Ehead[j].y-1); printf("■■■"); } if(Ehead[j].status==1&&3<=Ehead[j].y&&Ehead[j].y<=50) { Pos(Ehead[j].x,Ehead[j].y); printf("■"); Pos(Ehead[j].x-2,Ehead[j].y-1); printf("■■■"); Pos(Ehead[j].x-2,Ehead[j].y-2); printf("■■■"); } if(Ehead[j].status==1&&Ehead[j].y==51)//特殊情况 { Pos(Ehead[j].x-2,Ehead[j].y-1); printf("■■■"); Pos(Ehead[j].x-2,Ehead[j].y-2); printf("■■■"); } if(Ehead[j].status==1&&Ehead[j].y==52)//特殊情况 { Pos(Ehead[j].x-2,Ehead[j].y-2); printf("■■■"); } } JudgeGameOver(); } voidCreateBulletModel()//创建子弹的模型 { inti; q=(Bullet*)malloc(sizeof(Bullet)); q->x=0; q->y=1; q->status=0; H=q; for(i=2;i<=46;i++)//每行最多存在一个子弹,子弹的最大数值为地图上下边框所确定的值.所以一上下边框确定一个最大的链表. { HBullet=(Bullet*)malloc(sizeof(Bullet)); HBullet->y=i; HBullet->x=-1; HBullet->status=0; q->next=HBullet; q=HBullet; } q->next=H; HBullet=H; } voidShoot()//发射子弹 { JudgeGameOver(); JudgeCollide(); while(HBullet->next->y!=head->y) { HBullet=HBullet->next; } HBullet->x=head->x; HBullet->status=1;//1表示此处有子弹 Pos(HBullet->x,HBullet->y); printf("■"); HBullet=H; } voidBulletMove()//子弹的飞行 {//与敌军飞机飞行同理 JudgeGameOver(); JudgeCollide(); while(HBullet!=q) { if(HBullet->status==1) { Pos(HBullet->x,HBullet->y); printf(""); } HBullet=HBullet->next; } HBullet=H->next; while(HBullet!=q) { H->x=HBullet->x; H->status=HBullet->status; H=H->next; HBullet=HBullet->next; } HBullet=HBullet->next; H=HBullet; while(HBullet!=q) { if(HBullet->status==1) { Pos(HBullet->x,HBullet->y); printf("■"); } HBullet=HBullet->next; } HBullet=H; JudgeGameOver(); } intGetBulletStatus()//获取地图中是否存在子弹,不存在子弹的时候BulletMove()将不运行 { JudgeGameOver(); JudgeCollide(); while(HBullet!=q) { if(HBullet->status==1) { BulletStatus=1; break; } HBullet=HBullet->next; } HBullet=H; return0; } voidJudgeCollide()//判断是否集中敌机 { intj; while(HBullet!=q) { for(j=1;j<=30;j++) { JudgeGameOver(); if(HBullet->status==1&&Ehead[j].status==1) { if((HBullet->x==Ehead[j].x&&HBullet->y==Ehead[j].y)) { HBullet->status=0; Ehead[j].status=0; score=score+10+add_2; Pos(80,8); printf("您的得分%d",score); Pos(HBullet->x,HBullet->y); printf(""); Pos(HBullet->x-2,HBullet->y-1); printf(""); Pos(HBullet->x-2,HBullet->y-2); printf(""); } if(HBullet->x+2==Ehead[j].x&&HBullet->y==Ehead[j].y) { HBullet->status=0; Ehead[j].status=0; score=score+10+add_2; Pos(80,8); printf("您的得分%d",score); Pos(HBullet->x,HBullet->y); printf(""); Pos(HBullet->x+2,HBullet->y); printf(""); Pos(HBullet->x,HBullet->y-1); printf(""); Pos(HBullet->x,HBullet->y-2); printf(""); } if(HBullet->x-2==Ehead[j].x&&HBullet->y==Ehead[j].y) { HBullet->status=0; Ehead[j].status=0; score=score+10+add_2; Pos(80,8); printf("您的得分%d",score); Pos(HBullet->x,HBullet->y); printf(""); Pos(HBullet->x-2,HBullet->y); printf(""); Pos(HBullet->x-4,HBullet->y-1); printf(""); Pos(HBullet->x-4,HBullet->y-2); printf(""); } } } HBullet=HBullet->next; } HBullet=H; } voidJudgeGameOver()//判断是否撞机 { intj; for(j=1;j<=30;j++) { while(p!=NULL) { if(Ehead[j].x==p->x&&Ehead[j].y==p->y) { EndGame(); } p=p->next; } } p=head; } voidPause()//暂停 { while(1) { Sleep(300); if(GetAsyncKeyState(VK_RETURN)) { break; } } } voidControlGame()//控制主程序 { while(1) { JudgeGameOver(); JudgeCollide(); if(GetAsyncKeyState(VK_UP)&&head->y!=1) { Status=U; Aircraftmove(); } elseif(GetAsyncKeyState(VK_DOWN)&&head->y+2!=49) { Status=D; Aircraftmove(); } elseif(GetAsyncKeyState(VK_LEFT)&&head->x-2!=2) { Status=L; Aircraftmove(); } elseif(GetAsyncKeyState(VK_RIGHT)&&head->x+2!=64) { Status=R; Aircraftmove(); } if(GetAsyncKeyState(VK_F1)&&head->y!=1) { if(add_1<5) { add_1=add_1+1; add_2=add_2+2; } } if(GetAsyncKeyState(VK_F2)&&head->y!=1) { if(add_1>2&&add_1<=5) { add_1=add_1-1; add_1=add_2-2; } } elseif(GetAsyncKeyState(VK_RETURN)) { Pause(); } elseif(GetAsyncKeyState(VK_SPACE)) { Shoot(); } elseif(GetAsyncKeyState(VK_ESCAPE)) { EndGame(); } GetBulletStatus(); if(BulletStatus==1) { BulletMove(); } EnemyAircraftMove(); JudgeGameOver(); } } voidGameStart() { CreateMap(); CreateAircraft(); printAircraft(); CreateEnemyAircraftModel(); CreateBulletModel(); } voidEndGame() { system("cls"); Pos(35,25); printf("GameOver."); Pos(1,50); exit(0); } voidmain() { GameStart(); ControlGame(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。