C程序 简单潜艇大战.docx
《C程序 简单潜艇大战.docx》由会员分享,可在线阅读,更多相关《C程序 简单潜艇大战.docx(13页珍藏版)》请在冰豆网上搜索。
![C程序 简单潜艇大战.docx](https://file1.bdocx.com/fileroot1/2023-1/10/ad2ec500-4095-4204-ac49-bef5889d44dd/ad2ec500-4095-4204-ac49-bef5889d44dd1.gif)
C程序简单潜艇大战
计算机技术基础课程设计
C语言
设计报告
题目:
简单潜艇大战
学院:
化学工程学院
专业:
制药工程
班级:
050607班
******
指导老师:
***
设计时间:
2006年1月2日
题目:
简单潜艇大战
一、选题背景:
随着人们生活水平的提高,人们对精神生活的要求也随之提高了,当然,娱乐也成了人们生活中必不可少的一部分,为此,我用C语言编辑了一个简单的简单潜艇大战游戏程序。
它操作起来简单方便,运行速度快。
二、设计思想:
简单潜艇大战就是玩家和电脑对战的游戏,玩家在确保本身不被敌人击中的情况下击中敌人则得分,若被敌人击中游戏结束。
此程序利用了if,for,while等多种语句进行了编译,而且多次使用了for语句进行了循环,用if语句进行操作,if语句是用来处理条件选择的一种语句。
此游戏可以任意移动玩家的位置。
三、程序流程图
(敌人在攻击范围之内)(玩家在攻击范围之内)
四、程序清单
#include
#include
#include
#include
#defineKEY_ESC0x01
#defineKEY_SPACE0x39
#defineKEY_LEFT0x4b
#defineKEY_RIGHT0x4d
intspeed=10000;
charkey_state[128],key_pressed[128];/*键盘操作用的变量*/
intscore=0;/*得分*/
charscorestr[10];/*输出分数的变量*/
structFire/*子弹的结构体*/
{
intx;
inty;
intstart;/*是否发射炮弹*/
}amyfire[6];/*屏幕上最多有5个敌人可以发子弹*/
structPlay/*玩家的结构体*/
{
intx;
inty;
structFirefire[6];
life;
}play;
structAmy/*敌人的结构体*/
{
intx;
inty;
intspeed;/*敌人的速度*/
intcolor;
intdirection;
life;
}amy[6];
voidInitGraph(void);/*图形初始化*/
voidCloseGraph(void);/*图形结束*/
voidGamePlay(void);/*具体玩游戏*/
voidDrawPlay(void);/*画玩家*/
voidDrawAmy(inti);/*画敌人*/
voidDrawFire(intx,inty,intn);/*画子弹,0去除,1显示*/
voidDrawAmyFire(intx,inty,intn);/*画子弹,0去除,1显示*/
voidDrawBlack(intx,inty,intcolor);/*去除原来地方的物体*/
voidPrScore();/*输出得分*/
intGetKey(intScanCode);/*这里开始都是按键函数*/
voidinterruptfar(*OldInt9Handler)();
voidfarinterruptNewInt9();
voidInstallKeyboard();
voidShutDownKeyboard();
voidmain(void)
{
InitGraph();/*图形初始化*/
GamePlay();/*具体玩游戏*/
CloseGraph();/*图形结束*/
}
voidInitGraph(void)/*图形初始化*/
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
cleardevice();
InstallKeyboard();
}
voidDrawPlay(void)/*画玩家*/
{
setfillstyle(SOLID_FILL,6);
bar(play.x-20,play.y-10,play.x+20,play.y);
setfillstyle(SOLID_FILL,4);
bar(play.x-20,play.y-10,play.x-10,play.y);
}
voidDrawAmy(inti)/*画敌人*/
{
setfillstyle(SOLID_FILL,amy[i].color);
bar(amy[i].x-20,amy[i].y-10,amy[i].x+20,amy[i].y);
setfillstyle(SOLID_FILL,GREEN);
if(amy[i].direction==1)
bar(amy[i].x-20,amy[i].y-10,amy[i].x-10,amy[i].y);
else
bar(amy[i].x+10,amy[i].y-10,amy[i].x+20,amy[i].y);
}
voidDrawBlack(intx,inty,intcolor)/*去除原来地方的物体*/
{
setfillstyle(SOLID_FILL,color);
bar(x-20,y-10,x+20,y);
}
voidDrawFire(intx,inty,intn)/*画子弹,0去除,1显示*/
{
if(n==0)
setfillstyle(SOLID_FILL,BLUE);
else
setfillstyle(SOLID_FILL,0);
setcolor(BLUE);
fillellipse(x,y,5,5);
}
voidDrawAmyFire(intx,inty,intn)/*画子弹,0去除,1显示*/
{
if(n==0)
setfillstyle(SOLID_FILL,BLUE);
else
setfillstyle(SOLID_FILL,YELLOW);/*敌人的炮弹是黄的*/
setcolor(BLUE);
fillellipse(x,y,3,3);
}
voidPrScore()/*输出得分*/
{
setfillstyle(SOLID_FILL,8);/*把原来分数去除*/
bar(30,0,200,40);
setcolor(11);/*输出新得分*/
settextstyle(0,0,2);
sprintf(scorestr,"%d",score);
outtextxy(30,20,scorestr);
}
voidGamePlay(void)/*具体玩游戏*/
{
inti,j;
setfillstyle(SOLID_FILL,BLUE);
bar(0,100,640,480);
setfillstyle(SOLID_FILL,8);
bar(0,0,640,99);
play.x=200;play.y=99;/*玩家初始位置*/
for(i=0;i<6;i++)
{
play.fire[i].start=0;/*一开始的子弹都为没发射状态*/
amyfire[i].start=0;
amy[i].life=0;
}
play.life=1;
DrawPlay();/*玩家初始位置*/
PrScore();/*输出得分*/
randomize();
while
(1)
{
for(i=0;i<6;i++)/*查找玩家是否有发射的子弹*/
{
if(play.fire[i].start==1)/*发射的子弹*/
{
DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原来子弹位置*/
play.fire[i].y+=3;
DrawFire(play.fire[i].x,play.fire[i].y,1);/*显示新位置*/
for(j=0;j<6;j++)/*判断子弹是否击中敌人*/ if(play.fire[i].x>(amy[j].x-22)&&play.fire[i].x<(amy[j].x+22)&&play.fire[i].y>(amy[j].y-14)&&play.fire[i].y {
play.fire[i].start=0;/*子弹消失*/
amy[j].life=0;/*敌人生命结束*/
score+=10;/*得分增加*/
DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原来子弹位置*/
DrawBlack(amy[j].x,amy[j].y,BLUE);/*去除敌人*/
PrScore();
}
if(play.fire[i].y>480)/*子弹超出屏幕就等于消失*/
{
play.fire[i].start=0;
DrawFire(play.fire[i].x,play.fire[i].y,0);
}
}
}
for(i=0;i<6;i++)/*敌人炮弹的产生*/
{
if(amy[i].life==1&&amy[i].color<14&&amyfire[i].start==0)/*敌人发射炮弹的条件*/
{
amyfire[i].start=1;
amyfire[i].x=amy[i].x;
amyfire[i].y=amy[i].y-10;
}
}
for(i=0;i<6;i++)/*敌人炮弹移动以及移动*/
{
if(amyfire[i].start==1)/*子弹存在*/
{
DrawAmyFire(amyfire[i].x,amyfire[i].y,0);
amyfire[i].y-=2;
DrawAmyFire(amyfire[i].x,amyfire[i].y,1);/*画敌人炮弹新位置*/
}
if(amyfire[i].x>(play.x-14)&&amyfire[i].x<(play.x+14)&&(amyfire[i].y+3)<100)/*击中玩家*/
{
play.life=0;
amyfire[i].start=0;
DrawAmyFire(amyfire[i].x,amyfire[i].y,0);
DrawBlack(play.x,play.y,8);/*去除玩家*/
break;
}
if(amyfire[i].y<96)/*敌人炮弹超出海洋就消失*/
{
amyfire[i].start=0;
setfillstyle(SOLID_FILL,8);
setcolor(8);
fillellipse(amyfire[i].x,amyfire[i].y,3,3);
}
}
delay(speed);/*间隔时间可以自己定*/
if(play.life!
=1)/*玩家被击中*/
break;
for(i=0;i<6;i++)
{
if(amy[i].life==0)/*出现一个敌人后就跳出循环*/
{
amy[i].life=1;
amy[i].color=rand()%4+10;/*敌人的颜色*/
amy[i].y=rand()%300+130;/*高度随机*/
amy[i].speed=2+rand()%10;/*敌人的移动速度随机*/
amy[i].direction=rand()%2;/*敌人的移动方向,0左边,1右边出来*/
if(amy[i].direction==0)
amy[i].x=-20;
else
amy[i].x=660;
break;
}
}
if(GetKey(KEY_ESC))/*退出键*/
break;
if(GetKey(KEY_SPACE))/*发射*/
{
for(i=0;i<6;i++)
if(play.fire[i].start==0)/*发射一颗子弹后跳出循环*/
{
play.fire[i].x=play.x;
play.fire[i].y=105;
play.fire[i].start=1;
break;
}
}
if(GetKey(KEY_RIGHT)&&play.x<620)/*右键盘的控制*/
{
DrawBlack(play.x,play.y,8);
play.x+=10;
DrawPlay();
}
if(GetKey(KEY_LEFT)&&play.x>20)/*左键的控制*/
{
DrawBlack(play.x,play.y,8);
play.x-=10;
DrawPlay();
}
for(i=0;i<6;i++)/*显示敌人*/
{
if(amy[i].life==1)/*如果敌人存在*/
{
DrawBlack(amy[i].x,amy[i].y,BLUE);/*原来位置输出海洋颜色*/
if(amy[i].direction==0)
amy[i].x+=amy[i].speed;/*敌人横坐标的变化*/
else
amy[i].x-=amy[i].speed;
DrawAmy(i);/*画敌人*/
if(amy[i].x>660||amy[i].x<-20)/*敌人超出屏幕范围就消失*/
amy[i].life=0;
}
}
}
if(play.life==0)/*被击中失败的话*/
{
setcolor(6);
settextstyle(0,0,3);
outtextxy(250,40,"GAMEOVER");
}
while
(1)
{
if(GetKey(KEY_ESC))/*结束游戏按ESC*/
break;
}
}
voidCloseGraph(void)/*图形结束*/
{
ShutDownKeyboard();
closegraph();
}
voidfarinterruptNewInt9(void)
{
unsignedcharScanCode,temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp|0x80);
outportb(0x61,temp&0x7f);
if(ScanCode&0x80)
{
ScanCode&=0x7f;
key_state[ScanCode]=0;
}
else
{
key_state[ScanCode]=1;
key_pressed[ScanCode]=1;
}
outportb(0x20,0x20);
}
voidInstallKeyboard(void)
{
inti;
for(i=0;i<128;i++)
key_state[i]=key_pressed[i]=0;
OldInt9Handler=getvect(9); /*中断向量值*/
setvect(9,NewInt9); /*中断程序NewInt9地址存入指定的中断向量表中INT09H*/
}
voidShutDownKeyboard(void)
{
setvect(9,OldInt9Handler);
}
intGetKey(intScanCode)
{
intres;
res=key_state[ScanCode]|key_pressed[ScanCode];
key_pressed[ScanCode]=0;
returnres;
}
五、主要解决问题的方法及技术关键
1、主要问题及解决方法
(1)用if语句用来处理条件选择
(2)用while,for语句进行多次循环
2、技术关键
(1)循环的嵌套
(2)条件的判断
六、设计结果说明
1、设计优点:
程序运用多种语句的循环嵌套,条件判断巧妙的设计了这个简单的游戏程序,便于理解。
2、设计缺点:
对于习惯了鼠标图形化的操作的人来说,使用键盘操作有些麻烦。