找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2226|回复: 0
打印 上一主题 下一主题
收起左侧

用嵌入式ok6410实现坦克大战源代码

[复制链接]
跳转到指定楼层
楼主
这是我上学期的课程设计,用嵌入式开发板ok6410实现的坦克大战,花费了一周的时间完成,有兴趣的朋友可以看看。

所有资料51hei提供下载:
tank.tar.gz (4.92 MB, 下载次数: 7)

ok6410源程序如下:
  1. #include "pub.h"
  2. #include "tank.h"
  3. #include <QtGui>
  4. //#include <QKeyEvent>
  5. #include "missile.h"
  6. #include "tankclient.h"
  7. #include "explode.h"
  8. #include "wall.h"
  9. #include <QKeyEvent>

  10. QList<QImage> Tank::tankImgs;
  11. Tank::Tank(int x,int y,int w,int h,TankClient* tc,bool good,int liveValue)
  12. {
  13.   this->x=x;
  14.   this->y=y;
  15.   this->w=w;
  16.   this->h=h;
  17.   BU=BD=BL=BR=false;
  18.   this->tc=tc;
  19.   dir=STOP;
  20.   ptDir=U;
  21.   this->good=good;
  22.   live=true;
  23.   step=0;
  24.   xtemp=ytemp=0;
  25.   count=8;
  26.   this->liveValue=liveValue;
  27. }

  28. void Tank::drawTank(QPainter &p)
  29. {
  30.     if(!live)
  31.     {
  32.         tc->etanks.removeOne(this);
  33.         return ;
  34.     }
  35.     if(dir!=STOP)
  36.         ptDir=dir;
  37.     switch(ptDir)
  38.     {
  39.         case U: p.drawImage(x,y,tankImgs[0]);break;
  40.         case D: p.drawImage(x,y,tankImgs[1]);break;
  41.         case L: p.drawImage(x,y,tankImgs[2]);break;
  42.         case R: p.drawImage(x,y,tankImgs[3]);break;

  43.         case LU: p.drawImage(x,y,tankImgs[4]);break;
  44.         case LD: p.drawImage(x,y,tankImgs[5]);break;
  45.         case RU: p.drawImage(x,y,tankImgs[6]);break;
  46.         case RD: p.drawImage(x,y,tankImgs[7]);break;
  47.         default:break;
  48.     }
  49.     p.setPen(Qt::yellow);
  50.     p.setBrush(Qt::black);
  51.     p.drawRect(x,y,25,5);

  52.     p.setBrush(Qt::red);
  53.     p.drawRect(x,y,liveValue/4,5);//画坦克生命值

  54.     moveTank();
  55. }


  56. void Tank::keyPress(int key)
  57. {
  58.     switch(key)
  59.     {
  60.         case Qt::Key_Up: BU=true;break;
  61.         case Qt::Key_Down: BD=true;break;
  62.         case Qt::Key_Left: BL=true;break;
  63.         case Qt::Key_Right: BR=true;break;
  64.         case Qt::Key_Return: fire();break;
  65.         case Qt::Key_K:
  66.             {
  67.                 if(count>0)superfire();
  68.                 count--;
  69.                 if(count<=0)count=0;
  70.                 break;
  71.             }
  72.         case Qt::Key_F2:
  73.             {
  74.                 tc->step=0;
  75.                 tc->start=!tc->start;
  76.                 if(!(tc->start))//暂停/继续
  77.                 {
  78.                     tc->button[1]->setText(QObject::tr("continue"));
  79.                 }
  80.                 break;

  81.             }
  82.         case Qt::Key_F1:
  83.             {
  84.                 //重启游戏
  85.                 while(tc->missile.size())
  86.                     tc->missile.removeOne(tc->missile[0]);
  87.                 while(tc->etanks.size())
  88.                     tc->etanks.removeOne(tc->etanks[0]);
  89.                 while(tc->myWall.size())
  90.                     tc->myWall.removeOne(tc->myWall[0]);
  91.                 tc->AllObject();
  92.                 tc->start=true;
  93.                 tc->gameover=false;
  94.                 break;
  95.             }
  96.         case Qt::Key_Escape:exit(0);break;//退出游戏
  97.         default:break;
  98.     }
  99.     if(BU&&!BD&&!BL&&!BR)dir=U;
  100.     else if(!BU&&BD&&!BL&&!BR)dir=D;
  101.     else if(!BU&&!BD&&BL&&!BR)dir=L;
  102.     else if(!BU&&!BD&&!BL&&BR)dir=R;

  103.     else if(BU&&!BD&&BL&&!BR)dir=LU;
  104.     else if(!BU&&BD&&BL&&!BR)dir=LD;
  105.     else if(BU&&!BD&&!BL&&BR)dir=RU;
  106.     else if(!BU&&BD&&!BL&&BR)dir=RD;
  107.     else dir=STOP;
  108. }


  109. void Tank::keyRelease(int key)
  110. {
  111.     switch(key)
  112.     {
  113.         case Qt::Key_Up: BU=false;break;
  114.         case Qt::Key_Down: BD=false;break;
  115.         case Qt::Key_Left: BL=false;break;
  116.         case Qt::Key_Right: BR=false;break;
  117.         default:break;
  118.     }
  119.     if(BU&&!BD&&!BL&&!BR)dir=U;
  120.     else if(!BU&&BD&&!BL&&!BR)dir=D;
  121.     else if(!BU&&!BD&&BL&&!BR)dir=L;
  122.     else if(!BU&&!BD&&!BL&&BR)dir=R;

  123.     else if(BU&&!BD&&BL&&!BR)dir=LU;
  124.     else if(!BU&&BD&&BL&&!BR)dir=LD;
  125.     else if(BU&&!BD&&!BL&&BR)dir=RU;
  126.     else if(!BU&&BD&&!BL&&BR)dir=RD;
  127.     else dir=STOP;
  128. }
  129. void Tank::moveTank()
  130. {
  131.     xtemp=x;
  132.     ytemp=y;
  133.     switch(dir)
  134.     {
  135.         case U: y-=5;break;
  136.         case D: y+=5;break;
  137.         case L: x-=5;break;
  138.         case R: x+=5;break;

  139.         case LU: x-=5;y-=5;break;
  140.         case LD: x-=5;y+=5;break;
  141.         case RU: x+=5;y-=5;break;
  142.         case RD: x+=5;y+=5;break;
  143.         default:break;
  144.     }
  145.     if(x<=0)x=0;
  146.     if(y<=0)y=0;
  147.     if(x>=TankClient::GAME_WIDTH-w)x=TankClient::GAME_WIDTH-w;
  148.     if(y>=TankClient::GAME_HEIGHT-h)y=TankClient::GAME_HEIGHT-h;
  149.     if(!good)
  150.     {
  151.         if(qrand()%20>18)fire();
  152.         if(step==0)
  153.         {
  154.             dir=Dir(qrand()%9);
  155.             step=qrand()%15+10;
  156.         }
  157.        step--;
  158.     }
  159. }

  160. void Tank::fire()
  161. {
  162.     int mw=10;
  163.     int mh=10;
  164.     int mx=x+w/2-mw/2;
  165.     int my=y+h/2-mh/2;
  166.     Missile* m=new Missile(mx,my,mw,mh,ptDir,tc,good);
  167.     tc->missile.push_back(m);
  168. }
  169. void  Tank::fire(Dir tdir)
  170. {
  171.     int mw=10;
  172.     int mh=10;
  173.     int mx=x+w/2-mw/2;
  174.     int my=y+h/2-mh/2;
  175.     Missile* m=new Missile(mx,my,mw,mh,tdir,tc,good);
  176.     tc->missile.push_back(m);
  177. }
  178. void  Tank::superfire()//朝八个方向开火
  179. {
  180.     for(int i=0;i<8;i++)
  181.         fire(Dir(i));
  182. }

  183. bool Tank::TankHitWall(Wall* w) //检测坦克和墙壁是否碰撞
  184. {

  185.     if(live&&getRect().intersects(w->getRect()))
  186.     {
  187.         x=xtemp;//回到上一次的位置
  188.         y=ytemp;
  189.         return true;
  190.     }
  191.     return false;
  192. }
  193. void Tank::TankHitWalls(QList<Wall*> ws)
  194. {
  195.     for(int i=0;i<ws.size();i++)
  196.     {
  197.         if(TankHitWall(ws[i]))
  198.             return;
  199.     }
  200. }

  201. void Tank::init()
  202. {
  203.     tankImgs.push_back(QImage(":/images/etU.gif"));
  204.     tankImgs.push_back(QImage(":/images/etD.gif"));
  205.     tankImgs.push_back(QImage(":/images/etL.gif"));
  206.     tankImgs.push_back(QImage(":/images/etR.gif"));
  207.     tankImgs.push_back(QImage(":/images/etLU.gif"));
  208.     tankImgs.push_back(QImage(":/images/etLD.gif"));
  209.     tankImgs.push_back(QImage(":/images/etRU.gif"));
  210.     tankImgs.push_back(QImage(":/images/etRD.gif"));

  211. ……………………

  212. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表