C程序 简单潜艇大战.docx

上传人:b****5 文档编号:6897924 上传时间:2023-01-12 格式:DOCX 页数:13 大小:41.45KB
下载 相关 举报
C程序 简单潜艇大战.docx_第1页
第1页 / 共13页
C程序 简单潜艇大战.docx_第2页
第2页 / 共13页
C程序 简单潜艇大战.docx_第3页
第3页 / 共13页
C程序 简单潜艇大战.docx_第4页
第4页 / 共13页
C程序 简单潜艇大战.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C程序 简单潜艇大战.docx

《C程序 简单潜艇大战.docx》由会员分享,可在线阅读,更多相关《C程序 简单潜艇大战.docx(13页珍藏版)》请在冰豆网上搜索。

C程序 简单潜艇大战.docx

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、设计缺点:

对于习惯了鼠标图形化的操作的人来说,使用键盘操作有些麻烦。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1