2016-08-22 53 views
-1

我目前有一个问题作出井字棋游戏,即使我改变“状态”变量它一直在执行里面的代码,我怎么能解决这个问题问题?有没有简单的方法来保持执行常量代码制作游戏?功能保持,即使改变了代码执行块

$(document).ready(function() { 
 
    gameManager(); 
 
}); 
 

 
$(document).ready(function() { 
 
    gameManager(); 
 
}); 
 

 
var playerSelect, aiSelect = ""; 
 
var state = "choose"; 
 
var turn = "player"; 
 
var gameOn = true; 
 

 
function gameManager() { 
 

 
    if (state == "choose") { 
 
    chooseSide(); 
 
    } else if (state == "play") { 
 

 
    createGrid(); 
 

 
    if (turn == "player") { 
 
     playerChoose(); 
 
     console.log("Player's turn"); 
 
    } else { 
 
     playerChoose(); 
 
     console.log("Enemy's turn"); 
 
    } 
 
    } 
 
} 
 

 
function playerChoose() { 
 
    $('.gridElement').click(function() { 
 
    $(this).html('<div class="gridElement">' + playerSelect + '</div>'); 
 
    }); 
 
} 
 

 
function chooseSide() { 
 
    console.log(state); 
 

 
    $('#textContainer').html('<p> Choose Side: </p> <div class="chooseButton">X</div> <div class="chooseButton">O</div>'); 
 

 
    $('.chooseButton').click(function() { 
 
    console.log(state); 
 
    playerSelect = $(this).html(); 
 

 
    if (playerSelect == "X") { 
 
     aiSelect = "O"; 
 
    } else { 
 
     aiSelect = "X"; 
 
    } 
 

 
    state = "play" 
 
    console.log(state); 
 
    }); 
 
} 
 

 
function createGrid() { 
 

 
    for (var i = 0; i < 9; i++) { 
 
    $('#gridContainer').append('<div class="gridElement"> </div>'); 
 
    } 
 

 
    var gridElementSize = $('#gridContainer').width()/3; 
 

 
    $('.gridElement').css({ 
 
    'width': gridElementSize, 
 
    "height": gridElementSize 
 
    }); 
 
}
#gridContainer { 
 
    border: 2px solid blue; 
 
    width: 200px; 
 
    height: 200px; 
 
    margin-left: auto; 
 
    margin-right: auto; 
 
    margin-top: 40px; 
 
} 
 
.gridElement { 
 
    display: inline-block; 
 
    vertical-align: top; 
 
    border: 1px solid black; 
 
} 
 
#textContainer { 
 
    margin-left: auto; 
 
    margin-right: auto; 
 
} 
 
.chooseButton { 
 
    display: inline-block; 
 
}
<!DOCTYPE> 
 
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <!-- INITIALIZE --> 
 
    <link href="https://fonts.googleapis.com/css?family=Bungee+Shade" rel="stylesheet"> 
 
    <link href="https://fonts.googleapis.com/css?family=Black+Ops+One" rel="stylesheet"> 
 
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 
 

 
    <script src="https://use.fontawesome.com/ca5f7b6f9a.js"></script> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 

 
    <link rel="stylesheet" href="stylesheet.css"> 
 
    <script src="script.js"></script> 
 

 
    <!--CONTENT--> 
 
    <title>TicTacToe</title> 
 
</head> 
 

 
<body> 
 

 
    <div id="textContainer"> 
 

 
    </div> 
 

 

 
    <div id="gridContainer"> 
 

 
    </div> 
 

 

 
</body> 
 

 
</html>

+1

'“即使我改变‘状态’变量它一直执行的代码里面”“ - 这是什么意思,甚至?你能更清楚地描述问题吗?另外,为什么在文档加载时执行相同的功能两次?为什么你不断重复添加相同的点击处理程序元素?这将使这些元素执行处理程序很多次。这段代码非常令人困惑。 – David

+0

我想的是,游戏管理器功能保持执行而本场比赛是上,检查游戏的不同状态来执行,保持游戏的工作一些其他的代码。首先,我设置为“选择”,让玩家选择“X”或“O”则状态更改为“玩”绘制电路板,并因此会检查游戏的每个转弯的状态。 – Carlosl93

+0

这听起来像是适合使用调试器的时机。看看你的浏览器的调试工具。您可以在代码行中放置“断点”,并在执行时逐行执行代码。这将允许您观察变量的运行时值和代码的行为。很明显,这里有一个错误,但我怀疑它被其他几个错误蒙上了阴影,整个事情看起来很好,相当混乱。我怀疑如果将这些点击处理程序移出函数,整个事情将会变得更有意义。 – David

回答

0

正如BAMAR说,使用Javascript的web应用程序是事件驱动的,这意味着你需要为与网页的用户交互创建事件处理程序。用户与浏览器交互时发生事件(点击页面上的元素,滚动视图等)。事件处理程序是Javascript函数。绑定事件处理程序时,您应该只将它们绑定到事件类型一次。应用程序中只有两个需要处理的事件:选择X或O,然后单击网格中的正方形。

