当前位置: 代码迷 >> Web前端 >> div偏移量统制,贪吃蛇游戏实现
  详细解决方案

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

热度:387   发布时间:2013-09-26 10:32:35.0
div偏移量控制,贪吃蛇游戏实现

兼容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;
   }


  
   
  </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/><br/>
<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;
? 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 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;
?? 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;
?window.clearInterval(block);? 
}
function reloadGame(){
?location.replace(location.href);
}

?

  相关解决方案