1.坦克相关信息

这里的各种类型,使用struct而不是enum,避免后面强制转换。

    //子弹信息public struct t_bulletinfo{public int idx;//链表中的顺序号public int dir;//当前方向public t_bulletinfo(int i, int d){this.idx = i;this.dir = d;}}//坦克类型public struct t_type{public const int PLAYER = 0;    //玩家车public const int COMMOM = 1;    //普通车public const int FAST = 2;      //快车public const int SLOW = 3;      //慢车public const int ARMORED = 4;   //装甲车}//坦克行动方向public struct t_dir{public const int DIR_UP = 0;public const int DIR_DOWN = 1;public const int DIR_LEFT = 2;public const int DIR_RIGHT = 3;public const int DIR_STAY = 4;//不动}//公共参数public struct t_commpar{public const int TANKALIVECNTMAX = 3;  //爆炸时间public const int TANKNUMMAX = 20;      //坦克最大数目public const int BULLETNUMMAX = 20;    //单量坦克的最大子弹显示子弹数public const int PIXMIN = 2;  //最小行动距离public const int TANKSIZEX = 64;//坦克长度public const int TANKSIZEY = 64;//坦克宽度public const int BULLETSIZEX = 32;//子弹长度public const int BULLETSIZEY = 32;//子弹宽度public static int MAPSIZEX = 896; //默认地图大小public static int MAPSIZEY = 896; //默认地图大小public static Point playerStartLocation ;//玩家坦克的开始位置}

2.坦克类

设计框架是,很纠结一点:碰撞检测函数,应该写在主程序类,还是写在坦克类,作为坦克的成员函数?后来“方便”打败其他一切,毕竟生成一个坦克实例,也就生成对应成员函数,然后直接加到委托里面,一次调用,太省事了,避免主程序一个个轮询。

车体:4个方向使用不同 的检测函数

        /// <summary>/// 检测是否顺通[分别4个方向]/// </summary>/// <returns>false:阻碍;true:顺通</returns>bool carDetectUP(){this.tankSpeed = this.tankSpeedbk;//恢复速度//检测与别的车是否碰撞foreach (var i in map.tkinfos){if (i.uid != uuid){if (location.Y <= (i.Y + t_commpar.TANKSIZEY) && location.Y >= i.Y && location.X + t_commpar.TANKSIZEX > i.X && location.X < i.X + t_commpar.TANKSIZEX){return false;}}}//检测与地图元素是否碰撞int x1 = location.X + (t_commpar.PIXMIN * tankSpeed) / 2 + c_map.OFFET;int y1 = location.Y - (t_commpar.PIXMIN * tankSpeed) / 2 + c_map.OFFET;int x2 = location.X + t_commpar.TANKSIZEX - (t_commpar.PIXMIN * tankSpeed) / 2 + c_map.OFFET;int y2 = location.Y - (t_commpar.PIXMIN * tankSpeed) / 2 + c_map.OFFET;if (x1 < 0 + c_map.OFFET || x1 >= t_commpar.MAPSIZEX + c_map.OFFET || x2 < 0 + c_map.OFFET || x2 >= t_commpar.MAPSIZEX + c_map.OFFET || y1 < 0 + c_map.OFFET || y1 >= t_commpar.MAPSIZEY + c_map.OFFET || y2 < 0 + c_map.OFFET || y2 >= t_commpar.MAPSIZEY + c_map.OFFET){return false;}else{byte t1 = map.mask[x1, y1];byte t2 = map.mask[x2, y2];//根据地图元素处理return docarForMap(t1, t2);}}

