javascript实现坦克大战

本贴最后更新于 4218 天前,其中的信息可能已经天翻地覆

一、效果图

二、代码

<script type="text/javascript" src="jquery-1.7.1.js"></script>
<style type="text/css">
#map{width:700px; height:600px; border:0px solid #CCC; overflow:hidden;}
.maps{width:10px; height:10px; float:left; overflow:hidden;border:1px solid red;}
.enemy{background:black;}
.tank{background:blue;}
.bullet{background:purple;}
</style>
<script type="text/javascript">
// tank运行定时器 var tankInt; // tank运行状态 var tankIsRunning = false; // 定义方格 function Box(x,y){ this.x = x; this.y = y; } // 初始化地图 function initMap(){ for(var i=1;i&lt;=50;i++){ for(var j=1;j&lt;=50;j++){ $(&quot;&lt;div id=map_&quot;+i+&quot;_&quot;+j+&quot; class='maps'&gt;&lt;/div&gt;&quot;).appendTo($('#map')); if(j==50){ $('&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;').appendTo($('#map')); } } } } // 定义tank var tank = [ [new Box(1,1),new Box(2,1),new Box(2,2),new Box(3,2),new Box(1,3),new Box(2,3)], [new Box(1,1),new Box(1,2),new Box(2,2),new Box(2,3),new Box(3,1),new Box(3,2)], [new Box(1,2),new Box(2,1),new Box(2,2),new Box(2,3),new Box(3,1),new Box(3,3)], [new Box(1,2),new Box(1,3),new Box(2,1),new Box(2,2),new Box(3,2),new Box(3,3)] ]; // 坦克头位置 var tankHead = [new Box(3,2),new Box(2,3),new Box(1,2),new Box(2,1)]; // tank运行方向 var tankDirection = 3; // 横向位移 var xMove = 20; // 纵向位移 var yMove = 20; // 当前坦克位置 var nowTank; // 当前坦克头位置 var nowTankHead; // 子弹容器 var bullets = []; // 绘制tank function drawTank(){ for(var i=0;i&lt;tank[tankDirection].length;i++){ var point = tank[tankDirection][i]; var x = point.x+xMove; var y = point.y+yMove; $(&quot;#map_&quot;+x+&quot;_&quot;+y).addClass('tank'); } nowTank = tank[tankDirection]; nowTankHead = tankHead[tankDirection]; } // 清除tank function cleanTank(){ for(var i=0;i&lt;nowTank.length;i++){ var point = nowTank[i]; var x = point.x+xMove; var y = point.y+yMove; $(&quot;#map_&quot;+x+&quot;_&quot;+y).removeClass('tank'); } } // 绘制子弹 function drawBullet(bullet){ $(&quot;#map_&quot;+bullet.x+&quot;_&quot;+bullet.y).addClass('bullet'); } // 清除子弹 function cleanBullet(bullet){ $(&quot;#map_&quot;+bullet.x+&quot;_&quot;+bullet.y).removeClass('bullet'); } // tank前进 function tankForward(){ cleanTank(); switch (tankDirection){ case 0: if(nowTankHead.x + xMove &lt; 50){ xMove ++ ; } break; case 1: if(nowTankHead.y + yMove &lt; 50){ yMove ++ ; } break; case 2: if(1 &lt; nowTankHead.x + xMove){ xMove -- ; } break; case 3: if(1 &lt; nowTankHead.y + yMove){ yMove -- ; } break; } drawTank(); } // tank发射子弹 将新发射的子弹放入bullets数组中 function shoot(){ var bulletBox = new Box(nowTankHead.x + xMove, nowTankHead.y + yMove); switch (tankDirection){ case 0: bulletBox.x += 1 ; break; case 1: bulletBox.y += 1 ; break; case 2: bulletBox.x -= 1 ; break; case 3: bulletBox.y -= 1 ; break; } var bulletDirection = tankDirection var bullet = { bulletBox : bulletBox, bulletDirection : bulletDirection } bullets.push(bullet); } // 子弹前进,统一管理子弹运行 function bulletsForward(){ for(var i=0;i&lt;bullets.length;i++){ bullet = bullets[i]; var bulletDirection = bullet.bulletDirection; var bulletBox = bullet.bulletBox; cleanBullet(bulletBox); switch (bulletDirection){ case 0: bulletBox.x += 1 ; break; case 1: bulletBox.y += 1 ; break; case 2: bulletBox.x -= 1 ; break; case 3: bulletBox.y -= 1 ; break; } drawBullet(bulletBox); for(var j=0;j&lt;nowEnemy.length;j++){ if(bulletBox.x == nowEnemy[j].x &amp;&amp; bulletBox.y == (nowEnemy[j].y + yMoveEnemy)){ cleanEnemy(); nowEnemy = []; break; } } } } // 定义enemy var enemy = [ [new Box(1,1),new Box(1,2),new Box(2,2),new Box(2,3),new Box(3,1),new Box(3,2)], [new Box(1,2),new Box(1,3),new Box(2,1),new Box(2,2),new Box(3,2),new Box(3,3)] ]; // 定义enemy头 var enemyHead = [new Box(2,3),new Box(2,1)]; // enemy运行方向 var enemyDirection = 0; // enemy y轴位移 var yMoveEnemy = 0; // enemy当前位置 var nowEnemy = enemy[enemyDirection]; // enemy头当前位置 var nowEnemyHead = enemyHead[enemyDirection]; // 绘制enemy function drawEnemy(){ for(var i=0;i&lt;nowEnemy.length;i++){ var point = nowEnemy[i]; $(&quot;#map_&quot;+point.x+&quot;_&quot;+(point.y + yMoveEnemy)).addClass('enemy'); } } // 清除enemy function cleanEnemy(){ for(var i=0;i&lt;nowEnemy.length;i++){ var point = nowEnemy[i]; $(&quot;#map_&quot;+point.x+&quot;_&quot;+(point.y + yMoveEnemy)).removeClass('enemy'); } } // enemy前进 function enemyForward(){ cleanEnemy(); if(enemyDirection == 0){ if(nowEnemyHead.y + yMoveEnemy &lt; 50){ yMoveEnemy ++ ; }else{ enemyDirection = 1; nowEnemy = enemy[enemyDirection]; nowEnemyHead = enemyHead[enemyDirection]; } }else{ if(nowEnemyHead.y + yMoveEnemy &gt; 0){ yMoveEnemy -- ; }else{ enemyDirection = 0; nowEnemy = enemy[enemyDirection]; nowEnemyHead = enemyHead[enemyDirection]; } } drawEnemy(); } $(function(){ // 初始化地图 initMap(); // 初始化tank drawTank(); // 启动子弹定时器 setInterval(function(){ bulletsForward(); },50); // 绘制enemy drawEnemy(); // 启动enemy定时器 setInterval(function(){ enemyForward(); },300); // 监听按下键盘 37左键 38上建 39右键 下键40 32空格键 发射子弹 $(document).keydown(function(e){ var forwardFlag = false; switch(e.which){ case 37: if(tankDirection != 3){ tankDirection = 3; } forwardFlag = true; break; case 38: if(tankDirection!=2){ tankDirection = 2; } forwardFlag = true; break; case 39: if(tankDirection!=1){ tankDirection = 1; } forwardFlag = true; break; case 40: if(tankDirection != 0){ tankDirection = 0; } forwardFlag = true; break; case 32: shoot(); break; } if(forwardFlag){ if(!tankIsRunning){ gameInt = setInterval(function(){ tankForward(); },100); tankIsRunning = true; } } }); // 监控弹起键盘 tank停止运行 $(document).keyup(function(e){ switch(e.which){ case 40: case 39: case 38: case 37: clearInterval(gameInt); tankIsRunning = false; break; } }); });

</script>
<div id="map"></div>

  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    180 引用 • 821 回帖
  • 编程
    54 引用 • 267 回帖 • 3 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1278 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • AWS
    11 引用 • 28 回帖 • 11 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 637 关注
  • Access
    1 引用 • 3 回帖 • 7 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 442 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 反馈

    Communication channel for makers and users.

    126 引用 • 929 回帖 • 266 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    132 引用 • 876 回帖 • 4 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    169 引用 • 1527 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 20 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 299 关注
  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 819 关注
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 512 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 661 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 610 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1278 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    946 引用 • 1460 回帖
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 3 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 3 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