用Table做了个"贪吃蛇",有兴趣的来看看 做的挺好的,就是對連續按 右下左上 時的情況會Fail 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 回复人: zmy0611(zmy) ( ) 信誉:97 做的挺好的,就是對連續按 右下左上 時的情況會Fail右下左上各一难道不死吗?? 回复人: zmy0611(zmy) ( ) 信誉:97 做的挺好的,就是對連續按 右下左上 時的情況會Fail右下左上各一难道不死吗?? 我改進了一下你的做法:<body></body><SCRIPT LANGUAGE="JavaScript"><!--//**********************Addfunction Snake(RowIndex,ColIndex){ this.RowIndex = RowIndex; this.ColIndex = ColIndex; this.bgColor = snakeColor;}//**********************///* -- Author: Harry -- Date : 03/23/2005 -- Function: 游戏"贪吃蛇" -- Email: [email protected] -- Re: 由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; // 蛇爬动的tablevar 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(); // 随机出现一个食物}// 由用户按下不同的四个方向建来重新赋值变量forwarddocument.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] = new Snake(1,initLen-i-1); //**********************Add //arr[i] = tb.rows[1].cells[initLen-i-1]; //arr[i].status1 = true; }}// 根据移动的方向, 加入蛇的新成员, 同时去掉最后一个成员,就形成"移动"function fMoveNext(){ var row = arr[0].RowIndex; var cell = arr[0].ColIndex;// 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; } //**********************Add var nextEl = new Snake(newRow,newCell); ReSet(); if(CheckIsFood(nextEl)) { fAddFoodTimer(); fConnChild(); } arr.unshift(nextEl); arr.pop(); ReDraw(); //**********************///* 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(); // 去掉最后一个成员*/}//**********************Addfunction CheckIsFood(nextEl){ var cell = tb.rows[nextEl.RowIndex].cells[nextEl.ColIndex]; if(typeof(cell)=="object" && cell.status2) { cell.status2 = false; return true; } return false;}function ReSet(){ for(var i = 0; i < arr.length; i++) { var cell = tb.rows[arr[i].RowIndex].cells[arr[i].ColIndex]; cell.bgColor = "#ffffff"; }}function ReDraw(){ for(var i = 0; i < arr.length; i++) { var cell = tb.rows[arr[i].RowIndex].cells[arr[i].ColIndex]; cell.bgColor = arr[i].bgColor; }}//**********************//// 吃掉一个食物后, 再最后增加一个新成员function fConnChild(){ var newEl = null; //**********************Add var row = arr[arr.length-1].RowIndex; var cell = arr[arr.length-1].ColIndex; if(cell>0 && newEl == null) newEl = (!tb.rows[row].cells[cell-1].status1)?new Snake(row,cell-1):null; if(cell<(c-1) && newEl == null) newEl = (!tb.rows[row].cells[cell+1].status1)?new Snake(row,cell+1):null; if(row>0 && newEl == null) newEl = (!tb.rows[row-1].cells[cell].status1)?new Snake(row-1,cell):null; if(row<(r-1) && newEl == null) newEl = (!tb.rows[row+1].cells[cell].status1)?new Snake(row+1,cell):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> zmy0611(zmy) 你的方法是在arr数组里保存Snake类型的蛇,然后再从里面的属性重新描绘cell,这样用对象的原理确实可以使思路更加清晰,我是直接将cell对象放到数组,不过你改了之后..蛇头居然可以穿过蛇身~~~ 挺好的 以前玩的游戏 蛇头是不能和蛇身遇到的 否则fail //改进了一下,可以“重新开始”了,不用死了就刷页面了//----------------------------------<body></body><SCRIPT LANGUAGE="JavaScript"><!--/*--Author:Harry--Date :03/23/2005--Function:游戏"贪吃蛇"--Email:[email protected]--Re:由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;// 蛇爬动的tablevar cellList = null;var forward = right;//蛇爬动的方向var foodInterval = 1000;// 出现食物的时间间隔var snakeColor = "#333333";//蛇的颜色var foodColor = "#ff0000";// 食物的颜色var speed = 150;//蛇每爬一个单元格所需要的时间,单位:毫秒function startSnake(){if(startsnake.value=="重新开始"){ document.body.removeChild(tb); forward=right;}fCreateTable();// 建立一个给蛇爬行的table initPara();// 初始化单元格的属性fMoveTimer();// 开始爬行fAddFoodTimer();// 随机出现一个食物}// 由用户按下不同的四个方向建来重新赋值变量forwarddocument.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);startsnake.value="重新开始"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><input type="button" name="startsnake" value="开始" onClick="startSnake()"> //在 IDOICAN(酷酷す旋风)的基础上增加了吃食物会加速<body></body><SCRIPT LANGUAGE="JavaScript"><!--/*--Author:Harry--Date :03/23/2005--Function:游戏"贪吃蛇"--Email:[email protected]--Re:由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;// 蛇爬动的tablevar cellList = null;var forward = right;//蛇爬动的方向var foodInterval = 1000;// 出现食物的时间间隔var snakeColor = "#333333";//蛇的颜色var foodColor = "#ff0000";// 食物的颜色var speed = 150;//蛇每爬一个单元格所需要的时间,单位:毫秒var t;//蛇移动的记时器function startSnake(){if(startsnake.value=="重新开始"){ document.body.removeChild(tb); forward=right;}fCreateTable();// 建立一个给蛇爬行的table initPara();// 初始化单元格的属性fMoveTimer();// 开始爬行fAddFoodTimer();// 随机出现一个食物}// 由用户按下不同的四个方向建来重新赋值变量forwarddocument.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(); if(speed>30){//吃一个食物,速度就增加 speed-=10; //重新设置记时器 clearTimeout(t); fMoveTimer(); }}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);startsnake.value="重新开始"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><input type="button" name="startsnake" value="开始" onClick="startSnake()"> <body></body><SCRIPT LANGUAGE="JavaScript"><!--/* -- Author: Harry -- Date : 03/23/2005 -- Function: 游戏"贪吃蛇" -- Email: [email protected] -- Re: 由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; // 蛇爬动的tablevar cellList = null; var forward = right; // 蛇爬动的方向var foodInterval = 1000; // 出现食物的时间间隔var snakeColor = "#333333"; // 蛇的颜色var foodColor = "#ff0000"; // 食物的颜色var speed = 350; // 蛇每爬一个单元格所需要的时间,单位:毫秒var t = null;var foodAppear = false; // true时table里有食物// --------------------- 新增Options 变量 -----------------------var speedOptionMax = 1000; // select控件最大值var speedOptionMin = 50; // select控件最小值var speedOptionInterval = 50; // select控件的增长量var speedIsFaster = false; // 是否选了越来越快var speedIsFasterInterval = 50;// 越来越快的增长量var acrossBody = false; // 是否可以穿过蛇身var acrossWall = false; // 是否可以穿墙// ---------------------------------------------------------------document.body.onload = function(){ fCreateOption(); // 添加选项 fCreateTable(); // 建立一个给蛇爬行的table initPara(); // 初始化单元格的属性 //fMoveTimer(); // 开始爬行 //fAddFoodTimer(); // 随机出现一个食物}// 由用户按下不同的四个方向建来重新赋值变量forwarddocument.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"); foodAppear = false; forward = right; for(var i=0;i<cellList.length;i++){ cellList[i].status1 = false; cellList[i].status2 = false; cellList[i].bgColor = "#ffffff"; } arr = new Array(); 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(acrossWall){ if(newRow == r) newRow=0; if(newRow < 0) newRow=r-1; if(newCell == c) newCell=0; if(newCell < 0) newCell=c-1; }else{ if(newRow == r || newRow <0 || newCell == c || newCell <0){ fFail(); return; } } var nextEl = document.getElementById("myTb0").rows[newRow].cells[newCell] // 下一个cell是蛇的成员 if(nextEl.status1 && !acrossBody){ fFail(); return; } // 下一个cell是食物 if(nextEl.status2){ foodAppear = false; nextEl.status2 = false; fAddFoodTimer(); fConnChild(); if(speed>10 && speedIsFaster && (speed - speedIsFasterInterval)>0) {speed -= speedIsFasterInterval; fResetSpeed();} } 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."); initPara();}function fAddFoodTimer(){ window.setTimeout("fAddFood()",foodInterval); foodAppear = true;}// 用递归方法随机出现食物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; }} function fResetSpeed(){ window.clearInterval(t); fMoveTimer();}function fStart(){ if(t) window.clearInterval(t); fMoveTimer(); // 开始爬行 if(!foodAppear) fAddFoodTimer(); // 随机出现一个食物}function fPause(){ if(t) window.clearInterval(t);}function fCreateOption(){ var dvOptions = document.createElement("<div width='300'>"); dvOptions.style.border = "1px solid #0000ff"; dvOptions.style.padding = "5px"; dvOptions.style.margin = "5px 0px"; document.body.appendChild(dvOptions); // create 速度选项 var selSpeedOption = document.createElement("<select id='speedOption' onchange='speed=this.value;fResetSpeed();'>"); for(var i=speedOptionMax;i>=speedOptionMin;i-=speedOptionInterval){ var o = document.createElement("option"); o.value = i; o.text = i + "ms"; selSpeedOption.options.add(o); } selSpeedOption.value = speed; dvOptions.appendChild(selSpeedOption); selSpeedOption.insertAdjacentHTML("beforeBegin","<span style='font-size:12px;margin-right:3px'>速度</span>"); // create 速度越来越快选项 var chkIsFaster = document.createElement("<input id='chkIsFaster' type='checkbox' onclick='speedIsFaster=this.checked'>"); dvOptions.appendChild(chkIsFaster); chkIsFaster.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'>越来越快</span>"); // create 是否可以穿过蛇身选项 var chkAcrossBody = document.createElement("<input id='chkAcrossBody' type='checkbox' onclick='acrossBody=this.checked'>"); dvOptions.appendChild(chkAcrossBody); chkAcrossBody.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'>是否可以穿过蛇身</span>"); // create 是否可以穿墙选项 var chkAcrossWall = document.createElement("<input id='chkAcrossWall' type='checkbox' onclick='acrossWall=this.checked'>"); dvOptions.appendChild(chkAcrossWall); chkAcrossWall.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'>是否可以穿墙</span>"); // create 开始 var btnStart = document.createElement("<input id='btnStart' type='button' value='开始' onclick='fStart()'>"); dvOptions.appendChild(btnStart); btnStart.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'></span>"); // 暂停 var btnPause = document.createElement("<input id='btnPause' type='button' value='暂停' onclick='fPause()'>"); dvOptions.appendChild(btnPause); btnPause.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'></span>"); // 重新开始 var btnRestart = document.createElement("<input id='btnRestart' type='button' value='重新开始' onclick='initPara();fStart();'>"); dvOptions.appendChild(btnRestart); btnRestart.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'></span>");}//--></SCRIPT> 这个游戏不算很复杂吧? 发现原来有更加简单的方法,不需要用数组保存蛇,只需要增加两个变量保存蛇头和蛇尾就够了.现在正在想通过用htc重构table对象,实现一些更复杂的功能或者简化一些操作,例如在cell增加一个row的属性就不需要每次通过parentElement.rowIndex来找它的行数,到时候打算用这种table做个excel模拟器,因为之前写过一段时间的excel vba,如果可能在table的基础上建造如excel application的sheet,range,cell,row,column等对象,那么功能会更加强大... 我试了一下,真是太棒了,比专业的游戏版本好玩多了,我想最主要的是楼主太赋有有成就感了 本人不太喜欢玩游戏,但是用JAVASCRIPT编出来的就比其他专业的好玩多了,就是因为有这种交互式玩法,真让人羡慕楼主的技术,太高了…… jquery插件,最后一句:$.data(this, 'carousel', obj); 是什么意思? innerhtml 不可在添加事件吗? onkeyup,onblur都无法执行 动态级联错误 js下载文件不打开 如何单击子div时而不响应父div的单击事件 一段js的调用 提取iframe,怎么提取? 有没有跟光标移动相关的事件处理函数? 循环的时间控制 父窗口怎样对弹出的子窗口提交信息? 如何在鼠标事件中,改变TD里文字的大小呢? javescript难题
做的挺好的,就是對連續按 右下左上 時的情況會Fail右下左上各一难道不死吗??
做的挺好的,就是對連續按 右下左上 時的情況會Fail右下左上各一难道不死吗??
<body></body>
<SCRIPT LANGUAGE="JavaScript">
<!--
//**********************Add
function Snake(RowIndex,ColIndex)
{
this.RowIndex = RowIndex;
this.ColIndex = ColIndex;
this.bgColor = snakeColor;
}
//**********************//
/*
-- Author: Harry
-- Date : 03/23/2005
-- Function: 游戏"贪吃蛇"
-- Email: [email protected]
-- Re: 由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] = new Snake(1,initLen-i-1); //**********************Add
//arr[i] = tb.rows[1].cells[initLen-i-1];
//arr[i].status1 = true;
}
}
// 根据移动的方向, 加入蛇的新成员, 同时去掉最后一个成员,就形成"移动"
function fMoveNext(){
var row = arr[0].RowIndex;
var cell = arr[0].ColIndex;
// 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;
}
//**********************Add
var nextEl = new Snake(newRow,newCell);
ReSet();
if(CheckIsFood(nextEl))
{
fAddFoodTimer();
fConnChild();
}
arr.unshift(nextEl);
arr.pop();
ReDraw();
//**********************///*
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(); // 去掉最后一个成员
*/
}
//**********************Add
function CheckIsFood(nextEl)
{
var cell = tb.rows[nextEl.RowIndex].cells[nextEl.ColIndex];
if(typeof(cell)=="object" && cell.status2)
{
cell.status2 = false;
return true;
}
return false;
}
function ReSet()
{
for(var i = 0; i < arr.length; i++)
{
var cell = tb.rows[arr[i].RowIndex].cells[arr[i].ColIndex];
cell.bgColor = "#ffffff";
}
}
function ReDraw()
{
for(var i = 0; i < arr.length; i++)
{
var cell = tb.rows[arr[i].RowIndex].cells[arr[i].ColIndex];
cell.bgColor = arr[i].bgColor;
}
}
//**********************//// 吃掉一个食物后, 再最后增加一个新成员
function fConnChild(){
var newEl = null; //**********************Add
var row = arr[arr.length-1].RowIndex;
var cell = arr[arr.length-1].ColIndex;
if(cell>0 && newEl == null) newEl = (!tb.rows[row].cells[cell-1].status1)?new Snake(row,cell-1):null;
if(cell<(c-1) && newEl == null) newEl = (!tb.rows[row].cells[cell+1].status1)?new Snake(row,cell+1):null;
if(row>0 && newEl == null) newEl = (!tb.rows[row-1].cells[cell].status1)?new Snake(row-1,cell):null;
if(row<(r-1) && newEl == null) newEl = (!tb.rows[row+1].cells[cell].status1)?new Snake(row+1,cell):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>
//----------------------------------
<body></body>
<SCRIPT LANGUAGE="JavaScript">
<!--
/*
--Author:Harry
--Date :03/23/2005
--Function:游戏"贪吃蛇"
--Email:[email protected]
--Re:由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;//蛇每爬一个单元格所需要的时间,单位:毫秒
function startSnake(){
if(startsnake.value=="重新开始"){
document.body.removeChild(tb);
forward=right;
}
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);
startsnake.value="重新开始"
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>
<input type="button" name="startsnake" value="开始" onClick="startSnake()">
<body></body>
<SCRIPT LANGUAGE="JavaScript">
<!--
/*
--Author:Harry
--Date :03/23/2005
--Function:游戏"贪吃蛇"
--Email:[email protected]
--Re:由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;//蛇每爬一个单元格所需要的时间,单位:毫秒
var t;//蛇移动的记时器
function startSnake(){
if(startsnake.value=="重新开始"){
document.body.removeChild(tb);
forward=right;
}
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();
if(speed>30){//吃一个食物,速度就增加
speed-=10;
//重新设置记时器
clearTimeout(t);
fMoveTimer();
}
}
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);
startsnake.value="重新开始"
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>
<input type="button" name="startsnake" value="开始" onClick="startSnake()">
<SCRIPT LANGUAGE="JavaScript">
<!--
/*
-- Author: Harry
-- Date : 03/23/2005
-- Function: 游戏"贪吃蛇"
-- Email: [email protected]
-- Re: 由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 = 350; // 蛇每爬一个单元格所需要的时间,单位:毫秒
var t = null;
var foodAppear = false; // true时table里有食物
// --------------------- 新增Options 变量 -----------------------
var speedOptionMax = 1000; // select控件最大值
var speedOptionMin = 50; // select控件最小值
var speedOptionInterval = 50; // select控件的增长量
var speedIsFaster = false; // 是否选了越来越快
var speedIsFasterInterval = 50;// 越来越快的增长量
var acrossBody = false; // 是否可以穿过蛇身
var acrossWall = false; // 是否可以穿墙
// ---------------------------------------------------------------document.body.onload = function(){
fCreateOption(); // 添加选项
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");
foodAppear = false;
forward = right;
for(var i=0;i<cellList.length;i++){
cellList[i].status1 = false;
cellList[i].status2 = false;
cellList[i].bgColor = "#ffffff";
}
arr = new Array();
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(acrossWall){
if(newRow == r) newRow=0;
if(newRow < 0) newRow=r-1;
if(newCell == c) newCell=0;
if(newCell < 0) newCell=c-1;
}else{
if(newRow == r || newRow <0 || newCell == c || newCell <0){
fFail();
return;
}
}
var nextEl = document.getElementById("myTb0").rows[newRow].cells[newCell] // 下一个cell是蛇的成员
if(nextEl.status1 && !acrossBody){
fFail();
return;
}
// 下一个cell是食物
if(nextEl.status2){
foodAppear = false;
nextEl.status2 = false;
fAddFoodTimer();
fConnChild();
if(speed>10 && speedIsFaster && (speed - speedIsFasterInterval)>0) {speed -= speedIsFasterInterval; fResetSpeed();}
}
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.");
initPara();
}
function fAddFoodTimer(){
window.setTimeout("fAddFood()",foodInterval);
foodAppear = true;
}// 用递归方法随机出现食物
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;
}
}
window.clearInterval(t);
fMoveTimer();
}
function fStart(){
if(t) window.clearInterval(t);
fMoveTimer(); // 开始爬行
if(!foodAppear) fAddFoodTimer(); // 随机出现一个食物
}
function fPause(){
if(t) window.clearInterval(t);
}
function fCreateOption(){
var dvOptions = document.createElement("<div width='300'>");
dvOptions.style.border = "1px solid #0000ff";
dvOptions.style.padding = "5px";
dvOptions.style.margin = "5px 0px";
document.body.appendChild(dvOptions);
// create 速度选项
var selSpeedOption = document.createElement("<select id='speedOption' onchange='speed=this.value;fResetSpeed();'>");
for(var i=speedOptionMax;i>=speedOptionMin;i-=speedOptionInterval){
var o = document.createElement("option");
o.value = i;
o.text = i + "ms";
selSpeedOption.options.add(o);
}
selSpeedOption.value = speed;
dvOptions.appendChild(selSpeedOption);
selSpeedOption.insertAdjacentHTML("beforeBegin","<span style='font-size:12px;margin-right:3px'>速度</span>"); // create 速度越来越快选项
var chkIsFaster = document.createElement("<input id='chkIsFaster' type='checkbox' onclick='speedIsFaster=this.checked'>");
dvOptions.appendChild(chkIsFaster);
chkIsFaster.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'>越来越快</span>"); // create 是否可以穿过蛇身选项
var chkAcrossBody = document.createElement("<input id='chkAcrossBody' type='checkbox' onclick='acrossBody=this.checked'>");
dvOptions.appendChild(chkAcrossBody);
chkAcrossBody.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'>是否可以穿过蛇身</span>"); // create 是否可以穿墙选项
var chkAcrossWall = document.createElement("<input id='chkAcrossWall' type='checkbox' onclick='acrossWall=this.checked'>");
dvOptions.appendChild(chkAcrossWall);
chkAcrossWall.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'>是否可以穿墙</span>"); // create 开始
var btnStart = document.createElement("<input id='btnStart' type='button' value='开始' onclick='fStart()'>");
dvOptions.appendChild(btnStart);
btnStart.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'></span>"); // 暂停
var btnPause = document.createElement("<input id='btnPause' type='button' value='暂停' onclick='fPause()'>");
dvOptions.appendChild(btnPause);
btnPause.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'></span>"); // 重新开始
var btnRestart = document.createElement("<input id='btnRestart' type='button' value='重新开始' onclick='initPara();fStart();'>");
dvOptions.appendChild(btnRestart);
btnRestart.insertAdjacentHTML("afterEnd","<span style='font-size:12px;margin:3px'></span>");
}
//-->
</SCRIPT>
现在正在想通过用htc重构table对象,实现一些更复杂的功能或者简化一些操作,例如在cell增加一个row的属性就不需要每次通过parentElement.rowIndex来找它的行数,到时候打算用这种table做个excel模拟器,因为之前写过一段时间的excel vba,如果可能在table的基础上建造如excel application的sheet,range,cell,row,column等对象,那么功能会更加强大...
本人不太喜欢玩游戏,但是用JAVASCRIPT编出来的就比其他专业的好玩多了,就是因为有这种交互式玩法,真让人羡慕楼主的技术,太高了……