安徽科技学院 信网学院网络文化节 田红

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>

#define U 1
#define D 2
#define L 3
#define R 4

typedef 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(StatusU) //向上飞行
{
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(StatusL) //向左飞行
{
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].status1 && Ehead[j].y1) //特殊情况
{
Pos(Ehead[j].x,Ehead[j].y);
printf(" “);
}
if(Ehead[j].status1 && Ehead[j].y2) //特殊情况
{
Pos(Ehead[j].x,Ehead[j].y);
printf(” “);
Pos(Ehead[j].x-2,Ehead[j].y-1);
printf(” ");
}
if(Ehead[j].status1 && 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].y50)//特殊情况
{
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].y51)//特殊情况
{
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].status1 && Ehead[j].y2)//特殊情况
{
Pos(Ehead[j].x,Ehead[j].y);
printf(“■”);
Pos(Ehead[j].x-2,Ehead[j].y-1);
printf(“■■■”);
}
if(Ehead[j].status1 && 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].y51)//特殊情况
{
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->status1 && Ehead[j].status1)
{
if((HBullet->xEhead[j].x && HBullet->yEhead[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+2Ehead[j].x && HBullet->yEhead[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-2Ehead[j].x && HBullet->yEhead[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].xp->x && Ehead[j].yp->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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值