首页 > 编程语言 >再读《悟透javascript》之四、贪吃蛇

再读《悟透javascript》之四、贪吃蛇

时间:2022-12-08 10:34:34浏览次数:42  
标签:body function javascript var 贪吃蛇 snake way 之四 newDiv


前言

      贪吃蛇是个很简单的小游戏,但是却很有趣,下面是我用JavaScript写的一个贪吃蛇的代码:

 

 

代码如下: 

 

 

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
<script type="text/javascript">
function //创建单元格
var newDiv = document.createElement("div");
newDiv.style.position = "absolute";
newDiv.style.width = cellWidth + "px";
newDiv.style.height = cellWidth + "px";
newDiv.style.background = "#999933";
newDiv.style.border = "solid 1px #666633";
newDiv.style.top = 100 + cellWidth*y + "px";
newDiv.style.left = document.body.clientWidth/2 - boardWidth/2*cellWidth + x*cellWidth + "px";

document.getElementById("content").appendChild(newDiv);

return newDiv;
}

function //随机产生食物
var foodX = Math.round(Math.random()*(boardWidth-1));
var foodY = Math.round(Math.random()*(boardWidth-1));
for(var i=0; i<snake.body.length; i++){
if(snake.body[i].x==foodX && snake.body[i].y==foodY){
productFood();
return;
}
}
board[foodX][foodY].style.background = "#333300";
board[foodX][foodY].isFood = true;
}

function //移动——计算下一步的显示区域
var newX, newY;
newX = newY = 0;
switch(snake.way){
case "right" : newX = snake.body[0].x < boardWidth-1 ? snake.body[0].x+1 : 0;
newY = snake.body[0].y;
setStyle();
break;

case "left" : newX = snake.body[0].x > 0 ? snake.body[0].x-1 : boardWidth-1;
newY = snake.body[0].y;
setStyle();
break;

case "up" : newX = snake.body[0].x;
newY = snake.body[0].y > 0 ? snake.body[0].y-1 : boardWidth-1;
setStyle();
break;

case "down" : newX = snake.body[0].x;
newY = snake.body[0].y < boardWidth-1 ? snake.body[0].y+1 : 0;
setStyle();
break;
}

function //闭包
for(var i=0; i<snake.body.length; i++){
if(snake.body[i].x==newX && snake.body[i].y==newY){
clearInterval(loop);
alert("游戏结束,你吃掉了自己的身体");
return;
}
}

snake.body.splice(0,0,{x:newX, y:newY});
board[newX][newY].style.background = "#333300";

if(board[newX][newY].isFood){
board[newX][newY].isFood = false;
productFood();
}
else{
var cell = snake.body.pop();
board[cell.x][cell.y].style.background = "#999933";
}
}
}

function //更改区域设置
document.body.focus();
board = null;
boardWidth = val;
snake.body = [{x:0, y:0}];
snake.way = "left";
clearInterval(loop);
main();
}

function //更改速度设置
document.body.focus();
board = null;
snake.moveSpeed = val;
snake.body = [{x:0, y:0}];
snake.way = "left";
clearInterval(loop);
main();
}

var //单元格宽度高度
var //区域宽度高度
var //区域
var //蛇
body:[{x:0, y:0}],
way:"left",
moveSpeed:500
};
var //循环

function main(){
//清空body
if(document.getElementById("content")){
document.getElementById("content").innerHTML = "";
}
else{
var newDiv = document.createElement("div");
newDiv.id = "content";
document.body.appendChild(newDiv);
}

//画盘
board = new Array(boardWidth);
for(var x=0; x<boardWidth; x++){
board[x] = new Array(boardWidth);
for(var y=0; y<boardWidth; y++){
(function(){
var _x = x;
var _y = y;
setTimeout(function(){
board[_x][_y] = createCell(_x, _y);
}, _x*69);
})();
}
}

//捕获方向键
document.body.onkeydown = function(){
var oldWay = snake.way;
switch(event.keyCode){
case 38 : snake.way = (snake.way=="left" || snake.way=="right") ? "up" : snake.way; break;
case 40 : snake.way = (snake.way=="left" || snake.way=="right") ? "down" : snake.way; break;
case 37 : snake.way = (snake.way=="up" || snake.way=="down") ? "left" : snake.way; break;
case 39 : snake.way = (snake.way=="up" || snake.way=="down") ? "right" : snake.way; break;
}

if(oldWay != snake.way) move();
}

//延迟开始,等待加载
setTimeout(function(){
productFood();
loop = setInterval(function(){
move();
}, snake.moveSpeed);
}, boardWidth*100);
}

