




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C语言实现飞机大战程序设计本文实例为大家分享了C语言实现飞机大战的具体代码,供大家参考,具体内容如下
作业要求:
1.游戏当中出现多类型敌人
2.游戏中能进行存档和读档
3.玩家控制的飞机由多字符组成
4.游戏过程中没有出现BUG
5.游戏显示制作者信息
6.游戏当中带有BGM
7.其他个性化设定
成效:
代码:
#includestdio.h
#includestdlib.h
#includeconio.h
#includewindows.h
#includemmsystem.h
//导入声音头文件
#pragmacomment(lib,"Winmm.lib")
//导入声音头文件库
#defineHigh20
//游戏画面尺寸
#defineWidth30
#defineEnemyNum5
//敌机个数
#defineBossNum2
//Boss机个数
intflag;
//飞机状态
intcolor(intc);
//更改文字颜色
voidexplation();
//游戏提示
voidshow();
//显示游戏界面
voidendgame();
//游戏结束
voidstartup();
//数据初始化
voidFileRead();
//读档
//全局变量
intposition_x,position_y;
//飞机位置
structenemy{
intx;
inty;
intlife;
}Boss[BossNum],enemy[EnemyNum];
//敌机位置
intcanvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格,1为飞机8,2为子弹o,3为敌机0,4为Boss敌机A
intscore;
//得分
intnumber;
//销毁敌机数
intBulletWidth;
//子弹宽度
intEnemyMoveSpeed;
//敌机移动速度
//光标移动到(x,y)位置
voidgotoxy(intx,inty)
HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);
COORDpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
//更改文字颜色
intcolor(intc)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return0;
//隐藏光标
voidHideCursor()
CONSOLE_CURSOR_INFOcursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
//开始界面
voidwelcometogame()
intn,i,j=1;
system("cls");
color(15);
gotoxy(33,1);
printf("飞机大战PlaneWar");
color(56);
for(i=3;i=26;i++)
//输出上下边框
{
for(j=6;j=80;j++)
//输出左右边框
{
gotoxy(j,i);
if(i==3||i==26)
printf("");
elseif(j==6||j==80)
printf("");
}
}
color(14);
gotoxy(38,6);
printf("基本操作\n");
gotoxy(19,8);
printf("空格:发射子弹
W:前进
A:左移
D:右移
S:后退\n");
gotoxy(34,11);
printf("1.开始游戏(play)");
gotoxy(34,13);
printf("2.游戏规则(rule)");
gotoxy(34,15);
printf("3.读取存档(read)");
gotoxy(34,17);
printf("4.退出游戏(quit)");
color(15);
gotoxy(22,24);
printf("游戏制作人:李歆灵
学号:420250320
联系方式);
color(14);
gotoxy(33,20);
printf("请选择1234:");
color(14);
scanf("%d",
//输入选项
switch(n)
{
case1:
flag=1;
system("cls");
break;
case2:
explation();
//游戏规则
break;
case3:
system("cls");//读档
break;
case4:
gotoxy(30,28);
exit(0);
//退出游戏
break;
default:
color(9);
gotoxy(33,22);
printf("请输入1-4之间的数");
_getch();
//输入任意键
system("cls");
//清屏
welcometogame();
}
//游戏规则
voidexplation()
inti,j=1;
system("cls");
color(15);
gotoxy(30,1);
printf("游戏规则Rulesofgame");
color(56);
for(i=3;i=26;i++)
//输出上下边框
{
for(j=6;j=80;j++)
//输出左右边框
{
gotoxy(j,i);
if(i==3||i==26)
printf("");
elseif(j==6||j==80)
printf("");
}
}
color(14);
gotoxy(10,6);
printf("1.W,A,S,D分别是控制飞机的移动,空格发射子弹");
gotoxy(10,9);
printf("2.O是普通敌机(需一发子弹),A是Boss敌机(需两发子弹)");
gotoxy(10,12);
printf("3.击败普通敌机可获得1分,击败Boss敌机可获得2分");
gotoxy(10,15);
printf("4.敌机进入下边界减1分");
gotoxy(10,18);
printf("5.飞机碰到敌机会坠落");
gotoxy(10,21);
printf("6.按Z存档,按P暂停游戏");
color(15);
gotoxy(25,23);
printf("/*****按任意键返回主页面*****/");
_getch();
//按任意键返回主界面
system("cls");
welcometogame();
//数据初始化
voidstartup()
mciSendString("openD:\\plane\\game.mp3aliasbkmusic",NULL,0,NULL);
//打开背景音乐
mciSendString("playbkmusic",NULL,0,NULL);//循环播放
position_x=High/2;
position_y=Width/2;
canvas[position_x][position_y]=3;
canvas[position_x+1][position_y-1]=3;
canvas[position_x+1][position_y]=3;
canvas[position_x+1][position_y+1]=3;
intk;
for(k=0;kEnemyNum;k++)
{
enemy[k].x=rand()%2;
enemy[k].y=rand()%Width;
canvas[enemy[k].x][enemy[k].y]=3;
}
for(k=0;kBossNum;k++)
{
Boss[k].x=rand()%2;
Boss[k].y=rand()%Width;
canvas[Boss[k].x][Boss[k].y]=4;
Boss[k].life=2;
}
intscore=0;
//成绩
intnumber=0;
//销毁敌机数
BulletWidth=0;
EnemyMoveSpeed=30;
HideCursor();
//光标
//存档代码
voidFileWrite()
FILE*fp;
//文件指针
fp=fopen("D:\\game.data","w");
//打开文件"w":write写入文件
inti,j;
for(i=0;iEnemyNum;i++)
{
fwrite(enemy[i],sizeof(structenemy),1,fp);
}
for(j=0;jBossNum;j++)
{
fwrite(Boss[j],sizeof(structenemy),1,fp);
}
fwrite(position_x,sizeof(int),1,fp);
fwrite(position_y,sizeof(int),1,fp);
fwrite(score,sizeof(int),1,fp);
fwrite(number,sizeof(int),1,fp);
fwrite(BulletWidth,sizeof(int),1,fp);
fwrite(EnemyMoveSpeed,sizeof(int),1,fp);
fclose(fp);
//关闭文件
printf("\n保存成功\n");
//读档代码
voidFileRead()
FILE*fp;
//文件指针
fp=fopen("D:\\game.data","r");
//打开文件"r":read读取文件
mciSendString("openD:\\plane\\game.mp3aliasbkmusic",NULL,0,NULL);
//打开背景音乐
mciSendString("playbkmusic",NULL,0,NULL);//循环播放
if(fp==NULL)
startup();
else
{
inti,j;
for(i=0;iEnemyNum;i++)
{
fread(enemy[i],sizeof(structenemy),1,fp);
}
for(j=0;jBossNum;j++)
{
fread(Boss[j],sizeof(structenemy),1,fp);
}
fread(position_x,sizeof(int),1,fp);
fread(position_y,sizeof(int),1,fp);
fread(score,sizeof(int),1,fp);
fread(number,sizeof(int),1,fp);
fread(BulletWidth,sizeof(int),1,fp);
fread(EnemyMoveSpeed,sizeof(int),1,fp);
}
fclose(fp);
//关闭文件
canvas[position_x][position_y]=1;
canvas[position_x+1][position_y-1]=1;
canvas[position_x+1][position_y]=1;
canvas[position_x+1][position_y+1]=1;
intk;
for(k=0;kEnemyNum;k++)
{
canvas[enemy[k].x][enemy[k].y]=3;
}
for(k=0;kBossNum;k++)
{
canvas[Boss[k].x][Boss[k].y]=4;
Boss[k].life=2;
}
HideCursor();
//显示画面
voidshow()
color(112);
gotoxy(0,0);//光标移动到原点位置,以下重画清屏
inti,j;
for(i=0;iHigh;i++)
{
for(j=0;jWidth;j++)
{
if((j==Width-1)||(i==High-1)||(j==0)||(i==0))
printf("#");
//打印边界#
elseif(canvas[i][j]==1)
printf("8");
//输出飞机8
elseif(canvas[i][j]==2)
printf("o");
//输出子弹o
elseif(canvas[i][j]==3)
printf("O");
//输出敌机O
elseif(canvas[i][j]==4)
printf("A");
//输出Boss敌机A
else
printf("");
}
printf("\n");
}
color(14);
printf("\n");
printf("游戏得分:%d\n",score);
printf("销毁敌机:%d\n\n",number);
Sleep(20);
//与用户输入无关的更新
voidupdateWithoutInput()
inti,j,k;
for(i=0;iHigh;i++)
{
for(j=0;jWidth;j++)
{
if(canvas[i][j]==2)
{
for(k=0;kEnemyNum;k++)
{
if((i==enemy[k].x)(j==enemy[k].y))
//子弹击中敌机
{
mciSendString("closegemusic",NULL,0,NULL);
//先把前面一次的音乐关闭
mciSendString("openD:\\plane\\gotEnemy.mp3aliasgemusic",NULL,0,NULL);
//打开音乐
mciSendString("playgemusic",NULL,0,NULL);
//仅播放一次
score++;
//分数加1
number++;
//销毁敌机数加1
if(number%6==0EnemyMoveSpeed3)
//达到一定积分后,敌机变快
EnemyMoveSpeed--;
if(number%12==0)
//达到一定积分后,子弹变厉害
BulletWidth++;
canvas[enemy[k].x][enemy[k].y]=0;
//残影问题
enemy[k].x=rand()%2;
//产生新的敌机
enemy[k].y=rand()%Width;
canvas[enemy[k].x][enemy[k].y]=3;
canvas[i][j]=0;
//子弹消失
}
}
for(k=0;kBossNum;k++)
{
if((i==Boss[k].x)(j==Boss[k].y))
//子弹击中Boss敌机
{
mciSendString("closegemusic",NULL,0,NULL);
//先把前面一次的音乐关闭
mciSendString("openD:\\plane\\gotEnemy.mp3aliasgemusic",NULL,0,NULL);
//打开音乐
mciSendString("playgemusic",NULL,0,NULL);
//仅播放一次
Boss[k].life--;
//Boss敌机生命值减1
if(Boss[k].life==0)
{
canvas[Boss[k].x][Boss[k].y]=0;
//残影问题
Boss[k].x=rand()%2;
//产生新Boss敌机
Boss[k].y=rand()%Width;
canvas[Boss[k].x][Boss[k].y]=4;
canvas[i][j]=0;
//子弹消失
Boss[k].life=2;
score++;score++;
//分数加2
number++;
//销毁敌机数加1
}
}
}
//子弹向上移动
canvas[i][j]=0;
if(i0)
canvas[i-1][j]=2;
}
}
}
staticintspeed=0;
if(speedEnemyMoveSpeed)
speed++;
for(k=0;kEnemyNum;k++)
{
//敌机撞到我机
if((position_x==enemy[k].x)(position_y==enemy[k].y)||(position_x+1==enemy[k].x)(position_y-1==enemy[k].y)||(position_x+1==enemy[k].x)(position_y+1==enemy[k].y)||(position_x+2==enemy[k].x)(position_y+1==enemy[k].y)||(position_x+2==enemy[k].x)(position_y-1==enemy[k].y))
{
mciSendString("closebkmusic",NULL,0,NULL);
//先把前面一次的音乐关闭
mciSendString("openD:\\plane\\explode.mp3aliasexmusic",NULL,0,NULL);
//打开音乐
mciSendString("playexmusic",NULL,0,NULL);
//仅播放一次
color(11);
printf("\n游戏结束!\n");
Sleep(3000);
system("pause");
exit(0);
}
//敌机跑出显示屏幕
if(enemy[k].xHigh)
{
canvas[enemy[k].x][enemy[k].y]=0;
enemy[k].x=rand()%2;//产生新的敌机
enemy[k].y=rand()%Width;
canvas[enemy[k].x][enemy[k].y]=3;
score--;//减分
}
if(speed==EnemyMoveSpeed)
{
//敌机下落
for(k=0;kEnemyNum;k++)
{
canvas[enemy[k].x][enemy[k].y]=0;
enemy[k].x++;
speed=0;
canvas[enemy[k].x][enemy[k].y]=3;
}
//Boss敌机下落
for(k=0;kBossNum;k++)
{
canvas[Boss[k].x][Boss[k].y]=0;
Boss[k].x++;
speed=0;
canvas[Boss[k].x][Boss[k].y]=4;
}
}
}
for(k=0;kBossNum;k++)
{
//Boss敌机撞到我机
if((position_x==Boss[k].x)(position_y==Boss[k].y)||(position_x+1==Boss[k].x)(position_y-1==Boss[k].y)||(position_x+1==Boss[k].x)(position_y+1==Boss[k].y)||(position_x+2==Boss[k].x)(position_y+1==Boss[k].y)||(position_x+2==Boss[k].x)(position_y-1==Boss[k].y))
{
mciSendString("closeexmusic",NULL,0,NULL);
//先把前面一次的音乐关闭
mciSendString("openD:\\plane\\explode.mp3aliasexmusic",NULL,0,NULL);
//打开音乐
mciSendString("playexmusic",NULL,0,NULL);
//仅播放一次
color(11);
printf("\n游戏结束!\n");
Sleep(3000);
system("pause");
exit(0);
}
//Boss敌机跑出显示屏幕
if(Boss[k].xHigh)
{
canvas[Boss[k].x][Boss[k].y]=0;
Boss[k].x=rand()%2;//产生新的Boss敌机
Boss[k].y=rand()%Width;
canvas[Boss[k].x][Boss[k].y]=4;
score--;//减分
}
}
//与用户输入有关的更新
voidupdateWithInput()
charinput;
if(_kbhit())//判断是否有输入
{
input=_getch();//根据用户的不同输入来移动,不必输入回车
if(input=='a'position_y1||input=='A')
{
canvas[position_x][position_y]=0;
canvas[position_x+1][position_y-1]=0;
canvas[position_x+1][position_y]=0;
canvas[position_x+1][position_y+1]=0;
position_y--;//位置左移
canvas[position_x][position_y]=1;
canvas[position_x+1][position_y-1]=1;
canvas[position_x+1][position_y]=1;
canvas[position_x+1][position_y+1]=1;
}
elseif(input=='d'position_yWidth-2||input=='D')
{
canvas[position_x][position_y]=0;
canvas[position_x+1][position_y-1]=0;
canvas[position_x+1][position_y]=0;
canvas[position_x+1][position_y+1]=0;
position_y++;//位置右移
canvas[position_x][position_y]=1;
canvas[position_x+1][position_y-1]=1;
canvas[position_x+1][position_y]=1;
canvas[position_x+1][position_y+1]=1;
}
elseif(input=='w'position_x1||input=='W')
{
canvas[position_x][position_y]=0;
canvas[position_x+1][position_y-1]=0;
canvas[position_x+1][position_y]=0;
canvas[position_x+1][position_y+1]=0;
position_x--;//位置上移
canvas[position_x][position_y]=1;
canvas[position_x+1][position_y-1]=1;
canvas[position_x+1][position_y]=1;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络直播活动灯光租赁及现场监督协议
- 家政公司老年看护与生活照料服务合同
- 母婴护理品牌授权合作协议
- 跨境电商数据存储备份及安全防护协议
- 抖音网络直播股权分置及管理协议
- 花园相邻权界定与土地交易合同
- 蔬菜大棚种植项目与农业保险合作协议
- 智能家居设备进出口代理服务与智能家居解决方案合同
- 临床输血医学检验技术
- 《小猫咪和小兔子:动物友谊教学课件》
- 2023年心理健康知识竞赛题库100题(含答案)
- 2024年国家电投集团海南分公司招聘笔试参考题库含答案解析
- 【中医课件】经络学说
- 押运员管理考核规定模版
- 2023年雅安市汉源县社区工作者招聘考试真题
- 量子计算技术的发展前景
- 人文关怀护理课件胃镜室
- 新能源电站应用系统基础知识培训
- 骨质疏松症的护理课件
- 钢网中空内模板轻质隔墙施工工法
- 朊毒体、不明原因感染手术手术间处理流程
评论
0/150
提交评论