一个简单的javascript写的贪吃蛇游戏,不精致,但是可以玩。。。
哈哈。 我的记录是82。
代码:
DIRECTION = {
left : 37,
top : 38,
right : 39,
bottom : 40,
isAntiDirection : function(dir1, dir2) {
if (dir1 == dir2) {
return false;
} // same direction
return (dir1 + dir2) % 2 == 0;
}
}
var LAYOUT = {
span : 30,
cellWidth :14,
offset_y : 120,
offset_x : 0
};
/**
*
* @param {}
* span
* @param {}
* delay
*/
function Site(span, delay) {
this.span = span;
this.delay = delay;
this.cells = [];
this.targetCell = undefined;
// Add event listener for top/right/bottom/left key pressing ...
document.addEventListener("keypress", function(event) {
if (event.charCode == 119) {
if (site.delay > 20) {
site.delay = site.delay - 20;
window.clearInterval(oTimer);
// reset interval
oTimer = setInterval("site.snake.run()", site.delay);
}
} else if (event.charCode == 115) {
site.delay = site.delay + 20;
window.clearInterval(oTimer);
// reset interval
oTimer = setInterval("site.snake.run()", site.delay);
}else {
if (site && site.snake) {
site.snake.move(event.keyCode);
}
}
}, true);
}
Site.prototype = {
createSite : function(container) {
for (var i = 0; i < this.span; i++) {
this.cells[i] = [];
for (var j = 0; j < this.span; j++) {
var cell = document.createElement('div');
cell.id = "cell_" + j + "_" + i;
cell.className = "cell";
cell.cell_i = i;
cell.cell_j = j;
cell.style.left = LAYOUT.offset_x + LAYOUT.cellWidth * j;
cell.style.top = LAYOUT.offset_y + LAYOUT.cellWidth * i;
container.appendChild(cell);
this.cells[i][j] = cell;
}
}
},
clean : function() {
for (var i = 0; i < this.cells.length; i++) {
var cell_i = this.cells[i];
for (var j = 0; j < cell_i.length; j++) {
var cell = cell_i[j];
this.markNotSnakeCell(cell);
}
}
},
randomSnakeCell : function() {
var cell = this.randomCell();
while (this.isInSnake(cell)) {
cell = this.randomCell();
}
// Make target cell
this.targetCell = cell;
this.markTargetCell(cell);
},
randomCell : function() {
var i = Math.floor(Math.random() * (this.span - 1));
var j = Math.floor(Math.random() * (this.span - 1));
return this.getCell(i, j);
},
getCell : function(i, j) {
return this.cells[i][j];
},
markTargetCell : function(cell) {
cell.className = 'targer_cell';
},
isSnakeCell : function(cell) {
return cell.className == 'snake';
},
isTargetCell : function(cell) {
return this.targetCell.id == cell.id;
},
isInSnake : function(cell) {
return this.snake.isInSnakeBody(cell);
},
markSnakeCell : function(cell) {
if (cell.className != "snake") {
cell.className = "snake";
}
},
markNotSnakeCell : function(cell) {
if (cell.className != "cell") {
cell.className = "cell";
}
}
};
/*
* Mock the 'Stack' structure
*/
function Snake(init) {
this.init = init;
this.data = [];
this.direction = DIRECTION.bottom;
this.eatListeners = [];
this.eatListeners[0] = function() {
if (site) {
site.randomSnakeCell();
}
}
this.eatListeners[1] = function() {
if (site) {
document.getElementById("snake_number").innerHTML = site.snake.data.length;
}
}
this.gameOverListeners = [];
this.gameOverListeners[0] = function(snake) {
if (oTimer) {
window.clearInterval(oTimer);
}
alert("Game over! " + snake.data.length);
}
}
Snake.prototype = {
/**
* Append a snake cell to snake
*
* @param {}
* element
*/
append : function(element) {
this.data[this.data.length] = element;
this.markSnakeCell(element);
},
/**
* Slide on site, the snake length is not changed.
*
* @param {}
* element
* @return {The snake tail removed from snake}
*/
slide : function(element) {
this.markSnakeCell(element);
var temp = [];
for (var i = 1; i < this.data.length; i++) {
temp[i - 1] = this.data[i];
}
temp[temp.length] = element;
var tail = this.data[0];
this.markNotSnakeCell(tail);
this.data = temp;
return tail;
},
/**
* Move one cell accord given direction.
*
* @param {top/right/bottom/left}
* keyCode
*/
move : function(keyCode) {
// Negative direction is not allow.
if (DIRECTION.isAntiDirection(this.direction, keyCode)) {
return;
}
var head = this.data[this.data.length - 1];
var i = head.cell_i;
var j = head.cell_j;
var changeDirection = true;
switch (keyCode) {
case DIRECTION.left :
j = j - 1 < 0 ? site.span - 1 : j - 1;
break;
case DIRECTION.top :
i = i - 1 < 0 ? site.span - 1 : i - 1;
break;
case DIRECTION.right :
j = j + 1 < site.span ? j + 1 : 0;
break;
case DIRECTION.bottom :
i = i + 1 < site.span ? i + 1 : 0;
break;
default :
changeDirection = false;
}
// find next cell
var cell = site.getCell(i, j);
if (this.isInSnakeBody(cell)) {
// If next cell is already exist in snake, game over.
if (this.gameOverListeners) {
for (var i = 0; i < this.gameOverListeners.length; i++) {
this.gameOverListeners[i](this);
}
}
}
if (site.isTargetCell(cell)) {
this.append(cell);
// Eat a cell. Fire eat listener. Here call Site to generate a
// new target cell.
if (this.eatListeners && this.eatListeners.length > 0) {
for (var l = 0; l < this.eatListeners.length; l++) {
this.eatListeners[l]();
}
}
} else {
this.slide(cell);
}
if (changeDirection) {
// record the current direction
this.direction = keyCode;
}
},
/**
* Alias for 'move' method.
*/
run : function() {
this.move(this.direction);
},
prepare : function() {
for (var i = 0; i < this.init; i++) {
this.append(site.getCell(i, 0));
}
},
markSnakeCell : function(cell) {
this.site.markSnakeCell(cell);
},
markNotSnakeCell : function(cell) {
this.site.markNotSnakeCell(cell);
},
length : function() {
return this.data.length;
},
isInSnakeBody : function(cell) {
for (var i = 0; i < this.data.length; i++) {
var snakeCell = this.data[i];
if (snakeCell.id == cell.id) {
return true;
}
}
}
};
function layout(event) {
var container = document.getElementById('site');
var width_offset = (window.outerWidth - LAYOUT.cellWidth * LAYOUT.span) / 2;
LAYOUT.offset_x = width_offset;
site = new Site(LAYOUT.span, 200);
site.createSite(container);
}
function start(event) {
site.clean();
var snake = new Snake(3);
snake.site = site;
snake.prepare();
site.snake = snake;
oTimer = setInterval("site.snake.run()", site.delay);
site.randomSnakeCell();
document.getElementById("snake_number").innerHTML = site.snake.data.length;
}
另外是一个html文件,css的定义在里面,
<html>
<head>
<style type="text/css">
body {
font-family: Impact;
}
.cell {
background-color: blue;
width: 20px;
height: 20px;
margin: 0px;
padding: 0px;
position: absolute;
border: thin solid red;
}
.snake {
background-color: yellow;
width: 20px;
height: 20px;
margin: 0px;
padding: 0px;
position: absolute;
border: thin solid rgb(200, 100, 20);
}
.targer_cell {
background-color: red;
width: 20px;
height: 20px;
margin: 0px;
padding: 0px;
position: absolute;
border: thin solid rgb(200, 100, 20);
}
.toolbar {
text-align:center;
}
p {
color: red;
align: center;
}
</style>
<script type="text/javascript" src="snake.js"></script>
<title>贪吃蛇</title>
</head>
<body onload="layout();">
<h2 align="center">贪吃蛇 !!!</h2>
<div id="toolbar" class="toolbar">
<p>控制:上,下,左,右 加速:w 减速:s</p>
<a href="javascript:void(0);" onclick="start();" >Start</a>
</div>
<div id="site"></div>
<div id="record">
<p>Now record: <span id="snake_number" style="color:purple">3</span></p>
</div>
</body>
</html>
慢慢把他整精致点。。。
- 大小: 13 KB
分享到:
相关推荐
JavaScript贪吃蛇小游戏是一款基于网页的互动娱乐项目,利用JavaScript编程语言实现。JavaScript是一种轻量级的解释型编程语言,广泛应用于网页和网络应用开发,它允许在浏览器端执行代码,为用户提供动态交互的体验...
【JavaScript贪吃蛇游戏详解】 JavaScript,作为网页开发中的重要脚本语言,具有广泛的用途,不仅可以处理用户交互,还能创建动态、有趣的游戏。本篇将深入解析基于JavaScript编写的贪吃蛇游戏,帮助你理解其背后的...
JavaScript贪吃蛇游戏是一款经典的基于Web的休闲游戏,利用JavaScript编程语言实现。在这个游戏中,玩家控制一条蛇在网格中移动,通过吃掉食物来增长蛇的长度,同时避开蛇身,因为碰到自身或边界会导致游戏结束。...
JavaScript贪吃蛇是一款基于网页的经典小游戏,利用JavaScript、jQuery等技术实现。JavaScript是浏览器端的主要脚本语言,负责处理游戏的逻辑和用户交互,而jQuery则简化了DOM操作和事件处理,让代码更加简洁易懂。 ...
瞎写的,很多功能没实现,比如暂停开始,本来想整合到一起
javascript贪吃蛇游戏,欢迎下载!
JavaScript贪吃蛇是一款基于网页的经典小游戏,通过JavaScript编程语言实现。这款游戏的核心原理是利用JavaScript的事件监听、定时器和数组操作来控制蛇的移动、食物的生成以及碰撞检测。下面我们将详细探讨这些知识...
JavaScript贪吃蛇小游戏是一款利用JavaScript编程语言开发的互动娱乐项目,它基于HTML页面展示游戏界面。这个小游戏的设计目的是为了帮助开发者提升JavaScript技能,同时提供一个有趣的学习和交流平台。在这个游戏中...
将上述逻辑整合到一起,一个完整的JavaScript贪吃蛇游戏大致如下: ```javascript // 初始化 // ... document.addEventListener('keydown', (event) => { // ... }); function gameLoop() { // ... ...
在这个贪吃蛇游戏中,JavaScript主要负责以下功能: 1. **初始化游戏状态**:定义蛇的位置、方向、长度,以及食物的位置。 2. **事件监听**:监听用户键盘输入,根据按键改变蛇的方向。 3. **游戏逻辑**:每帧更新...
【HTML+JavaScript贪吃蛇原创】是一个经典的网页游戏实现,主要利用HTML作为页面结构,JavaScript进行动态逻辑处理,实现了一款可自定义修改的贪吃蛇游戏。这个游戏的基础原理是利用用户输入控制蛇的移动,当蛇吃到...
JavaScript贪吃蛇小游戏是一款经典的基于Web的实现,它利用了JavaScript语言的核心特性,尤其是面向对象编程的概念,为前端初学者提供了很好的实践平台。在这款游戏中,玩家通过控制蛇的移动来吃食物,每次吃到食物...
JavaScript贪吃蛇游戏是一款经典的基于网页的休闲游戏,利用HTML、CSS和JavaScript技术实现。HTML负责构建游戏的基础结构,CSS用于美化游戏界面,而JavaScript则是游戏的核心,处理游戏逻辑、用户交互以及动态更新...
JavaScript贪吃蛇与2048是两个非常受欢迎的基于浏览器的娱乐项目,它们都是利用JavaScript这门编程语言实现的。下面将详细讲解这两个项目的实现原理、涉及的技术点以及如何进行开发。 首先,我们来看JavaScript...
JavaScript贪吃蛇是一款基于面向对象编程的经典小游戏,它利用了HTML、CSS和JavaScript技术来实现。在这个项目中,我们将深入探讨JavaScript的面向对象特性以及如何应用于游戏开发。 首先,JavaScript是一种支持...
贪吃蛇是一款经典的电子游戏,它以其简单而有趣的游戏机制吸引了无数玩家。...本文将详细介绍如何利用这两种技术来创建一个贪吃蛇游戏。...不断学习和实践,可以让你的HTML+JavaScript贪吃蛇游戏变得更加完善和有趣。