用Table做了个"贪吃蛇",有兴趣的来看看
<body></body>
<SCRIPT LANGUAGE="JavaScript">
<!--
/*
-- Author: Harry
-- Date : 03/23/2005
-- Function: 游戏"贪吃蛇"
-- Email: harrychen66@126.com
-- Remark: 由cell的status1和status2属性来决定哪些单元格是蛇,哪些是食物
*/
var r = 20; // 表格的行数
var c = 20; // 表格的列数
// r和c值越大初始化的时间会越长
var cWidth = 5; // 单元格的宽度
var arr = new Array(); // 用来放蛇的数组
var initLen = 5; // 蛇的初始长度
var left = 37, up = 38, right = 39, down = 40;
var tb = null; // 蛇爬动的table
var cellList = null;
var forward = right; // 蛇爬动的方向
var foodInterval = 1000; // 出现食物的时间间隔
var snakeColor = "#333333"; // 蛇的颜色
var foodColor = "#ff0000"; // 食物的颜色
var speed = 150; // 蛇每爬一个单元格所需要的时间,单位:毫秒
document.body.onload = function(){
fCreateTable(); // 建立一个给蛇爬行的table
initPara(); // 初始化单元格的属性
fMoveTimer(); // 开始爬行
fAddFoodTimer(); // 随机出现一个食物
}
// 由用户按下不同的四个方向建来重新赋值变量forward
document.onkeydown = function(){
switch(event.keyCode){
case left:
if(forward == left || forward == right) return; else forward = left; break;
case right:
if(forward == left || forward == right) return; else forward = right; break;
case up:
if(forward == up || forward == down) return; else forward = up; break;
case down:
if(forward == up || forward == down) return; else forward = down; break;
}
}
function fCreateTable(){
var tb = document.createElement("<table cellspacing=0 cellpadding=0>");
tb.style.border = "1px solid #cccccc";
tb.id = "myTb0";
for(var i=0;i<r;i++){
var row = tb.insertRow(i);
for(var j=0;j<c;j++){
var cell = row.insertCell(j)
cell.innerHTML = "";
cell.style.width = cWidth + "px";
cell.style.height = cWidth + "px";
}
}
document.body.appendChild(tb);
}
// 初始化单元格,将所有的cell加两个属性status1和status2,并赋值false, 并将其中的一些cell的status1改为true, 成为蛇成员
function initPara(){
tb = document.getElementById("myTb0")
cellList = tb.getElementsByTagName("TD");
for(var i=0;i<cellList.length;i++){
cellList[i].status1 = false;
cellList[i].status2 = false;
}
for(var i=0;i<initLen;i++){
arr[i] = tb.rows[1].cells[initLen-i-1];
arr[i].status1 = true;
}
}
// 根据移动的方向, 加入蛇的新成员, 同时去掉最后一个成员,就形成"移动"
function fMoveNext(){
var row = arr[0].parentElement.rowIndex;
var cell = arr[0].cellIndex;
var newRow = 0, newCell = 0;
if(forward == right) {newRow = row;newCell = cell+1}
if(forward == left) {newRow = row;newCell = cell-1}
if(forward == up) {newRow = row-1;newCell = cell}
if(forward == down) {newRow = row+1;newCell = cell}
if(newRow == r || newRow <0 || newCell == c || newCell <0){
fFail();
return;
}
var nextEl = document.getElementById("myTb0").rows[newRow].cells[newCell]
// 下一个cell是蛇的成员
if(nextEl.status1){
fFail();
return;
}
// 下一个cell是食物
if(nextEl.status2){
nextEl.status2 = false;
fAddFoodTimer();
fConnChild();
}
nextEl.status1 = true;
nextEl.bgColor = snakeColor;
arr.unshift(nextEl); // 增加新成员
arr[arr.length-1].status1 = false;
arr[arr.length-1].bgColor = "#ffffff";
arr.pop(); // 去掉最后一个成员
}
// 吃掉一个食物后, 再最后增加一个新成员
function fConnChild(){
var newEl = null;
var row = arr[arr.length-1].parentElement.rowIndex;
var cell = arr[arr.length-1].cellIndex;
// 增加的顺序优先:左,右,上,下
if(cell>0 && newEl == null) newEl = (!tb.rows[row].cells[cell-1].status1)?tb.rows[row].cells[cell-1]:null;
if(cell<(c-1) && newEl == null) newEl = (!tb.rows[row].cells[cell+1].status1)?tb.rows[row].cells[cell+1]:null;
if(row>0 && newEl == null) newEl = (!tb.rows[row-1].cells[cell].status1)?tb.rows[row-1].cells[cell]:null;
if(row<(r-1) && newEl == null) newEl = (!tb.rows[row+1].cells[cell].status1)?tb.rows[row+1].cells[cell]:null;
newEl.status1 = true;
newEl.bgColor = snakeColor;
arr.push(newEl);
}
function fMoveTimer(){
t = window.setInterval("fMoveNext()",speed);
}
function fFail(){
window.clearInterval(t);
alert("fail.");
}
function fAddFoodTimer(){
window.setTimeout("fAddFood()",foodInterval);
}
// 用递归方法随机出现食物
function fAddFood(){
var foodObj = tb.rows[Math.round(Math.random()*(r-1))].cells[Math.round(Math.random()*(c-1))];
// 如果是蛇的成员就继续找食物
if(foodObj.status1){
fAddFood();
}else{
foodObj.status2 = true;
foodObj.bgColor = foodColor;
}
}
//-->
</SCRIPT>