`
liusu
  • 浏览: 171420 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Javascript贪吃蛇

    博客分类:
  • js
阅读更多
一个简单的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>控制:上,下,左,右     &nbsp;&nbsp; 加速: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
1
1
分享到:
评论
2 楼 liusu 2009-11-30  
不搜不知道,javaeye好多贪吃蛇。

因为转到做前台,得多学点javascrit。 越来越发现javascrit有意思。
1 楼 LK.Bing 2009-11-30  
厉害.....

相关推荐

    JavaScript贪吃蛇小游戏.zip

    JavaScript贪吃蛇小游戏是一款基于网页的互动娱乐项目,利用JavaScript编程语言实现。JavaScript是一种轻量级的解释型编程语言,广泛应用于网页和网络应用开发,它允许在浏览器端执行代码,为用户提供动态交互的体验...

    javascript贪吃蛇(源码)

    【JavaScript贪吃蛇游戏详解】 JavaScript,作为网页开发中的重要脚本语言,具有广泛的用途,不仅可以处理用户交互,还能创建动态、有趣的游戏。本篇将深入解析基于JavaScript编写的贪吃蛇游戏,帮助你理解其背后的...

    Javascript贪吃蛇游戏源码

    JavaScript贪吃蛇游戏是一款经典的基于Web的休闲游戏,利用JavaScript编程语言实现。在这个游戏中,玩家控制一条蛇在网格中移动,通过吃掉食物来增长蛇的长度,同时避开蛇身,因为碰到自身或边界会导致游戏结束。...

    javascript贪吃蛇网页小游戏

    JavaScript贪吃蛇是一款基于网页的经典小游戏,利用JavaScript、jQuery等技术实现。JavaScript是浏览器端的主要脚本语言,负责处理游戏的逻辑和用户交互,而jQuery则简化了DOM操作和事件处理,让代码更加简洁易懂。 ...

    javascript贪吃蛇

    瞎写的,很多功能没实现,比如暂停开始,本来想整合到一起

    javascript贪吃蛇游戏

    javascript贪吃蛇游戏,欢迎下载!

    javaScript贪吃蛇源代码

    JavaScript贪吃蛇是一款基于网页的经典小游戏,通过JavaScript编程语言实现。这款游戏的核心原理是利用JavaScript的事件监听、定时器和数组操作来控制蛇的移动、食物的生成以及碰撞检测。下面我们将详细探讨这些知识...

    javascript贪吃蛇小游戏

    JavaScript贪吃蛇小游戏是一款利用JavaScript编程语言开发的互动娱乐项目,它基于HTML页面展示游戏界面。这个小游戏的设计目的是为了帮助开发者提升JavaScript技能,同时提供一个有趣的学习和交流平台。在这个游戏中...

    javascript开发贪吃蛇游戏

    将上述逻辑整合到一起,一个完整的JavaScript贪吃蛇游戏大致如下: ```javascript // 初始化 // ... document.addEventListener('keydown', (event) =&gt; { // ... }); function gameLoop() { // ... ...

    html+javascript 贪吃蛇(说明详细)

    在这个贪吃蛇游戏中,JavaScript主要负责以下功能: 1. **初始化游戏状态**:定义蛇的位置、方向、长度,以及食物的位置。 2. **事件监听**:监听用户键盘输入,根据按键改变蛇的方向。 3. **游戏逻辑**:每帧更新...

    html+JavaScript贪吃蛇原创(详细说明)

    【HTML+JavaScript贪吃蛇原创】是一个经典的网页游戏实现,主要利用HTML作为页面结构,JavaScript进行动态逻辑处理,实现了一款可自定义修改的贪吃蛇游戏。这个游戏的基础原理是利用用户输入控制蛇的移动,当蛇吃到...

    Javascript贪吃蛇.rar

    JavaScript贪吃蛇小游戏是一款经典的基于Web的实现,它利用了JavaScript语言的核心特性,尤其是面向对象编程的概念,为前端初学者提供了很好的实践平台。在这款游戏中,玩家通过控制蛇的移动来吃食物,每次吃到食物...

    JavaScript贪吃蛇.zip

    JavaScript贪吃蛇游戏是一款经典的基于网页的休闲游戏,利用HTML、CSS和JavaScript技术实现。HTML负责构建游戏的基础结构,CSS用于美化游戏界面,而JavaScript则是游戏的核心,处理游戏逻辑、用户交互以及动态更新...

    javaScript贪吃蛇,2048

    JavaScript贪吃蛇与2048是两个非常受欢迎的基于浏览器的娱乐项目,它们都是利用JavaScript这门编程语言实现的。下面将详细讲解这两个项目的实现原理、涉及的技术点以及如何进行开发。 首先,我们来看JavaScript...

    javascript贪吃蛇(面向对象)

    JavaScript贪吃蛇是一款基于面向对象编程的经典小游戏,它利用了HTML、CSS和JavaScript技术来实现。在这个项目中,我们将深入探讨JavaScript的面向对象特性以及如何应用于游戏开发。 首先,JavaScript是一种支持...

    html+javascript贪吃蛇

    贪吃蛇是一款经典的电子游戏,它以其简单而有趣的游戏机制吸引了无数玩家。...本文将详细介绍如何利用这两种技术来创建一个贪吃蛇游戏。...不断学习和实践,可以让你的HTML+JavaScript贪吃蛇游戏变得更加完善和有趣。

Global site tag (gtag.js) - Google Analytics