收藏 分销(赏)

计算机技术基础c语言课程设计潜艇大战.doc

上传人:人****来 文档编号:9858498 上传时间:2025-04-11 格式:DOC 页数:19 大小:42.50KB
下载 相关 举报
计算机技术基础c语言课程设计潜艇大战.doc_第1页
第1页 / 共19页
计算机技术基础c语言课程设计潜艇大战.doc_第2页
第2页 / 共19页
点击查看更多>>
资源描述
计算机技术基础c语言课程设计潜艇大战 19 2020年4月19日 文档仅供参考,不当之处,请联系改正。 计算机技术基础课程设计 C语言 设计报告 题目:简单潜艇大战 一、 选题背景: 随着人们生活水平的提高,人们对精神生活的要求也随之提高了,当然,娱乐也成了人们生活中必不可少的一部分,为此,我用C语言编辑了一个简单的简单潜艇大战游戏程序。它操作起来简单方便,运行速度快。 二、设计思想: 简单潜艇大战就是玩家和电脑对战的游戏,玩家在确保本身不被敌人击中的情况下击中敌人则得分,若被敌人击中游戏结束。此程序利用了if,for,while等多种语句进行了编译,而且多次使用了for语句进行了循环,用if语句进行操作,if语句是用来处理条件选择的一种语句。此游戏能够任意移动玩家的位置。 三、程序流程图 结束 若电脑中弹则玩家得分游戏继续,若玩家中弹则游戏结束 图形初始化 开始 玩家 敌人 判断是否攻击敌人 判断是否攻击玩家 否 否 (敌人在攻击范围之内) (玩家在攻击范围之内) 四、程序清单 #include <graphics.h> #include <stdlib.h> #include <dos.h> #include <graphics.h> #define KEY_ESC 0x01 #define KEY_SPACE 0x39 #define KEY_LEFT 0x4b #define KEY_RIGHT 0x4d int speed=10000; char key_state[128],key_pressed[128];/*键盘操作用的变量*/ int score=0;/*得分*/ char scorestr[10];/*输出分数的变量*/ struct Fire/*子弹的结构体*/ {  int x;  int y;  int start;/*是否发射炮弹*/ }amyfire[6];/*屏幕上最多有5个敌人能够发子弹*/ struct Play/*玩家的结构体*/ {  int x;  int y;  struct Fire fire[6];  life; }play; struct Amy/*敌人的结构体*/ {  int x;  int y;  int speed;/*敌人的速度*/  int color;  int direction;  life; }amy[6]; void InitGraph(void);/*图形初始化*/ void CloseGraph(void);/*图形结束*/ void GamePlay(void);/*具体玩游戏*/ void DrawPlay(void);/*画玩家*/ void DrawAmy(int i);/*画敌人*/ void DrawFire(int x,int y,int n);/*画子弹,0去除,1显示*/ void DrawAmyFire(int x,int y,int n);/*画子弹,0去除,1显示*/ void DrawBlack(int x,int y,int color);/*去除原来地方的物体*/ void PrScore();/*输出得分*/ int GetKey(int ScanCode);/*这里开始都是按键函数*/ void interrupt far (*OldInt9Handler)(); void far interrupt NewInt9(); void InstallKeyboard(); void ShutDownKeyboard(); void main(void) {  InitGraph();/*图形初始化*/  GamePlay();/*具体玩游戏*/  CloseGraph();/*图形结束*/ } void InitGraph(void)/*图形初始化*/ {  int gd=DETECT,gm;  initgraph(&gd,&gm,"c:\\tc");  cleardevice();  InstallKeyboard(); } void DrawPlay(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); } void DrawAmy(int i)/*画敌人*/ {  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); } void DrawBlack(int x,int y,int color)/*去除原来地方的物体*/ {  setfillstyle(SOLID_FILL,color);  bar(x-20,y-10,x+20,y); } void DrawFire(int x,int y,int n)/*画子弹,0去除,1显示*/ {  if(n==0)  setfillstyle(SOLID_FILL,BLUE);  else  setfillstyle(SOLID_FILL,0);  setcolor(BLUE);  fillellipse(x,y,5,5); } void DrawAmyFire(int x,int y,int n)/*画子弹,0去除,1显示*/ {  if(n==0)  setfillstyle(SOLID_FILL,BLUE);  else  setfillstyle(SOLID_FILL,YELLOW);/*敌人的炮弹是黄的*/  setcolor(BLUE);  fillellipse(x,y,3,3); } void PrScore()/*输出得分*/ {  setfillstyle(SOLID_FILL,8);/*把原来分数去除*/  bar(30,0,200,40);  setcolor(11);/*输出新得分*/  settextstyle(0,0,2);  sprintf(scorestr,"%d",score);  outtextxy(30,20,scorestr); } void GamePlay(void)/*具体玩游戏*/ {  int i,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<amy[j].y+5)/*击中敌人*/       {        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,"GAME OVER");  }  while(1)  {  if(GetKey(KEY_ESC))/*结束游戏按ESC*/  break;  } } void CloseGraph(void)/*图形结束*/ {  ShutDownKeyboard();  closegraph(); } void far interrupt NewInt9(void) {  unsigned char ScanCode,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); } void InstallKeyboard(void) {  int i;  for(i=0;i<128;i++)  key_state[i]=key_pressed[i]=0;  OldInt9Handler=getvect(9);         /*中断向量值*/  setvect(9,NewInt9);                /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/ } void ShutDownKeyboard(void) {  setvect(9,OldInt9Handler); } int GetKey(int ScanCode) {  int res;  res=key_state[ScanCode]|key_pressed[ScanCode];  key_pressed[ScanCode]=0;  return res; } 五、主要解决问题的方法及技术关键 1、 主要问题及解决方法 (1) 用if语句用来处理条件选择 (2) 用while,for语句进行多次循环 2、 技术关键 (1) 循环的嵌套 (2) 条件的判断 六、设计结果说明 1、 设计优点:程序运用多种语句的循环嵌套,条件判断巧妙的设计了这个简单的游戏程序,便于理解。 2、 设计缺点:对于习惯了鼠标图形化的操作的人来说,使用键盘操作有些麻烦。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服