我重构你的代码来说明一个更好的方法。边的选择在initGame中绑定一次,并且在创建时(每次通过再次选择边重置游戏时),网格方块单击都会与方格绑定。需要注意的是,有必要在每次游戏复位再次绑定平方单击处理程序,因为以前gridElements在的resetGrid顶部取下,并在事件处理程序绑定到这些删除的元素都将丢失。

$(document).ready(function() { 
 
    initGame(); 
 
}); 
 

 
var playerSelect, aiSelect = ""; 
 
var turn; 
 
var gameOn; 
 

 

 
function initGame() { 
 
    $('#textContainer').html('<p> Choose Side: </p> <div class="chooseButton">X</div> <div class="chooseButton">O</div>'); 
 

 
    $('.chooseButton').click(function(){ 
 
    playerSelect = $(this).html(); 
 

 
    if(playerSelect == "X"){ 
 
     aiSelect = "O"; 
 
    } else { 
 
     aiSelect = "X"; 
 
    } 
 
    resetGame(); 
 
    }); 
 

 
} 
 

 
function resetGame(){ 
 
    gameOn = true; 
 
    turn = "player";  
 
    resetGrid(); 
 
} 
 

 
function resetGrid(){ 
 
    // remove any existing grid elements 
 
    $('.gridElement').remove(); 
 

 
    for(var i = 0; i < 9; i++){ 
 
    $('#gridContainer').append('<div class="gridElement"></div>'); 
 
    } 
 

 
    var gridElementSize = $('#gridContainer').width()/3; 
 

 
    $('.gridElement').css({'width': gridElementSize, "height": gridElementSize}); 
 

 
    // bind the click handler to the new elements 
 
    $('.gridElement').click(function(e){ // e is the event 
 
    handlePlayerClick(e); 
 
    }); 
 
} 
 

 
function checkForWinOrDraw() { 
 
    // check for win or draw 
 
    gameOn = true; // set to false if game is over 
 
} 
 

 
function handlePlayerClick(e) { // e is the click event 
 
    if(gameOn == false) { 
 
    // the current game is over, so do nothing 
 
    return; 
 
    } 
 
    if(turn == "player"){ 
 
    square = $(e.target); 
 
    if(square.html() == "") { // if the square is empty 
 
     $(e.target).html(playerSelect); // e.target is the grid element 
 
     turn = "enemy"; 
 
     console.log("Player has made a move"); 
 
     // the player has made a move 
 
     checkForWinOrDraw(); 
 
     makeEnemyMove(); 
 
    } else { 
 
     console.log("Square has already been taken."); 
 
    } 
 
    } else { 
 
    console.log("Player can't play. It's the enemy's turn"); 
 
    } 
 

 
} 
 

 
function makeEnemyMove() { 
 
    if(gameOn == false) { 
 
    // the current game is over, so do nothing 
 
    return; 
 
    } 
 
    // dumb AI picks first empty square. Replace with smart AI 
 
    els = $('.gridElement').toArray(); 
 
    var i; 
 
    for(i = 0; i < els.length; i++) { 
 
    var el = $(els[i]); 
 
    if(el.html() == "") { 
 
     el.html(aiSelect); 
 
     console.log("Enemy has made a move"); 
 
     turn = "player"; 
 
     break; 
 
    } 
 
    } 
 
    checkForWinOrDraw(); 
 
}
#gridContainer{ 
 
\t border: 2px solid blue; 
 

 
\t width: 200px; 
 
\t height: 200px; 
 

 
\t margin-left: auto; 
 
\t margin-right: auto; 
 
\t margin-top: 40px; 
 
} 
 

 
.gridElement{ 
 
\t display: inline-block; 
 
\t vertical-align:middle; 
 
    text-align: center; 
 
    padding-top: 20px; 
 

 
\t border: 1px solid black; 
 
} 
 

 
#textContainer{ 
 

 
\t margin-left: auto; 
 
\t margin-right: auto; 
 

 
} 
 

 
.chooseButton{ 
 
\t display: inline-block; 
 
}
<!DOCTYPE> 
 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
\t <!-- INITIALIZE --> 
 
\t \t <link href="https://fonts.googleapis.com/css?family=Bungee+Shade" rel="stylesheet"> 
 
\t \t <link href="https://fonts.googleapis.com/css?family=Black+Ops+One" rel="stylesheet"> 
 
\t \t <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 
 

 
\t \t <script src="https://use.fontawesome.com/ca5f7b6f9a.js"></script> 
 
\t \t <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 

 
\t \t <link rel="stylesheet" href="stylesheet.css"> 
 
\t \t <script src="script.js"></script> 
 

 
\t \t <!--CONTENT--> 
 
\t \t <title>TicTacToe</title> 
 
</head> 
 
<body> 
 

 
\t <div id="textContainer"> 
 

 
\t </div> 
 

 

 
\t <div id="gridContainer"> 
 

 
\t </div> 
 

 

 
</body> 
 
</html>

+0

谢谢!我不知道回合事件以及他们如何工作,我会更多地了解它。但是你的代码很好地解释了它。 – Carlosl93