700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言小游戏 飞机大战

C语言小游戏 飞机大战

时间:2018-10-23 02:54:18

相关推荐

C语言小游戏 飞机大战

C语言写的一个小游戏,飞机大战

直接复制代码就可以运行了QAQ

#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#define U 1#define D 2#define L 3#define R 4typedef struct node //己方飞机的节点{int x;int y;struct node *next;}node;typedef struct Bullet{int x;int y;int status; //0 1 表示此处是否有子弹struct Bullet *next;}Bullet; //子弹模型节点typedef struct Enemy{int x;int y;int status; //0 1 表示此节点是否存在飞机}Enemy; //敌机节点// 全局变量//node *head,*p;Enemy Ehead[30];Bullet *HBullet,*q,*H;int Status,score=0;int BulletStatus,s=1;int add_1=1,add_2=0;//函数声明//void Pos(); //固定光标void CreateMap();//创建游戏界面void CreateAircraft();//创建自己的飞机void printAircraft(); //打印自己的飞机void Aircraftmove(); //自己飞机的移动void CreateEnemyAircraftModel();//创建敌机的模型 结构体数组void CreateEnemyAircraft(); //创建一架敌方飞机void EnemyAircraftMove(); //敌机的移动void CreateBulletModel(); //创建子弹的模型void Shoot();//发射子弹void Bulletmove();//子弹的移动int GetBulletStatus(); //获取是否有子弹存在void JudgeCollide(); //判定是否击中敌机void JudgeGameOver(); //判定是否与敌机相撞 //为了防止在运行别的函数时这个函数无法运行,所以讲起嵌入每一个循环的函数中,保证不遗漏任何情况.void Pause();//暂停void ControlGame(); //控制游戏主程序void GameStart(); //游戏开的的预先运行函数集合void EndGame();//结束游戏/* ■ 飞机的基本模型 ■■■ 第一行为机头, 敌机的设定只需用到机头,机身仅仅只是打印出来,并没有实际内容■■■ 下两行为机身*/void Pos(int x,int y)//设置光标位置{COORD pos;pos.X=x;pos.Y=y;HANDLE hOutPut;hOutPut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutPut,pos);}void CreateMap(){system("mode con cols=100 lines=55");int i;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("敌机从地图下飞出不结束游戏");}void CreateAircraft(){node *q;int i;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;}void printAircraft(){while(p!=NULL){Pos(p->x,p->y);printf("■");p=p->next;}p=head;}void Aircraftmove(){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(" ");}}void CreateEnemyAircraftModel(){int j;for(j=1;j<=30;j++) //结构体数组表示敌军飞机最多同时存在30架,也许不可能有那么多,数字用的稍大.{//每一个值表示一架飞机,敌机只需知道其机头坐标Ehead[j].x=-1;Ehead[j].y=1;Ehead[j].status=0;}}void CreateEnemyAircraft()//创建出一架新的飞机{JudgeCollide();JudgeGameOver();srand((unsigned)time(NULL));int j;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;}}}void EnemyAircraftMove()//模拟敌机向下飞行的函数{Sleep(100);if(s>=15) //控制敌机飞机的出现频率{CreateEnemyAircraft(); s=1;}s=s+add_1;JudgeCollide();JudgeGameOver();int j;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();}void CreateBulletModel() //创建子弹的模型{int i;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;}void Shoot() //发射子弹{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;}void BulletMove() //子弹的飞行{//与敌军飞机飞行同理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();}int GetBulletStatus() //获取地图中是否存在子弹,不存在子弹的时候BulletMove()将不运行{JudgeGameOver();JudgeCollide();while(HBullet!=q){if(HBullet->status==1){BulletStatus=1;break;}HBullet=HBullet->next;}HBullet=H;return 0;}void JudgeCollide() //判断是否集中敌机{int j;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;}void JudgeGameOver() //判断是否撞机{int j;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;}void Pause()//暂停{while(1){Sleep(300);if(GetAsyncKeyState(VK_RETURN)){break;}}}void ControlGame() // 控制主程序{while(1){JudgeGameOver();JudgeCollide();if(GetAsyncKeyState(VK_UP) && head->y!=1){Status=U;Aircraftmove();}else if(GetAsyncKeyState(VK_DOWN) && head->y+2!=49){Status=D;Aircraftmove();}else if(GetAsyncKeyState(VK_LEFT) && head->x-2!=2){Status=L;Aircraftmove();}else if(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;}}else if(GetAsyncKeyState(VK_RETURN)){Pause();}else if(GetAsyncKeyState(VK_SPACE)){Shoot();}else if(GetAsyncKeyState(VK_ESCAPE)){EndGame();}GetBulletStatus();if(BulletStatus==1){BulletMove();}EnemyAircraftMove();JudgeGameOver();}}void GameStart(){CreateMap();CreateAircraft();printAircraft();CreateEnemyAircraftModel();CreateBulletModel();}void EndGame(){system("cls");Pos(35,25);printf("Game Over.");Pos(1,50);exit(0);}int main(){GameStart();ControlGame();}

原文地址:/thread-48362-1-1.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。