貪喫蛇簡易實現

1.背景牆 確定行列
2.創建蛇頭
3.蛇頭移動
4.蛇頭變向
5.創建食物
6.碰撞檢測
7.增加身體
8.食物消失 隨機創建新的食物
9身體蛇頭一起移動

——-完成——-
1.喫自己(自身碰撞檢測)
2.不反向移動document.onkeyup中判斷
3.蛇頭撞牆moveBody(array); moveHead(col,row,head)
4.加分項check(obj1,obj2)
5.彩色隨機蛇createNode(type,parent,preObj)

snake.html頁面代碼塊

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>貪喫蛇</title>
    <style>
        .out{
            float: left;
            width: 500px;
            height: 500px;
            background: #ccc;
            /*border: 1px solid blue;*/
            position: relative;
        }

    </style>
</head>
<body>
<div class="out">
</div>
<h1><br/><br/><br/><br/></h1>
<!-- 記錄分數 -->
<p style="font-size:20px;color:red"> score:<span id="score" style="color:black">0</span> </p>
<script src="./snake.js"></script>
<script>
var col=10;
var row=10;
var w=50;
var h=50;
var out=$('.out')[0]

var bodys=[];
//背景
createBg(out,col,row)
// 蛇頭
var head=createNode(1,out)
// 食物
var food=createNode(2,out)//createFood(out,w,h,col,row,1)
//計時器
    var timer=setInterval(function(){
//身體移動
moveBody(bodys,head)
//頭部移動
moveHead(col,row,head);
// check(head,food)?alert('裝上了'):console.log('沒裝上')
//是否撞到自己
checkzs(head,bodys)
var  checkstate=check(head,food);
if(checkstate){
    //刪除food
    out.removeChild(food);
    //創建food(food不能創建在身體上)
    food=createNode(2,out)
    //創建身體
    if (bodys.length>0) {
        // var body=createBody(out,w,h,bodys[bodys.length-1])
        var body=createNode(3,out,bodys[bodys.length-1])
        // console.log(body)
    }else{
       // var body=createBody(out,w,h,head)
       var body=createNode(3,out,head)
       // console.log(body)
    }

    bodys.push(body)
}
},500)
//
createKeyEvent(head);
</script>
</body>
</html>
<!-- 
1.背景牆   確定行列
2.創建蛇頭
3.蛇頭移動
4.蛇頭變相
5.創建實物
6.碰撞檢測
7.增加身體
8.食物消失 隨機創建新的
9身體蛇頭一起移動

-------完成-------
1.喫自己checkzs(obj1,obj3)
2.不反向移動document.onkeyup中判斷
3.蛇頭撞牆moveBody(array);   moveHead(col,row,head)
4.加分項check(obj1,obj2)
5.彩色隨機蛇createNode(type,parent,preObj)
 -->

snake.js頁面代碼快

 //獲取元素方法
 function $(string){
   var tag=string.charAt(0);
   var ele=null;
   switch(tag){
       case ".":
        ele=document.getElementsByClassName(string.slice(1))
        break;
       case "#":
        ele=document.getElementById(string.slice(1))
        break;
       default:
        ele=document.getElementsByTagName(string);
        break;
   }
   return  ele;
}
var fenshu=0;
var score=$('#score');
var speeding=0;
//創建背景方法
function createBg(parent,col,row){
  //創建表格
  parent.style.width=row*50+"px";
  parent.style.height=col*50+"px";
  for (var i = 0; i < row; i++) {
    for (var j = 0; j < col; j++) {
      var  div =document.createElement('div')
      div.style.width="48px"
      div.style.height="48px"
      div.style.border="1px solid #000000"
      div.style.float='left'
      parent.appendChild(div);
    }
  }
}

