javascript实现坦克大战

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

一、效果图

二、代码

<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>

  • 游戏

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

    169 引用 • 799 回帖 • 2 关注
  • 编程
    50 引用 • 257 回帖 • 3 关注
  • JavaScript

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

    710 引用 • 1173 回帖 • 163 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 409 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖
  • SQLite

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

    4 引用 • 7 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 2 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 566 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 694 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 641 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • 自由行
    3 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 4 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 686 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 602 关注
  • BAE

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

    19 引用 • 75 回帖 • 619 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 310 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖 • 1 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 687 关注
  • OnlyOffice
    4 引用 • 19 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖 • 1 关注