`

div偏移量控制,贪吃蛇游戏实现

    博客分类:
  • js
 
阅读更多

兼容IE10 FIREFOX CHROME 效果见下图

游戏运行效果

tcs.html

<html>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<head>
  <title>贪吃蛇</title>
  <style>
		
   .desktop{
      background-color:gray;
	  border:1px solid green;
      width:500px;	  
      height:500px;
   }
   .textbox{
		width:500px;	  
		height:500px;
		top:8px;
		left:550px;
		position:absolute;
   }
   .msgbox{
		top:258px;
		left:200px;
		color:red;
		text-align:center;height:10px;line-height:10px;
		position:absolute; 
   }

   .bd{
	width:10px;
    height:10px;
	text-align:center;height:10px;line-height:10px;
	border:1px solid gray;
    position:absolute;
   }
   
   .snake{
		background-color:yellow;
   }
   
   .food{
		background-color:red;
   }
   
   .gz{
		background-color:green;
   }


  
   
  </style>
<script src="tcs.js"></script>
</head>


<body>

<div id="desktop" class="desktop"></div>
<div id="textbox" class="textbox">		
	得分:<input id="score" type="text" value="0" readonly="true"></input>
	<BR/>坐标:<textarea id="vertex" cols="70" rows="5"></textarea>
</div>
<div id="msg" class="msgbox"></div>
<br/>
<input id="showGz" type="checkbox"/><label for="showGz">显示格子</label>

<input id="startbtn" type="button" value="start"/>

</body>
</html>

 tcs.js

//全局参数
var snakeTrain = [],//蛇身
	allFood=[],//食物仓库
	block,//自动行走定时器
	direction=39,//默认方向
	desktop ={top:0,left:0},//桌布
	foodBox = {x:0,y:0},//食物BOX
	nextRandFoodIndex=0,//下一个食物随机点索引
	score=0,//得分
	gameStatus = 0;//游戏状态 0未启动 1运行中 -1游戏结束
	
//初始化方法
window.onload = function(e){
	desktop.top = getTop($("desktop"));
	desktop.left = getLeft($("desktop"));
	
	initallFood();
	initKeyDownListener();
   $("startbtn").onclick = function(){
	 gameStatus = 1;
	 if ($("showGz").checked){
		 initGz();
	 }
	 initSnake();
	 initFood();
	 block = window.setInterval("startTrain()",500);
   };
   
}
//根据id获得dom对象
function $(id){
   return document.getElementById(id);
}
//随机产生一个界于min和max之间的整数
function getRandomNum(Min,Max)
{   
var Range = Max - Min;   
var Rand = Math.random();   
return(Min + Math.round(Rand * Range));   
}   
//获得dom对象的top
function getTop(e){  
    var offset=e.offsetTop;  
    if(e.offsetParent!=null) offset+=getTop(e.offsetParent);  
    return offset;  
}  
//获得dom对象的left
function getLeft(e){  
    var offset=e.offsetLeft;  
    if(e.offsetParent!=null) offset+=getLeft(e.offsetParent);  
    return offset;  
}  
//初始化食物池
function initallFood(){
	for(var i=0;i<50;i++){
		for(var j=0;j<50;j++){
		   allFood.push({x:i*10,y:j*10});
		}
	}
	var len = allFood.length;
	for(var i=0;i<len*2;i++){
		var n1 = getRandomNum(0,len-1);
		var n2 = getRandomNum(0,len-1);
		var tmp = allFood[n1];
		allFood[n1] = allFood[n2];
		allFood[n2] = tmp;
	}
}
//初始化食物
function initFood(addScore){
	var len = allFood.length;
	if (nextRandFoodIndex == len-1){
		nextRandFoodIndex = 0;
	}
	for(var i=nextRandFoodIndex++;i<len;i++){
	  if (!inSnakeTrain(allFood[i].x, allFood[i].y)){
	    createBox(allFood[i].x, allFood[i].y, "food");
		foodBox = {x:allFood[i].x , y:allFood[i].y};
		break;
	  }
	}
	if (addScore){
		score += 10;
		$("score").value = score;
	}
}
//初始化格子
function initGz(){
	for(var i=0;i<50;i++){
		for(var j=0;j<50;j++){
			createBox(10*i,10*j,"gz");
		}
	}
}

//初始化蛇
function initSnake(){
	var n = 3;
	for(var i=0;i<n;i++){
		createBox(10*i,0,"snake");		
		snakeTrain.push({x:10*i,y:0});
	}
	drawHead();
}


//初始化键盘监听事件
function initKeyDownListener(){
	document.onkeydown = function(e){
		if (gameStatus != 1){
			return -1;
		}
		var code = e.keyCode;
		if (code<37 || code>40){
			return -1;
		}
		startTrain(code);
	}
}
//上下左右手动行走
function leftGo(){
	if (direction == 39){//朝右走,不能左转
		return -1;
	}
	if (outside("x-")){
		gameOver("撞墙啦!Game Over");
		return -1;
	}
	if (eatSelf("x-")){
		gameOver("咬到自己啦!Game Over");
		return -1;
	}
	var len = snakeTrain.length;
	var snake = snakeTrain[len-1];
	if (foodBox.x == snake.x-10 && foodBox.y == snake.y){//eatting
		removeBox(foodBox.x,foodBox.y,"food");
		createBox(foodBox.x,foodBox.y,"snake");
		snakeTrain.push({x:foodBox.x , y:foodBox.y});
		initFood(true);
	}else{
		trainGo();
		snake.x -= 10;
		drawSnakeTrain();	
	}	
}
function upGo(){
	if (direction == 40){//朝下走,不能北上
		return -1;
	}
	if (outside("y-")){
		gameOver("撞墙啦!Game Over");
		return -1;
	}
	if (eatSelf("y-")){
		gameOver("咬到自己啦!Game Over");
		return -1;
	}
	var len = snakeTrain.length;
	var snake = snakeTrain[len-1];
	if (foodBox.x == snake.x && foodBox.y == snake.y-10){//eatting
		removeBox(foodBox.x,foodBox.y,"food");
		createBox(foodBox.x,foodBox.y,"snake");
		snakeTrain.push({x:foodBox.x , y:foodBox.y});
		initFood(true);
	}else{
		trainGo();
		snake.y -= 10;
		drawSnakeTrain();
	}
	
}
function rightGo(){
	if (direction == 37){//朝左走,不能右转
		return -1;
	}
	if (outside("x+")){
		gameOver("撞墙啦!Game Over");
		return -1;
	}
	if (eatSelf("x+")){
		gameOver("咬到自己啦!Game Over");
		return -1;
	}
	var len = snakeTrain.length;
	var snake = snakeTrain[len-1];
	if (foodBox.x == snake.x+10 && foodBox.y == snake.y){//eatting
		removeBox(foodBox.x,foodBox.y,"food");
		createBox(foodBox.x,foodBox.y,"snake");
		snakeTrain.push({x:foodBox.x , y:foodBox.y});
		initFood(true);
	}else{
		trainGo();
		snake.x += 10;
		drawSnakeTrain();
	}
	
}
function downGo(){
	if (direction == 38){//朝上走,不能南下
		return -1;
	}
	if (outside("y+")){
		gameOver("撞墙啦!Game Over");
		return -1;
	}
	if (eatSelf("y+")){
		gameOver("咬到自己啦!Game Over");
		return -1;
	}
	var len = snakeTrain.length;
	var snake = snakeTrain[len-1];
	if (foodBox.x == snake.x && foodBox.y == snake.y+10){//eatting
		removeBox(foodBox.x,foodBox.y,"food");
		createBox(foodBox.x,foodBox.y,"snake");
		snakeTrain.push({x:foodBox.x , y:foodBox.y});
		initFood(true);
	}else{
		trainGo();
		snake.y += 10;
		drawSnakeTrain();
	}
}
//蛇身跟上蛇头
function trainGo(){
	var len = snakeTrain.length;
	var i = len-1;
	var tmp = snakeTrain[i];
	while(i>=1){
		removeBox(tmp.x,tmp.y,"snake");
		var tmp2 = {'x':snakeTrain[i-1].x , 'y':snakeTrain[i-1].y};
		snakeTrain[i-1].x = tmp.x;
		snakeTrain[i-1].y = tmp.y;
		tmp = tmp2;		
		i--;
	}
	removeBox(tmp.x,tmp.y,"snake");
}

//画蛇
function drawSnakeTrain(){
	var len = snakeTrain.length;
	var str = "";
	for(var i=0;i<len;i++){
		var snake = snakeTrain[i];
		createBox(snake.x,snake.y,"snake");
		str += " {x:"+snake.x+",y:"+snake.y+"}";
	}
	$("vertex").value = str;
}

//装饰蛇头
function drawHead(){
	var snake = snakeTrain[snakeTrain.length-1];
	var snake2 = snakeTrain[snakeTrain.length-2];
	$("snake_"+snake.x+"_"+snake.y).style.backgroundColor = "orange";
	$("snake_"+snake2.x+"_"+snake2.y).style.backgroundColor = "yellow";
}

//是否出界
function outside(act){
	var snake = snakeTrain[snakeTrain.length-1];
	switch(act){
		case "x+":
			return snake.x + 10 > 490;
		case "x-":
			return snake.x - 10 < 0;
		case "y+":
			return snake.y + 10 > 490;
		case "y-":
			return snake.y - 10 < 0;
	}
}

//是否咬到自己
function eatSelf(act){
	var snake = snakeTrain[snakeTrain.length-1];
	switch(act){
		case "x+":
			return inSnakeTrain(snake.x + 10 , snake.y);
		case "x-":
			return inSnakeTrain(snake.x - 10 , snake.y);
		case "y+":
			return inSnakeTrain(snake.x ,snake.y + 10);
		case "y-":
			return inSnakeTrain(snake.x ,snake.y - 10);
	}
}

//是否在火车车厢内
function inSnakeTrain(x,y){
  for(var i=0;i<snakeTrain.length;i++){
		var train = snakeTrain[i];
		if (x== train.x && y == train.y){
		   return true;
		} 
  }
  return false;
}

//创建方块
function createBox(x,y,sl){
   var newNode = document.createElement("div");//创建P标签
   newNode.id = sl+"_"+x+"_"+y;
   newNode.name = "boxs";
   newNode.className="bd "+sl;
   if (sl == "gz"){
	  newNode.style.zIndex = 1; 
   }else{
	  newNode.style.zIndex = 9;
   }
   document.body.appendChild(newNode);
   newNode.style.left = (desktop.left+x)+"px";
   newNode.style.top = (desktop.top+y)+"px";  
}

//移除方块
function removeBox(x,y,sl){
	document.body.removeChild($(sl+"_"+x+"_"+y));
}

//自动开火车
function startTrain(code){
	if ("undefined" == typeof(code)){
		code = direction;
	}
	var rs = 0;
	switch(code){
		case 37://左
		rs = leftGo();
		break;
		case 38://上
		rs = upGo();
		break;
		case 39://右
		rs = rightGo();
		break;
		case 40://下
		rs = downGo();
		break;
	}
	if (rs != -1){
		direction = code;
		drawHead();
	}
}

function gameOver(msg){
	gameStatus = -1;
	var link = '<a href="javascript:reloadGame()">再来一次</a>';
	$("msg").innerHTML = msg+"<br/><br/>"+link;
	$("msg").style.zIndex=10;
	window.clearInterval(block);  
}

function reloadGame(){
	location.replace(location.href);
}
  • 描述: 效果图
  • 大小: 90 KB
  • tcs.zip (62.3 KB)
  • 下载次数: 2
分享到:
评论

相关推荐

    基于 jquery 的 html 贪吃蛇 简单实现

    在网页游戏中,贪吃蛇是一款非常经典且受欢迎的小游戏,它的核心机制是通过用户操作控制蛇移动,吃食物后蛇身增长,碰到边界或自身则游戏结束。这个项目是利用jQuery库,结合HTML和CSS,实现了这样一个简单版的...

    javascript实现贪吃蛇游戏

    整个游戏是在一个&lt;div&gt;框子(地图)里展开的,蛇有地图里的一系列&lt;div&gt;构成,初始状态(刚刚打开页面)蛇是一个&lt;div&gt;框,蛇头和蛇尾是在一起的,就是这个&lt;div&gt;框,以后吃了食物后&lt;div&gt;个数会变多,蛇就会长长。...

    HTML 贪吃蛇游戏

    例如,`&lt;canvas&gt;`标签用于绘制游戏画布,`&lt;div&gt;`用于分组元素,`&lt;button&gt;`用于定义交互式按钮。 2. CSS 样式设计: CSS(Cascading Style Sheets)用于美化HTML元素的外观和布局。在贪吃蛇游戏中,CSS可以用来设置...

    js实现简单贪吃蛇游戏

    在深入讨论如何使用JavaScript来实现一个简单的贪吃蛇游戏之前,我们首先要了解什么是贪吃蛇游戏。贪吃蛇是一款经典的电子游戏,玩家控制一个不断移动的蛇形角色,通过吃掉出现在屏幕上的食物来增长身体长度。游戏的...

    js实现简单的贪吃蛇游戏

    在本文中,我们将探讨如何使用JavaScript实现一个简单的贪吃蛇游戏。贪吃蛇游戏是一种经典的像素级游戏,玩家通过控制蛇的移动来吃食物,每次吃到食物后,蛇的长度会增加,而游戏区域是有限的,玩家必须避免蛇头碰到...

    如何基于javascript实现贪吃蛇游戏

    此外,还需要定义贪吃蛇的移动方向、蛇身体的数组、食物的位置、得分、游戏速度等属性,并通过各种函数来控制游戏的行为。 ```javascript var sw = 20, // 一个方块的宽 sh = 20, // 一个方块的高 tr = 25, // ...

    Javascript实现贪吃蛇游戏

    JavaScript实现的贪吃蛇游戏是一种基于网页的娱乐项目,它结合了HTML、CSS和JavaScript三种技术,让玩家可以在浏览器上体验经典游戏的乐趣。下面将详细解释这三个方面的知识点。 首先,HTML(HyperText Markup ...

    用JavaScript写的贪吃蛇游戏

    《JavaScript实现贪吃蛇游戏详解》 贪吃蛇游戏,作为一个经典的休闲娱乐游戏,深受广大玩家喜爱。在本文中,我们将深入探讨如何使用JavaScript这一强大的客户端脚本语言来实现这样一个有趣的游戏。JavaScript作为...

    HTML 小游戏:贪吃蛇游戏

    例如,`&lt;div&gt;`标签用于创建游戏区域的容器,`&lt;canvas&gt;`标签用于绘制游戏画面,而`&lt;button&gt;`标签则用来设置开始、暂停和重置游戏的控制按钮。 CSS(Cascading Style Sheets)用于美化和定制HTML元素的样式。在贪吃蛇...

    使用JavaScript实现贪吃蛇游戏

    在本教程中,我们将探讨如何使用JavaScript实现一个经典的贪吃蛇游戏。首先,我们来看一下提供的文件结构,它包括HTML、CSS以及多个JavaScript文件。这些文件分别负责游戏界面的布局、食物的生成、蛇的移动与碰撞...

    DIV可移动 可实现任意拖动放大缩小

    标题中的“DIV可移动 可实现任意拖动放大缩小”是指一种使用JavaScript技术来实现的交互功能,允许用户在网页上自由地拖动、缩放HTML中的div元素。这一功能通常用于创建用户界面元素,如窗口、面板或者任何需要动态...

    基于javascript实现贪吃蛇小游戏

    根据提供的文件内容,可以详细解析出实现基于JavaScript的贪吃蛇小游戏的相关知识点。 首先,从标题和描述中可以看出,本篇文章的核心在于通过JavaScript编程语言来实现一个贪吃蛇小游戏。JavaScript是一种运行在...

    js控制div左右切换带左右箭头

    在网页设计中,"js控制div左右切换带左右箭头"是一种常见的交互效果,它用于展示多内容区域,用户可以通过点击或悬浮在左、右箭头上实现内容的切换。这种效果常见于产品展示、轮播图或者选项卡式布局中,能够提供...

    div实现圆角 div实现圆角

    div实现圆角 div实现圆角 div实现圆角 div实现圆角 div实现圆角

    asp.net中实现可拖动div

    在CSS中,我们可以使用position属性(如static, relative, absolute或fixed)来控制元素的位置,并使用top, right, bottom和left属性来精确调整元素的偏移量。 接下来,我们将使用JavaScript或者jQuery库来实现div...

    js 实现div里面的内容滚动,并可以通过按钮控制

    【标题】:“JS实现div内滚动内容及按钮控制” 在网页设计中,有时我们需要在一个固定的div区域展示大量的文本或图片,而这个div的大小又是有限的。这时,我们可以利用JavaScript来实现div内的滚动效果,并通过按钮...

    js控制层和DIV+CSS实现TAB菜单

    在网页设计中,"js控制层和DIV+CSS实现TAB菜单"是一个常见的技术组合,用于创建交互式的用户界面。这个主题涉及到JavaScript(JS)、层(Layer)管理、Div(CSS布局元素)以及CSS(级联样式表)的使用。下面我们将...

    jquery例子 贪吃蛇游戏

    《jQuery实现贪吃蛇游戏详解》 在网页开发中,jQuery作为一个强大的JavaScript库,极大地简化了DOM操作、事件处理和动画制作。本篇文章将深入探讨如何利用jQuery来编写一款经典的贪吃蛇游戏,通过这个实例,我们...

    js控制div全屏

    在网页设计中,有时我们需要将某个`div`元素设置为全屏显示,以提供沉浸式的用户体验或特定功能的实现。JavaScript(简称js)作为一种强大的客户端脚本语言,可以帮助我们轻松实现这一需求。在这个项目中,我们使用...

Global site tag (gtag.js) - Google Analytics