子弹:4个方向使用不同 的检测函数

        /// <summary>/// 子弹检测/// </summary>/// <param name="pt">子弹位置</param>/// <param name="xrt">需要消灭的位置</param>/// <param name="fill">消灭方式(弃用)</param>/// <returns>本子弹是否需要销毁</returns>bool bulletDetectUP(Point pt, ref Rectangle xrt, ref byte fill){this.bulletSpeed = this.bulletSpeedbk;//恢复子弹速度//检测是否击中坦克车子foreach (var i in map.tkinfos){if (i.uid != uuid)if (new Rectangle(pt, new Size(t_commpar.BULLETSIZEX, t_commpar.BULLETSIZEY)).IntersectsWith(new Rectangle(i.X, i.Y, t_commpar.TANKSIZEX, t_commpar.TANKSIZEY))){bingo = i.uid;   //记录击中的目标return false;}}//检测地图元素{int x1 = pt.X + c_map.OFFET;int y1 = pt.Y + c_map.OFFET;int x2 = pt.X + t_commpar.BULLETSIZEX + c_map.OFFET;int y2 = pt.Y + c_map.OFFET;if (x1 < 0 + c_map.OFFET || x1 >= t_commpar.MAPSIZEX + c_map.OFFET || x2 < 0 + c_map.OFFET || x2 >= t_commpar.MAPSIZEX + c_map.OFFET || y1 < 0 + c_map.OFFET || y1 >= t_commpar.MAPSIZEY + c_map.OFFET || y2 < 0 + c_map.OFFET || y2 >= t_commpar.MAPSIZEY + c_map.OFFET){return false;}//获取地图元素号byte t1 = map.mask[x1, y1];byte t2 = map.mask[x2, y2];if (t1 == 0 && t2 == 0) return true;//获取地图元素生命值int hp1 = map.mapHps[pt.X / t_commpar.TANKSIZEX, pt.Y / t_commpar.TANKSIZEY];int hp2 = map.mapHps[(pt.X + t_commpar.BULLETSIZEX) / t_commpar.TANKSIZEX, pt.Y / t_commpar.TANKSIZEY];//获取地图元素类型tlandformType lft1 = map.tlandforms[t1];tlandformType lft2 = map.tlandforms[t2];//处理不同地图元素if (lft1.bulletpass && lft2.bulletpass){this.bulletSpeed = this.bulletSpeedbk + (int)(this.bulletSpeedbk * (lft1.bulletspeed + lft2.bulletspeed) / 200.0);if (this.bulletSpeed < 4) this.bulletSpeed = 4;}else{if (!lft1.bulletpass && lft1.hp > 0){if (hp1 > 1) { map.mapHps[pt.X / t_commpar.TANKSIZEX, pt.Y / t_commpar.TANKSIZEY]--; }else{xrt = new Rectangle(pt.X - pt.X % t_commpar.TANKSIZEX, pt.Y - pt.Y % t_commpar.TANKSIZEY, t_commpar.TANKSIZEX, t_commpar.TANKSIZEY);clearmask(xrt);fill = 1;}}elseif (!lft2.bulletpass && lft2.hp > 0){if (hp2 > 1) { map.mapHps[(pt.X + t_commpar.BULLETSIZEX) / t_commpar.TANKSIZEX, pt.Y / t_commpar.TANKSIZEY]--; }else{xrt = new Rectangle(pt.X - pt.X % t_commpar.TANKSIZEX + t_commpar.TANKSIZEX, pt.Y - pt.Y % t_commpar.TANKSIZEY, t_commpar.TANKSIZEX, t_commpar.TANKSIZEY);clearmask(xrt);  //fill = 1;}}return false;}}return true;}

代码太长,需要的朋友可以下载。

4.效果

C#游戏《坦克大战》--坦克相关推荐

  1. c语言编程简单小游戏坦克大战,坦克大战1990(c语言文件版)游戏

    坦克大战1990(c语言文件版)是一款很炫的坦克战争类游戏.游戏设计感很强.敌人千变万化,但是你可别被迷惑哦,将他们通通歼灭吧! 作者的话 经过四五天的奋斗,第一次编的游戏终于完成了,好激动. 首先得 ...

  2. 网页版坦克大战坦克换方向原理

    首先我们需要一个包含坦克四个方向的图片,是一个图片不是四个图片.然后图片的高宽细节也可以知道,将此图片设置为div的背景图,同时根据你图片的方去选择设置background-y或者background ...

  3. C语言编写的坦克大战exe小游戏

    C语言编写的坦克大战exe小游戏! (含有部分C++函数,不过不需要知道实现细节,主要用于键盘读取等) 适合初学者学习的坦克大战代码,无图片,游戏全部功能画面显示全部由 printf 打印的哦! C+ ...

  4. Java课程设计——坦克大战

    坦克大战--坦克类 一. 团队课程设计博客链接 https://www.cnblogs.com/chenhuilin/p/10275664.html 二.个人负责模块和任务说明 模块:坦克类(玩家坦克 ...

  5. 坦克大战-C语言-详注版

    代码地址如下: http://www.demodashi.com/demo/14259.html 坦克大战-C语言-详注版 概述 本文详述了C语言版坦克大战游戏的原理以及实现方法,对游戏代码进行了详细 ...

  6. 坦克大战java_Java课程设计——坦克大战

    坦克大战--坦克类 一. 团队课程设计博客链接 二.个人负责模块和任务说明 模块:坦克类(玩家坦克类+电脑坦克类),代码整合 三.代码的提交记录截图 四.负责模块和任务详细说明 玩家坦克继承Visib ...

  7. JavaScript面向对象实现-坦克大战(附前端全套学习路线)

    [课程简介] 使用javascript+面向对象实现一个坦克大战游戏,让更多的同学能更加深入地理解面向对象思想. [主讲内容] 1. 讲解什么是面向对象,javascript中如何实现面向对象 2. ...

  8. HTML5经典坦克大战及源码

    目录 一.简单介绍 二.具体界面 主界面 排行榜界面 组员信息界面 组员信息场景 三.部分代码 3.1 界面绘制的实现 6.2 坦克移动实现 3.3 发射炮弹 3.4声音处理 3.5计分 四.总结 一 ...

  9. C++实现坦克大战(新手思路)

    C++实现坦克大战(新手思路) 第一次写,写的不好,还请多多包涵,本人也是第一次学习C++,因为在15派学习原因才接触到这个,本文仅仅提供我个人的一个思路. 效果图 项目实现的功能 实现的功能: 坦克 ...

  10. 【寻找头号玩家】畅玩坦克大战,赢街头神机荣耀10!

    此时也许你正走在路上,啃着加了一个蛋的煎饼,急匆匆的前往办公楼: 小时候的梦想总不会是有朝一日在煎饼中加满鸡蛋吧? 我们又有多长时间没有联系过曾经的伙伴?你现在是否还在怀念那个没有电脑的时光? 几个小 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记7 图像变换(五 )直方图均衡化
  2. 在CentOS 6.9 x86_64的nginx 1.12.2上开启ngx_http_geo_module模块实录
  3. java shell排序算法_【算法】8种排序算法(Java)
  4. QT关于全局变量的申请以及使用,所有class可用同一个变量
  5. selenium自动化测试_使用Selenium自动化测试处理多个浏览器选项卡
  6. bat批处理for /f命令
  7. 跨平台开发与原生开发优劣比较
  8. 怎样解决python dataframe loc,iloc循环处理速度很慢的问题
  9. psp用ps1模拟器_PSP模拟运行PS游戏下载-PS模拟器(popsloader v4g)下载v6.61 官方版-西西软件下载...
  10. Linux下载HTTP文件
  11. JSP环境的搭建及程序初步
  12. 计算机自带输入法在哪里设置方法,电脑上输入法怎么设置默认输入法(教你设置步骤)...
  13. 【哈工大SCIR笔记】机器阅读理解简述
  14. 建立备份域控服务器,备份域控制器
  15. 小程序实战—答题类小程序
  16. android 短信消失,警告!安卓用户慎重使用谷歌Messages,短信会无端丢失
  17. 【pytorch】错误:No module named ‘typing_extensions‘ 问题解决
  18. 基于eclipse的android项目实战—博学谷(新功能五)更换头像
  19. linux shell获取当前执行路径
  20. Excel 如何将数字1显示为001?

热门文章

  1. centos32bit下wps安装教程
  2. 适用于ESXi上黑群晖DSM6.2.X最简单的安装方法
  3. wps教鞭功能_(完整)《初识wps演示》教学设计及反思
  4. Excel 2010 VBA 入门 125 创建动态智能匹配的下拉列表
  5. CNN 评CES 14大最酷科技产品 | 新智元专访度秘总经理景鲲
  6. 工业物联网底层数据平台 Tulip 获1300万美元A轮融资
  7. 【python OCR】PaddleOCR简单demo入门
  8. PHP 调用python 传参数被截断
  9. QuartusII 13.0.1添加cpld库方法
  10. 华为:挽狂澜之既倒,扶大厦之将倾