Javascript Tic-tac-toe,如何在模块之间通信 'move'

标签 javascript tic-tac-toe

我是一个相对较新的开发人员,边做边学 JS。我正在尝试使用 vanillaJS 创建一个简单的 TicTacToe 游戏。

现在我有三个“模块”(它们实际上只是对象文字):BoardPlayerTicTacToe (基本上只是游戏状态)。

Board有一个state属性,它是一个3*3的数组,代表TicTacToe棋盘。它会在调用 newMove 方法时更新,并且有一个 isInWinningState 方法,当有人连续获得三个时,该方法返回 true

Player 有一个marker 属性,可以是“X”或“O”。它还具有 turn 属性,当轮到该玩家时,该属性为 true;当玩家赢得游戏时,它还具有 isWinner 属性。玩家可以移动,这意味着它会在棋盘上调用new Move

TicTacToe 对象具有属性、boardplayer1player2 以及用于初始化每个属性的方法。这些。它还有一个属性 currentPlayer 来跟踪轮到谁了。

我觉得此时每个对象的内部逻辑已经相当彻底地实现了(尽管,就像我说的,我是一个菜鸟,可能会遗漏一些东西)。

但是,我发现每个对象之间的通信更加困难。

特别是,我不确定如何让玩家移动。 Player 对象有一个 move 方法(尽管我还没有在该方法中编写任何内容),而 Board 对象有一个 >newMove 方法,但我不知道如何通过 TicTacToe 连接它们,这样当 currentPlayer 调用其 move方法,boardnewMove 方法被调用。

我希望这一点很清楚。这是代码:

// board.js
var Board; 

Board = {
    state: [[undefined, undefined, undefined], [undefined, undefined, undefined], [undefined, undefined, undefined]],

    isInWinningState: function() { 
        return Board.topLeftToBottomRightIsComplete() || 
            Board.topRightToBottomLeftIsComplete() || 
            Board.aRowIsComplete() || 
            Board.aColIsComplete();
    }, 

    newMove: function(newMarker, x, y) {
        return Board.state.map( function(row, rowIndx) {
            if (rowIndx===y) {
                return row.map( function (marker, colIndx) {
                    if (colIndx===x) {
                        return newMarker;
                    } else {
                        return marker;
                    }
                });
            } else {
                return row;
            }
        });
    },

};

module.exports = Board;




// player.js
var Player; 

Player = {
    marker: undefined,
    turn : false,
    isWinner: false,

    assignMarker: function(newMarker) {
        this.marker = newMarker;
    }, 

    startTurn: function() {
        this.turn = true;
    },

    move: function() {
        if (this.turn = true) {
            // move
        } else {
            // player can't move
        }
    },

    wins: function() {
        this.isWinner = true;
    }
}

module.exports = Player;




// tic-tac-toe.js
let Board = require('./board.js'),
    Player = require('./player.js');

var TicTacToe;

TicTacToe = {
    board: undefined,
    player1: undefined,
    player2: undefined,
    currentPlayer: undefined,

    startGame: function() {
        this.board = Object.create(Board);
        this.currentPlayer = this.player1.marker==='X' ? this.player1 : this.player2;
    },

    initPlayer1: function() {
        marker = Math.random() > 0.5 ? 'X' : 'O';
        this.player1 = Object.create(Player);
        this.player1.assignMarker(marker);
    },

    initPlayer2: function() {
        marker = this.player1.marker==='X' ? 'O' : 'X';
        this.player2 = Object.create(Player);
        this.player2.assignMarker(marker);
    },

    newTurn: function() {
        this.currentPlayer = this.currentPlayer===this.player1 ? this.player2 : this.player1;
    },

    gameOver: function() {
        if this.board.isInWinningState() {
            return true;
        } else {
            return false;
        }
    }
}

module.exports = TicTacToe;

最佳答案

TicTacToe 对象传递到其子对象的方法中。您稍后可以使用它来回调主对象中的游戏更新方法,并允许您访问游戏的其他对象。

玩家:

  function doMove(game,x,y,marker)= {
   // you do move here
   game.update(x,y,marker);
  }

井字游戏:

  function update(x,y,marker)={
   this.board.updateBoard(this,x,y,marker);
  }

董事会:

  function updateBoard (game,x,y,marker)={
   //do some update board rendering
  }

然后在 TicTacToe 对象中,您只需调用 this.player1.doMove(this,x,y,marker) 即可正常工作

关于Javascript Tic-tac-toe,如何在模块之间通信 'move',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44659153/

相关文章:

javascript - 鼠标悬停时 Div 扩展和收缩?

javascript - 在 Javascript 中格式化为货币

javascript - 将工作功能性 Javascript Tic Tac Toe 游戏转换为基于类的练习 OOP

algorithm - 如何在 m,n,k 游戏(广义井字棋)早期有效地检测平局?

javascript - 将 Markdown 解析委托(delegate)给客户端有什么缺点?

javascript - 使用 Express 和 NodeJS 构建 REST API 的最佳实践

java - tictactoe 类的二维数组有问题

c++ - Tic Tac Toe 和 Minimax - 在微 Controller 上创建不完美的 AI

c++ - 如何使用 std::multimap 将整数键映射到用作多维数组坐标的两个整数值(对于 Tic Tac Toe)?

javascript - 使用 javascript 自动提交 asp.net 表单