2015-09-13 51 views
4

我遇到了一個奇怪的情況。我在JS中構建了一個很好的Tic-Tac-Toe遊戲,我無法弄清楚爲什麼count變量在我第二次初始化時不會重置。重新初始化時,計數變量未在javascript中重置

第一款遊戲效果很好;即使在init()中var變量重置,第二個遊戲計數也不會重置爲0。

遊戲規則:遊戲X啓動,應始終與X.開始你會注意到,在第二場比賽中以O.

開始會有人照顧看看?小提琴:http://jsfiddle.net/1ommcdxg/

var board; 
var gameBoard; 
var winners = [ 
       [0,1,2], 
       [3,4,5], 
       [6,7,8], 
       [0,3,6], 
       [1,4,7], 
       [2,5,8], 
       [0,4,8], 
       [2,4,6] 
]; 
var count; 

var checkWin = function (a) { 

    for (var i = 0; i < winners.length; i++) { 

     if (gameBoard[winners[i][0]] === a && 
      gameBoard[winners[i][1]] === a && 
      gameBoard[winners[i][2]] === a) 
     { 
      return a; 
     }; 

    }; 

}; 

var gamePlay = function (ev) { 

    console.log(ev); 

    ev = ev || window.event; // browser compatibility 
    var target = ev.target || ev.srcElement; //browser c... 
    var choice = target.id; //sets a variable from the id 
    choice = parseInt(choice.substring(1,2)); 

    // console.log(target); 
    // console.log(choice); 

    console.log("in gameplay " + count); 

    if (count < 9) { 

     if (count % 2 === 0) { 

      target.innerHTML = "X"; 
      target.className = target.className + " x"; 
      gameBoard[choice] = "x"; 
      if (checkWin(gameBoard[choice])) { 
       alert("X wins!"); 
       init(); 
      }; 

     } else { 
      target.innerHTML = "O"; 
      target.className = target.className + " o"; 
      gameBoard[choice] = "o"; 
      if (checkWin(gameBoard[choice])) { 
       alert("O wins!"); 
       init(); 
      }; 
     }; 

    } else { 
     console.log("no more turns!"); 
    }; 

    count++; 

}; 

var init = function() { 

    gameBoard = new Array(); 
    xPlayer = []; 
    oPlayer = []; 
    count = 0; 

    board = document.getElementById("board"); 

    if (board.hasChildNodes()) { 
     board.removeChild(board.firstChild); 
    }; 

    var b = document.createElement("b"); 
    board.appendChild(b); 

    for (var i = 0; i < 9; i++) { 
     var el = document.createElement("div"); 
     el.className = "square"; 
     el.id = "t" + i; 
     b.appendChild(el); 
     console.log(el); 
     el.addEventListener('click', gamePlay); 
    }; 

    console.log(count); 

}; 

init(); 
+2

你是沒有真正描述發生了什麼,所以我猜測問題是'gamePlay'在調用'init()'後調用'count ++'。 –

+0

你並沒有將'count'變量設置爲奇數,甚至在'X'或'O'贏得遊戲後調用'init'。 '如果(checkWin(gameBoard [choice])){alert(「O wins!」); init(1或0取決於誰贏了); };' –

+0

您應該嘗試提供一個較短的問題代碼示例。它會幫助他人回答你的問題。它也可以幫助你找到錯誤。 –

回答

0

我發現在你的代碼2個問題:

  1. 當你沒有違反你的代碼執行一次用戶勝(init()被調用)計數++仍然會執行
  2. 您需要刪除事件監聽器一次單擊事件觸發,否則你的計數器仍將繼續increamenting但遊戲永遠不會結束

試試這個片斷:

var board; 
 
var gameBoard; 
 
var winners = [ 
 
    [0, 1, 2], 
 
    [3, 4, 5], 
 
    [6, 7, 8], 
 
    [0, 3, 6], 
 
    [1, 4, 7], 
 
    [2, 5, 8], 
 
    [0, 4, 8], 
 
    [2, 4, 6] 
 
]; 
 
var count; 
 
var checkWin = function(a) { 
 
    for (var i = 0; i < winners.length; i++) { 
 
    if (gameBoard[winners[i][0]] === a && gameBoard[winners[i][1]] === a && gameBoard[winners[i][2]] === a) { 
 
     return a; 
 
    } 
 
    } 
 
}; 
 
var gamePlay = function(ev) { 
 
    ev = ev || window.event; // browser compatibility 
 
    var target = ev.target || ev.srcElement; //browser c... 
 
    target.removeEventListener('click', gamePlay); 
 
    var choice = target.id; //sets a variable from the id 
 
    choice = parseInt(choice.substring(1, 2)); 
 
    console.log("in gameplay " + count); 
 
    if (count < 9) { 
 
    if (count % 2 === 0) { 
 
     target.innerHTML = "X"; 
 
     target.className = target.className + " x"; 
 
     gameBoard[choice] = "x"; 
 
     if (checkWin(gameBoard[choice])) { 
 
     alert("X wins!"); 
 
     return init(); 
 
     } 
 
    } else { 
 
     target.innerHTML = "O"; 
 
     target.className = target.className + " o"; 
 
     gameBoard[choice] = "o"; 
 
     if (checkWin(gameBoard[choice])) { 
 
     alert("O wins!"); 
 
     return init(); 
 
     } 
 
    } 
 
    } else { 
 
    console.log("no more turns!"); 
 
    } 
 
    count++; 
 
}; 
 