//事件監聽
function createKeyEvent(head){
  document.onkeyup=function(event){
   // console.log(event)
   var event=event||window.event
   var key=event.keyCode;
  if (head.className=="left"&&event.keyCode==39) {
    return;
}
if (head.className=="right"&&event.keyCode==37) {
    return;
}
if (head.className=="top"&&event.keyCode==40) {
    return;
}
if (head.className=="down"&&event.keyCode==38) {
    return;
}
   switch(key){
      case 40:

        head.className='down'
      break;
      case 37:
        head.className="left"
      break;
      case 38:
         head.className="top"
      break;
      case 39:
         head.className="right"
      break;
   }
}
}
//碰撞檢測
function check(obj1,obj2){

  if (obj1.offsetLeft==obj2.offsetLeft&&obj1.offsetTop==obj2.offsetTop) {
    if (food.style.backgroundColor=='yellow') {
      fenshu++;
    score.innerHTML=(fenshu);
    }
    if (food.style.backgroundColor=='pink') {
      fenshu+=2;
    score.innerHTML=(fenshu);
    }
    if (food.style.backgroundColor=='skyblue') {
      fenshu+=3;
    score.innerHTML=(fenshu);
    }
    return true;
  }

   return false;
}
function checkzs(obj1,obj3){
  if (obj3.length>3) {
    for (var i = obj3.length - 1; i >= 3; i--) {
      x=obj3[i].offsetLeft;
      y=obj3[i].offsetTop;
      // console.log(x)
      // console.log(y)
      // console.log(obj1.offsetLeft)
      // console.log(obj1.offsetTop)
      if (x==obj1.offsetLeft&&y==obj1.offsetTop) {
        alert("失誤")
      }
    }
  }
}
//頭部移動
function moveHead(col,row,head){

var left=0;
var top=0;
if (head.offsetLeft<0||head.offsetLeft>(col-1)*50||head.offsetTop<0||head.offsetTop>(row-1)*50) {
    clearInterval(timer);
    alert("遊戲結束")
    window.location.reload();

  }
switch(head.className){

  case 'left':
  left=head.offsetLeft-50;
  top=head.offsetTop
  break;
  case 'right':
  left=head.offsetLeft+50;
  top=head.offsetTop
  break;
  case 'top':
  left=head.offsetLeft;
  top=head.offsetTop-50
  break;
  case 'down':
  left=head.offsetLeft;
  top=head.offsetTop+50
  break;

}
head.style.left=left+'px'
head.style.top=top+'px'
}
//移動body
function moveBody(array){
  if (array.length>0) {
    if (head.offsetLeft<0||head.offsetLeft>(col-1)*50||head.offsetTop<0||head.offsetTop>(row-1)*50) {
    window.location.reload();
    clearInterval(timer); 
  }
   for (var i = array.length - 1; i >= 0; i--) {
      switch(array[i].className){
        case 'left':
          x=array[i].offsetLeft-50;
          y=array[i].offsetTop
          break;
          case 'right':
          x=array[i].offsetLeft+50;
          y=array[i].offsetTop
          break;
          case 'top':
          x=array[i].offsetLeft;
          y=array[i].offsetTop-50
          break;
          case 'down':
          x=array[i].offsetLeft;
          y=array[i].offsetTop+50
          break;
     }
     var aa=parseInt(Math.random()*225);
      var bb=parseInt(Math.random()*225);
      var cc=parseInt(Math.random()*225);
      bodys[i].style.bgColor="rgb(" + aa + "," + bb + "," + cc + ")";
  bodys[i].style.left=x+"px";
  bodys[i].style.top=y+'px';
  if (i==0) {
           array[i].className=head.className
  }else{
    array[i].className=array[i-1].className
  }

   }
}
}
/*
檢測座標是否重合
*/

function  checkfood(x,y,array){
  // console.log(head)
  if (x==head.offsetLeft&&y==head.offsetTop) {
    return false
  }
  for (var i = 0; i < array.length; i++) {
    // 檢測到重複
    if (array[i].offsetLeft==x&&array[i].offsetTop==y) {
      return false;
    }
    if (i==array.length-1) {
      return  true;
    }
  }
  return true;
}
/*
創建節點對象
 type 1  蛇頭  2 food  3 身體
*/
function createNode(type,parent,preObj){
  var x=0;
  var y=0;
  var w=50;
  var h=50;
  var bgColor;
  var className="";
  var  preObj=preObj?preObj:null
  switch(type){
    case 1:
    bgColor="#00FF00"
    className="right"
    break;
    case 2:
     var foodtype=parseInt(Math.random()*10)%3
     var foods=[['yellow',1],['skyblue',2],['pink',3]]
      bgColor=foods[foodtype][0]
        // x=parseInt(Math.random()*row)*50;
        // y=parseInt(Math.random()*col)*50;
        var array=bodys;

        // console.log(array)
      test();
      function test(){
        var a=parseInt(Math.random()*row)*50;
        var b=parseInt(Math.random()*col)*50;
        var state=checkfood(a,b,array)
        // alert(state)
        if (state) {
          x=a;
          y=b;
        }else{
          test();
        }
      }

    break;
    case 3:
     switch(preObj.className){
        case 'left':
          x=preObj.offsetLeft+50;
          y=preObj.offsetTop
          break;
          case 'right':
          x=preObj.offsetLeft-50;
          y=preObj.offsetTop
          break;
          case 'top':
          x=preObj.offsetLeft;
          y=preObj.offsetTop+50
          break;
          case 'down':
          x=preObj.offsetLeft;
          y=preObj.offsetTop-50
          break;
     }   
      className=preObj.className;
      var aa=parseInt(Math.random()*225);
      var bb=parseInt(Math.random()*225);
      var cc=parseInt(Math.random()*225);
      bgColor="rgb(" + aa + "," + bb + "," + cc + ")";
    break ;
    default:
    break

  }
  var node=document.createElement('div');
  node.style.background=bgColor;
  node.style.position="absolute";
  node.style.left=x+"px";
  node.style.top=y+"px";
  node.style.width=w+"px";
  node.style.height=h+"px";
  node.style.zIndex=999;
  node.className=className;
  parent.appendChild(node)
  return node;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章