贪食蛇 - 自己动手小游戏

既然有了俄罗斯方块,那趁兴也来一个贪食蛇吧,虽然有人说是入门级代码必写的小东西,但是也花费了不少时间,没有用到过多的复杂处理。

 

 

源代码:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title>Snake</title>
<style type="text/css">
body{margin:0;padding:0;font-family:Verdana;}
.container{border:2px solid #ccc;overflow:hidden;zoom:1;padding:10px;}
#game-area{float:left;width:375px;height:300px;border:4px solid #999;padding:0;margin:0;font-size:0;line-height:0;overflow:hidden;}
#game-area ul{overflow:hidden;zoom:1;padding:0;margin:0;}
#game-area ul li{float:left;width:15px;height:15px;overflow:hidden;font-size:0;line-height:0;}
.black{background-color:#ccc;}
.blue{background-color:#1E87F0;}
.yellow{background-color:#F77117;}
.green{background-color:#91C846;}
.violet{background-color:#E727CF;}
#game-oper{float:left;display:inline;margin-left:20px;font-size:14px;}
#info{font-size:16px;}
#sn-stage{color:#1E87F0;font-weight:bold;}
#sn-score{color:#F77117;font-weight:bold;}
#oper{margin:10px 0;}
#oper button{font-size:14px;margin-right:5px;padding:2px 5px;font-family:Verdana;}
#debug{color:#ff0000;font-weight:bold;}
</style>
</head>
<body>
<div class="container">
 <div id="game-area"></div>
 <div id="game-oper">
  <h3>Snake Game</h3>
  <div id="info">
   Stage : <span id="sn-stage">1</span>,
   Score : <span id="sn-score">0</span>
  </div>
  <div id="oper">
   <button id="begin">Begin</button>
   <button id="restart">Again</button>
  </div>
  <div id="debug"></div>
 </div>
</div>
<script type="text/javascript">
var Snake = (function(){
 var $ = function(s){return document.getElementById(s)};
 var timer = null;
 var iSnake = null; // 蛇
 var speed = 600; // 移动速度
 var dir = "left"; // 移动方向
 var isPause = false; // 暂停
 var isOver = false;
 var createSnake = function(){
  iSnake = [];
  for(var i = 0; i < 4; i++){
   iSnake.push([9,(i + 10)]);
   if(0 == i){
    $("item-" + 9 + "-" + (i + 10)).className = "yellow";
    $("item-" + 9 + "-" + (i + 10)).title = "head";
   }else{
    $("item-" + 9 + "-" + (i + 10)).className = "blue";
    $("item-" + 9 + "-" + (i + 10)).title = "body";
   }
  }
 };
 var createWall = function(level){
  switch(level){
   case 1 :
    for(var i = 1; i < 12; i++){
     for(j = 0; j < 2; j++){
      $("item-" + (j + 6) + "-" + i).className = "black";
      $("item-" + (j + 6) + "-" + i).title = "block";
     }
    }
    break;
   case 2 :
    for(var i = 1; i < 15; i++){
     $("item-4-" + i).className = "black";
     $("item-4-" + i).title = "block";
     $("item-"+ i +"-20").className = "black";
     $("item-"+ i +"-20").title = "block";
    }
    break
   case 3 :
    for(var i = 1; i < 12; i++){
     for(j = 0; j < 2; j++){
      $("item-" + (j + 11) + "-" + i).className = "black";
      $("item-" + (j + 11) + "-" + i).title = "block";
     }
    }
    for(var i = 10; i < 25; i++){
     for(j = 0; j < 2; j++){
      $("item-" + (j + 4) + "-" + i).className = "black";
      $("item-" + (j + 4) + "-" + i).title = "block";
     }
    }
    break;
   case 4 :
    for(var i = 1; i < 12; i++){
     for(j = 0; j < 2; j++){
      $("item-" + (j + 6) + "-" + i).className = "black";
      $("item-" + (j + 6) + "-" + i).title = "block";
     }
    }
    break;
   case 5 :
    for(var i = 1; i < 15; i++){
     $("item-4-" + i).className = "black";
     $("item-4-" + i).title = "block";
     $("item-"+ i +"-20").className = "black";
     $("item-"+ i +"-20").title = "block";
    }
    break
   case 6 :
    for(var i = 1; i < 12; i++){
     for(j = 0; j < 2; j++){
      $("item-" + (j + 11) + "-" + i).className = "black";
      $("item-" + (j + 11) + "-" + i).title = "block";
     }
    }
    for(var i = 10; i < 25; i++){
     for(j = 0; j < 2; j++){
      $("item-" + (j + 4) + "-" + i).className = "black";
      $("item-" + (j + 4) + "-" + i).title = "block";
     }
    }
    break;
   case 7 :
    for(var i = 1; i < 15; i++){
     $("item-4-" + i).className = "black";
     $("item-4-" + i).title = "block";
     $("item-"+ i +"-20").className = "black";
     $("item-"+ i +"-20").title = "block";
    }
    break
  };
 };
 var resetSnake = function(level){
  dir = "left";
  initBoard();
  createWall(level);
  createSnake();
  createFood();
 };
 var createFood = function(){
  pauseSnake();
  var y = Math.ceil(Math.random() * 22) + 1;
  var x = Math.ceil(Math.random() * 16) + 1;
  if("head" == $("item-" + x + "-" + y).title || "body" == $("item-" + x + "-" + y).title || "block" == $("item-" + x + "-" + y).title){
   createFood();
   return false;
  }
  $("item-" + x + "-" + y).className = "green";
  $("item-" + x + "-" + y).title = "food";
  startSnake();
 };
 var moveSnake = function(){
  if(isOver){pauseSnake();return false;}
  $("item-" + iSnake[iSnake.length - 1][0] + "-" + iSnake[iSnake.length - 1][1]).className = "";
  $("item-" + iSnake[iSnake.length - 1][0] + "-" + iSnake[iSnake.length - 1][1]).title = "";
  for(var i = iSnake.length - 1; i > 0; i--){
   iSnake[i][0] = iSnake[i - 1][0];
   iSnake[i][1] = iSnake[i - 1][1];
   $("item-" + iSnake[i][0] + "-" + iSnake[i][1]).className = "blue";
   $("item-" + iSnake[i][0] + "-" + iSnake[i][1]).title = "body";
  }
  switch(dir){
   case "left" :
    moveLeft();
    break;
   case "right" :
    moveRight();
    break;
   case "top" :
    moveTop();
    break;
   case "bottom" :
    moveBottom();
    break;
  }
  chkSnake();
  if(chkFood()){
   iSnake.push([iSnake[iSnake.length - 1][0],iSnake[iSnake.length - 1][1]]);
   $("item-" + iSnake[iSnake.length - 1][0] + "-" + iSnake[iSnake.length - 1][1]).className = "blue";
   $("item-" + iSnake[iSnake.length - 1][0] + "-" + iSnake[iSnake.length - 1][1]).title = "body";
   setStage();
  }
  $("item-" + iSnake[0][0] + "-" + iSnake[0][1]).className = "yellow";
  $("item-" + iSnake[0][0] + "-" + iSnake[0][1]).title = "head";

 };
 var chkSnake = function(){
  if("block" == $("item-" + iSnake[0][0] + "-" + iSnake[0][1]).title || "body" == $("item-" + iSnake[0][0] + "-" + iSnake[0][1]).title){
   pauseSnake();
   isOver = true;
   $("debug").innerHTML = "Game Over";
   $("item-" + iSnake[0][0] + "-" + iSnake[0][1]).style.backgroundColor = "red";
  }
 };
 var chkFood = function(){
  if("food" == $("item-" + iSnake[0][0] + "-" + iSnake[0][1]).title){
   $("sn-score").innerHTML = parseInt($("sn-score").innerHTML,10) + 10;
   createFood();
   return true;
  }
  return false;
 };
 var setStage = function(){
  var _score = parseInt($("sn-score").innerHTML,10);
  var _stage = 1;
  if(_score >= 100 && _score < 200){
   speed = 500;
   _stage = 2;
  }else if(_score >= 200 && _score < 300){
   speed = 400;
   _stage = 3;
  }else if(_score >= 300 && _score < 400){
   speed = 300;
   _stage = 4;
  }else if(_score >= 400 && _score < 500){
   speed = 200;
   _stage = 5;
  }else if(_score >= 500 && _score < 600){
   speed = 100;
   _stage = 6;
  }else if(_score >= 600){
   speed = 80;
   _stage = 7;
  }
  0 == _score % 100 ? resetSnake(_score / 100) : "";
  $("sn-stage").innerHTML = _stage;
 };
 var moveLeft = function(){
  iSnake[0][1] = iSnake[0][1] - 1;
 };
 var moveRight = function(){
  iSnake[0][1] = iSnake[0][1] + 1;
 };
 var moveTop = function(){
  iSnake[0][0] = iSnake[0][0] - 1;
 };
 var moveBottom = function(){
  iSnake[0][0] = iSnake[0][0] + 1;
 };
 var pauseSnake = function(){
  if(null != timer){
   clearInterval(timer);
   timer = null;
   isPause = true;
  }
 };
 var startSnake = function(){
  if(null == timer){
   timer = setInterval(function(){moveSnake()},speed);
   isPause = false;
  }
 }
 var initBoard = function(){
  var _arr = [];
  _arr.push("<ul>");
  for(var i = 0,j = 0,k = 0; i < 500; i++){
   _arr.push("<li id='item-"+ k + "-" + j +"'"+ (0 == k || 19 == k || 0 == j || 24 ==j ? " class='black' title='block'" : "") +"></li>");
   j++;
   if(j > 24){j = 0;k++};
  }
  _arr.push("</ul>");
  $("game-area").innerHTML = _arr.join("");

  document.onkeydown = function(e){
   switch(keyCode(e)){
    case 37 :
     if("right" == dir || isPause){return false};
     //pauseSnake();
     dir = "left";
     moveSnake();
     //startSnake();
     break;
    case 39 :
     if("left" == dir || isPause){return false};
     //pauseSnake();
     dir = "right";
     moveSnake();
     //startSnake();
     break;
    case 38 :
     if("bottom" == dir || isPause){return false};
     //pauseSnake();
     dir = "top";
     moveSnake();
     //startSnake();
     break;
    case 40 :
     if("top" == dir || isPause){return false};
     //pauseSnake();
     dir = "bottom";
     moveSnake();
     //startSnake();
     break;
   }
  }
  $("begin").onclick = function(){
   if("Begin" == this.innerHTML){
    if(null == iSnake){
     createSnake();
     createFood();
     startSnake();
    }else{
     startSnake();
     isPause = false;
    }
    this.innerHTML = "Pause";
   }else if("Pause" == this.innerHTML){
    pauseSnake();
    isPause = true;
    this.innerHTML = "Begin";
   }
  }
  $("restart").onclick = function(){
   clearInterval(timer);
   timer = null;
   dir = "left";
   iSnake = null;
   isOver = false;
   initBoard();
   speed = 600;
   $("sn-score").innerHTML = "0";
   $("sn-stage").innerHTML = "1";
   $("begin").innerHTML = "Begin";
   $("debug").innerHTML = "";
  }
 };
 var keyCode = function(evt){
  evt = (evt) ? evt : ((window.event) ? window.event : "");
  return evt.keyCode ? evt.keyCode : evt.which;
 };
 return {
  init : initBoard
 };
})();
Snake.init();
</script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪食蛇游戏是一款经典的游戏,玩家通过控制一条蛇在一个有边界的区域内移动,吃掉食物来增长身体长度,同时要避免撞到自己的身体或者撞到边界。下面是贪食蛇游戏软件的详细设计: 1. 游戏界面设计: - 游戏区域:一个矩形区域,用于显示游戏的进行,包括蛇和食物的位置。 - 分数显示:显示玩家当前的得分。 - 游戏状态显示:显示游戏的状态,如开始、暂停、结束等。 2. 蛇的设计: - 蛇的身体:由一系列相连的方块组成,每个方块代表蛇的一个身体部分。 - 蛇的移动:根据玩家的输入控制蛇的移动方向,蛇每次移动一个方块的距离。 - 蛇的生长:当蛇吃到食物时,蛇的身体长度增加一个方块。 3. 食物的设计: - 食物的位置:随机生成在游戏区域内的一个空白位置。 - 食物的消失与生成:当蛇吃到食物后,食物消失并重新生成在另一个位置。 4. 碰撞检测: - 蛇与自身的碰撞:当蛇的头部与身体的其他部分重叠时,游戏结束。 - 蛇与边界的碰撞:当蛇的头部碰到游戏区域的边界时,游戏结束。 - 蛇与食物的碰撞:当蛇的头部与食物重叠时,蛇的身体增长,并生成新的食物。 5. 游戏控制: - 开始游戏:玩家点击开始按钮或者按下空格键开始游戏。 - 暂停游戏:玩家点击暂停按钮或者按下空格键暂停游戏。 - 结束游戏:当蛇与自身或边界碰撞时,游戏结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值