Javascript Tic-Tac-Toe环

Javascript Tic-Tac-Toe环,javascript,function,loops,control-flow,Javascript,Function,Loops,Control Flow,我正在用javascript做一个tic-tac-toe游戏。我已经列出了一些我认为是基本组成部分的东西: var board = [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; gameOn = true; player1Move = true; counter = 0; player1 = []; player2 = []; var ask = console.log(prompt(

我正在用javascript做一个tic-tac-toe游戏。我已经列出了一些我认为是基本组成部分的东西:

var board = [
            0, 0, 0,
            0, 0, 0,
            0, 0, 0
            ];
gameOn = true;
player1Move = true;
counter = 0;
player1 = [];
player2 = [];
var ask = console.log(prompt('where would you like to go?'));

var drawBoard = function(){
    console.log("   A " + (board[0]) + "| B " + (board[1]) + "| C " + (board[2]));
    console.log("  ------------- ");
    console.log("   D " + (board[3]) + "| E " + (board[4]) + "| F " + (board[5]));
    console.log("  ------------- ");
    console.log("   G " + (board[6]) + "| H " + (board[7]) + "| I " + (board[8]));
    console.log("  ------------- ");
};

var solutions = [
    (board[0] && board[1] && board[2]) || (board[3] && board[4] && board[5]) ||
    (board[6] && board[7] && board[8]) || (board[0] && board[3] && board[6]) ||
    (board[1] && board[4] && board[7]) || (board[2] && board[5] && board[8]) ||
    (board[0] && board[4] && board[8]) || (board[2] && board[4] && board[6])
];



while (gameOn === true){
// for loop for game logic
    for (var i = 0 ; i < 9; i++){
      if (player1Move === true) {
        player1.push(ask);
        drawBoard();
        player1Move = false;
      } else if (player1Move === false){
        player2.push(ask);
        drawBoard();
        player1Move = true;
      } else if ((player1 || player2) === solutions){
          gameOn = false;
          console.log((player1 || player2) + "wins!");
      } else {
        gameOn = false;
        console.log("Tie Game!");
      }
    }
}
var板=[
0, 0, 0,
0, 0, 0,
0, 0, 0
];
gameOn=true;
player1Move=真;
计数器=0;
player1=[];
player2=[];
var ask=console.log(提示符('您想去哪里?');
var drawBoard=函数(){
log(“A”+(board[0])+“|B”+(board[1])+“|C”+(board[2]);
console.log(“----------------”;
log(“D”+(board[3])+“|E”+(board[4])+“|F”+(board[5]);
console.log(“----------------”;
log(“G”+(board[6])+“|H”+(board[7])+“|I”+(board[8]);
console.log(“----------------”;
};
var解决方案=[
(董事会[0]和董事会[1]和董事会[2])||(董事会[3]和董事会[4]和董事会[5])||
(董事会[6]和董事会[7]和董事会[8])||(董事会[0]和董事会[3]和董事会[6])||
(董事会[1]和董事会[4]和董事会[7])| |(董事会[2]和董事会[5]和董事会[8])||
(董事会[0]和董事会[4]和董事会[8])||(董事会[2]和董事会[4]和董事会[6])
];
while(gameOn==true){
//游戏逻辑的for循环
对于(变量i=0;i<9;i++){
如果(player1Move==真){
player1.推(问);
绞车();
player1Move=假;
}else if(player1Move==false){
player2.推(问);
绞车();
player1Move=真;
}else if((player1 | | player2)==解决方案){
gameOn=false;
log((player1 | | player2)+“wins!”);
}否则{
gameOn=false;
日志(“平局游戏!”);
}
}
}
我知道我的主循环的语法不正确。为什么我不能执行当前编写的操作?如果您有这个现有的代码,您会使用什么类型的循环设置来完成这个任务?对不起,如果这似乎不够具体,我只是在这一切的逻辑迷失了

对于这个现有的循环,我现在要做的就是遍历并提示2个用户9次(因为最大移动次数=9次)。一旦成功,我会继续添加更多的游戏逻辑。为什么我不能得到9次提示?目前的结果是,它提示我一次,打印出电路板9次,然后全部为false


顺便说一句,现在这只需要在终端窗口中工作。

我尽可能少地更改了您的代码,但有几点不同,我正在一点一点地解释

var board = {
    A: null,
    B: null,
    C: null,
    D: null,
    E: null,
    F: null,
    G: null,
    H: null,
    I: null
};

gameOn = true;
player1Move = true;

var drawBoard = function(){
    console.log("   A " + (board.A || '') + "| B " + (board.B || '') + "| C " + (board.C || ''));
    console.log("  ------------- ");
    console.log("   D " + (board.D || '') + "| E " + (board.E || '') + "| F " + (board.F || ''));
    console.log("  ------------- ");
    console.log("   G " + (board.G || '') + "| H " + (board.H || '') + "| I " + (board.I || ''));
    console.log("  ------------- ");
};

var solutions = function() {
    return (board.A && (board.A == board.B && board.A == board.C))
        || (board.D && (board.D == board.E && board.D == board.F))
        || (board.G && (board.G == board.H && board.G == board.I));
};

drawBoard();
var currentPlayer;

while (gameOn === true){
// for loop for game logic
    for (var i = 0 ; i < 9; i++){
        if (solutions()){
            console.log(currentPlayer + " wins!");
            gameOn = false;
            break;
         }
        //else {
        //    gameOn = false;
        //    console.log("Tie Game!");
        //}
        currentPlayer = 'Player 1';
        if(!player1Move)
            currentPlayer = 'Player 2';

        var ask = prompt(currentPlayer + ': where would you like to go (A or B or C or ..)?');
        if(ask == 'exit') {
            gameOn = false;
            break;
        }

        if (player1Move === true) {
            //player1.push(ask);
            board[ask] = 'X';
            drawBoard();
            player1Move = false;
        } else if (player1Move === false){
            board[ask] = 'O';
            drawBoard();
            player1Move = true;
        }
    }
}
var板={
答:空,
B:空,
C:空,
D:空,
E:空,
F:空,
G:空,
H:空,
I:空
};
gameOn=true;
player1Move=真;
var drawBoard=函数(){
console.log(“A”+(board.A | |“”)+“B”+(board.B | |“”)+“C”+(board.C | |“”);
console.log(“----------------”;
console.log(“D”+(board.D | |“”)+“E”+(board.E | |“”)+“F”+(board.F | |“”);
console.log(“----------------”;
console.log(“G”+(board.G | |“”)+“H”+(board.H | |“”)+“I”+(board.I | |“”);
console.log(“----------------”;
};
var解决方案=函数(){
返回(board.A&&(board.A==board.B&&board.A==board.C))
||(board.D&(board.D==board.E&&board.D==board.F))
||(board.G&&(board.G==board.H&&board.G==board.I));
};
绞车();
var-currentPlayer;
while(gameOn==true){
//游戏逻辑的for循环
对于(变量i=0;i<9;i++){
if(解决方案()){
console.log(currentPlayer+“wins!”);
gameOn=false;
打破
}
//否则{
//gameOn=false;
//日志(“平局游戏!”);
//}
currentPlayer='Player 1';
如果(!player1Move)
currentPlayer='Player 2';
var ask=prompt(currentPlayer+':您想去哪里(A、B、C或…);
如果(ask==“退出”){
gameOn=false;
打破
}
如果(player1Move==真){
//player1.推(问);
董事会[询问]=“X”;
绞车();
player1Move=假;
}else if(player1Move==false){
董事会[问]=“O”;
绞车();
player1Move=真;
}
}
}
它还没有完全完成,但那是你以后可以做的事情,也许你不想让我为你做这一切

这一切都在Chrome控制台中工作

有两件基本的事情阻碍了你:

  • var ask=console.log(提示(“您想去哪里?”)应该是
    var ask=prompt(currentPlayer+':您想去哪里?)-您的版本在
    ask
    中填充空值
  • 这个提示也出现在错误的地方:它需要在循环中,在drawBoard()之后,这样玩家就可以看到一些东西
  • 我把棋盘从一个数组改成了一个对象,这样玩家的回答像“A”一样直接指向对象字段。这样就可以移除播放器阵列
  • 正如您所看到的,
    solutions()
    函数需要完成,可能有一种更简洁的方法来完成
  • 我添加了在提示符中写“退出”的可能性,否则就无法提前退出游戏
  • 我没有完成“平局!”代码

  • 确保您了解全局对象是什么,以及上下文中的
    window.prompt
    是什么,以及
    console.log
    是什么。了解适用于您的环境的调试器是绝对必要的。在Chrome中,它被称为开发者工具

    window.prompt
    在jsfiddle之类的代码沙盒中,或者在沙盒中构建堆栈溢出时,不是很有用。我建议使用HTML作为用户界面

    function init() {
        trapForm();
        trapInput();
        toggleCurrentUser();
        askUser();
    }
    
    var game = [
        [null,null,null],
        [null,null,null],
        [null,null,null]
    ];
    
    var trapInput = function() {
        //  capture input and use to to create a play in the game
        document.querySelector('#go').addEventListener('click',function(ev) {
    
            var position = document.querySelector('#square').valueAsNumber;
    
            if (position < 10 && position > 0) {
    
                //  render X or O to the HTML
                var td = document.querySelectorAll('#t3 td')[position-1];
                td.innerHTML = currentUser;
    
                //  modify the corresponding game array
                var row = Math.floor( (position-1) / 3 );
                var col = ( (position+2) % 3) ;
                game[row][col] = currentUser;
    
                //  this helps us visualize what's happening
                debug(game);
                checkGameStatus();
                toggleCurrentUser();            
    
            } else {
                debug({"msg":"illegal move"});
            }
    
        });
    };
    
    var trapForm = function() {
        //  prevent form from submitting
        var f = document.querySelector('#f');
        f.addEventListener('submit',function(ev) {
            ev.preventDefault();
            trapInput();
        });
    };
    
    
    当前用户
    什么广场(1-9)?
    游戏状态
    行动