window.onload = main;
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="select">
20*20:<input id="Radio1" name="boardOnly" onclick="changeBoard(20)" checked="checked" type="radio" /><br />
30*30:<input id="Radio2" name="boardOnly" onclick="changeBoard(30)" type="radio" /><br />
<br /><br />
拖拉机司机:<input id="Radio4" name="speedOnly" onclick="changeSpeed(300)" checked="checked" type="radio" /><br />
汽车司机:<input id="Radio5" name="speedOnly" onclick="changeSpeed(200)" type="radio" /><br />
火车司机:<input id="Radio6" name="speedOnly" onclick="changeSpeed(100)" type="radio" /><br />
飞机司机:<input id="Radio7" name="speedOnly" onclick="changeSpeed(30)" type="radio" /><br />
飞船司机:<input id="Radio8" name="speedOnly" onclick="changeSpeed(10)" type="radio" /><br />
</div>
</form>
</body>
</html>

标签:body,function,javascript,var,贪吃蛇,snake,way,之四,newDiv
From: https://blog.51cto.com/u_15906220/5920655

相关文章

  • 《悟透javascript》学习笔记:一、前言
    《悟透JavaScript》学习笔记  这是一本很形象生动的书,使我们可以更深地了解了JavaScript。 引言   编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就......
  • 《悟透javascript》学习笔记:二、回归简单
    引言 要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript就......
  • 《悟透javascript》学习笔记:三、似类却不是类
    引言 JavaScript没有“类”的概念!这让很多学习过高级语言的人感到很不爽,其实比之于C语言又如何呢?显然JavaScript要比C语言好用很多。 不废话,上代码 <scriptlanguage="j......
  • 再读《悟透javascript》之三、甘露模型
    前言     甘露模型是用于开发基于javascript的类库的,通过它,我们可以以类似C#等面向对象的语言式的模式来开发javascript类库,这将使你的javascript代码变得清晰有条理......
  • JavaScript:代码细节和良好编码习惯
    这些细节,与语法无关,仅仅是编写代码时需要注意的最最基本的细节和一些良好编码习惯。注释代码注释代码分为单行注释和多行注释,如下所示:严格区分大小写JS的代码时严格区......
  • JavaScript:严格模式"use strict"
    因为历史遗留问题,JS其实存在很多feature,以及兼容性问题;所以JS在ES5之后,新增了一个严格模式,以区别于普通模式,用来激活新的特性,使得某些代码的执行准确无误;如何开启严格模......
  • JavaScript:是一种什么样的编程语言?
    有关JavaScript的发展历程,百度百科上已经说得很清楚了,这里不赘述,只是想谈一下我刚刚接触JS的一些感触。作为后端java开发者,初次学习JS的时候,真的觉得JS非常的不严谨,很混乱......
  • JavaScript:代码应该编写在哪里?
    我们可以将JS的代码,编写在三个地方。但是无论编写在哪里,最后它都会嵌入进网页代码中,被浏览器执行。编写在script标签中我们可以直接在HTML的script标签中,编写大段JS代码......
  • JavaScript:jQuery类库
    目录jQuery类库一、jQuery简介1.特点2.使用jQuery的不同方式3.jQuery底层本质4.标签对象与jQuery对象二、jQuery查找标签1.基本选择器2.组合选择器3.层级选择器4.属性选择......
  • JavaScript(三)
    ❤️‍JavaScriptjQuery查找标签jQuery节点操作jQuery事件绑定bootstrap页面框架❤️‍jQuery查找标签......