var init = function() { 
 
    gameBoard = []; 
 
    xPlayer = []; 
 
    oPlayer = []; 
 
    count = 0; 
 
    board = document.getElementById("board"); 
 
    if (board.hasChildNodes()) { 
 
    board.removeChild(board.firstChild); 
 
    } 
 
    var b = document.createElement("b"); 
 
    board.appendChild(b); 
 
    for (var i = 0; i < 9; i++) { 
 
    var el = document.createElement("div"); 
 
    el.className = "square"; 
 
    el.id = "t" + i; 
 
    b.appendChild(el); 
 
    el.addEventListener('click', gamePlay); 
 
    } 
 
    console.log(count); 
 
}; 
 
init();
#board { 
 
    width: 400px; 
 
} 
 
.square { 
 
    width: 100px; 
 
    height: 100px; 
 
    border: 2px solid #333; 
 
    margin: 2px; 
 
    float: left; 
 
    text-align: center; 
 
} 
 
.x { 
 
    background-color: blue; 
 
    color: white; 
 
} 
 
.o { 
 
    background-color: red; 
 
    color: white; 
 
}
<h1>Tic Tac Toe</h1> 
 

 
<div id="board"></div>

+0

謝謝。我仍在研究代碼的更精細的部分,並且感謝您提醒我必須解決用戶可以選擇同一方格兩次並且計數會增加的問題。此時應該順利航行。 – user5330065

+0

乾杯人! **快樂編碼** – Rayon

4

費利克斯·克林是正確的,這是因爲計數++在遊戲功能的結束,它初始化後,被稱爲()。

您可以在調用init()後立即從gamePlay函數返回,以解決此問題。

var board; 
 
    var gameBoard; 
 
    var winners = [ 
 
    \t \t \t \t [0,1,2], 
 
    \t \t \t \t [3,4,5], 
 
    \t \t \t \t [6,7,8], 
 
    \t \t \t \t [0,3,6], 
 
    \t \t \t \t [1,4,7], 
 
    \t \t \t \t [2,5,8], 
 
    \t \t \t \t [0,4,8], 
 
    \t \t \t \t [2,4,6] 
 
    ]; 
 
    var count; 
 

 
    var checkWin = function (a) { 
 

 
    \t for (var i = 0; i < winners.length; i++) { 
 

 
    \t \t if (gameBoard[winners[i][0]] === a && 
 
    \t \t \t gameBoard[winners[i][1]] === a && 
 
    \t \t \t gameBoard[winners[i][2]] === a) 
 
    \t \t { 
 
    \t \t \t return a; 
 
    \t \t }; 
 

 
    \t }; 
 

 
    }; 
 

 
    var gamePlay = function (ev) { 
 

 
    \t console.log(ev); 
 

 
    \t ev = ev || window.event; // browser compatibility 
 
    \t var target = ev.target || ev.srcElement; //browser c... 
 
    \t var choice = target.id; //sets a variable from the id 
 
    \t choice = parseInt(choice.substring(1,2)); 
 

 
    \t // console.log(target); 
 
    \t // console.log(choice); 
 

 
    \t console.log("in gameplay " + count); 
 

 
    \t if (count < 9) { 
 

 
    \t \t if (count % 2 === 0) { 
 

 
    \t \t \t target.innerHTML = "X"; 
 
    \t \t \t target.className = target.className + " x"; 
 
    \t \t \t gameBoard[choice] = "x"; 
 
    \t \t \t if (checkWin(gameBoard[choice])) { 
 
    \t \t \t \t alert("X wins!"); 
 
    \t \t \t \t init(); 
 
    \t \t \t \t return; 
 
    \t \t \t }; 
 

 
    \t \t } else { 
 
    \t \t \t target.innerHTML = "O"; 
 
    \t \t \t target.className = target.className + " o"; 
 
    \t \t \t gameBoard[choice] = "o"; 
 
    \t \t \t if (checkWin(gameBoard[choice])) { 
 
    \t \t \t \t alert("O wins!"); 
 
    \t \t \t \t init(); 
 
    \t \t \t \t return; 
 
    \t \t \t }; 
 
    \t \t }; 
 

 
    \t } else { 
 
    \t \t console.log("no more turns!"); 
 
    \t }; 
 

 
    \t count++; 
 

 
    }; 
 

 
    var init = function() { 
 

 
    \t gameBoard = new Array(); 
 
    \t xPlayer = []; 
 
    \t oPlayer = []; 
 
    \t count = 0; 
 

 
    \t board = document.getElementById("board"); 
 

 
    \t if (board.hasChildNodes()) { 
 
    \t \t board.removeChild(board.firstChild); 
 
    \t }; 
 

 
    \t var b = document.createElement("b"); 
 
    \t board.appendChild(b); 
 

 
    \t for (var i = 0; i < 9; i++) { 
 
    \t \t var el = document.createElement("div"); 
 
    \t \t el.className = "square"; 
 
    \t \t el.id = "t" + i; 
 
    \t \t b.appendChild(el); 
 
    \t \t console.log(el); 
 
    \t \t el.addEventListener('click', gamePlay); 
 
    \t }; 
 

 
    \t console.log(count); 
 

 
    }; 
 

 
    init();
#board { 
 
    \t width: 400px; 
 
    } 
 

 
    .square { 
 
    \t width: 100px; 
 
    \t height: 100px; 
 
    \t border: 2px solid #333; 
 
    \t margin: 2px; 
 
    \t float: left; 
 
    \t text-align: center; 
 
    } 
 

 
    .x { 
 
    \t background-color: blue; 
 
    \t color: white; 
 
    } 
 

 
    .o { 
 
    \t background-color: red; 
 
    \t color: white; 
 
    }
<body> 
 
    <h1>Tic Tac Toe</h1> 
 

 
    <div id="board"></div> 
 

 
    </body>