做的挺好的,就是對連續按 右下左上 時的情況會Fail

解决方案 »

  1.   

    回复人: zmy0611(zmy) ( ) 信誉:97  
    做的挺好的,就是對連續按 右下左上 時的情況會Fail右下左上各一难道不死吗??
      

  2.   

    回复人: zmy0611(zmy) ( ) 信誉:97  
    做的挺好的,就是對連續按 右下左上 時的情況會Fail右下左上各一难道不死吗??
      

  3.   

    我改進了一下你的做法:
    <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>
      

  4.   

    zmy0611(zmy) 你的方法是在arr数组里保存Snake类型的蛇,然后再从里面的属性重新描绘cell,这样用对象的原理确实可以使思路更加清晰,我是直接将cell对象放到数组,不过你改了之后..蛇头居然可以穿过蛇身~~~
      

  5.   

    挺好的  以前玩的游戏 蛇头是不能和蛇身遇到的 否则fail
      

  6.   

    //改进了一下,可以“重新开始”了,不用死了就刷页面了
    //----------------------------------
    <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()">
      

  7.   

    //在 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;// 蛇爬动的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()">
      

  8.   

    <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 = 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;
    }
    }
      

  9.   

    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>
      

  10.   

    这个游戏不算很复杂吧? 发现原来有更加简单的方法,不需要用数组保存蛇,只需要增加两个变量保存蛇头和蛇尾就够了.
    现在正在想通过用htc重构table对象,实现一些更复杂的功能或者简化一些操作,例如在cell增加一个row的属性就不需要每次通过parentElement.rowIndex来找它的行数,到时候打算用这种table做个excel模拟器,因为之前写过一段时间的excel vba,如果可能在table的基础上建造如excel application的sheet,range,cell,row,column等对象,那么功能会更加强大...
      

  11.   

    我试了一下,真是太棒了,比专业的游戏版本好玩多了,我想最主要的是楼主太赋有有成就感了
      本人不太喜欢玩游戏,但是用JAVASCRIPT编出来的就比其他专业的好玩多了,就是因为有这种交互式玩法,真让人羡慕楼主的技术,太高了……