{Ctl+Enter} to run model
download.zip
copy link to clipboard
copy iframe widget source
Code Terminal
function declaration({fn, cell, role}) {

    // REVIEW: code in use at https://pflow.dev/demo/tictactoe/

    let dx = 220;
    let dy = 140;

    let X = 'X';
    let O = 'O';

    function row (n) {
        return [
            cell(n+"0", 1, 1, { x: 1*dx, y: (n+1)*dy}),
            cell(n+"1", 1, 1, { x: 2*dx, y: (n+1)*dy}),
            cell(n+"2", 1, 1, { x: 3*dx, y: (n+1)*dy})
        ];
    }
    let board = [ row(0), row(1), row(2) ];

    let players =  {
        X: {
            turn: cell(X, 1, 1, { x: 40, y: 200 }), // track turns, X goes first
            role: role(X), // player X can only mark X's
            next: O,
            dx: -60
        },
        O: {
            turn: cell(O, 0, 1, { x: 830, y: 370}), // track turns, O moves second
            role: role(O), // player O can only mark O's
            next: X,
            dx: 60
        }
    };

    for (let i in  board) {
        for (let j in  board[i]) {
            for (let marking in players) {
                player = players[marking];
                let {position} = board[i][j].place; // use place for relative positioning
                move = fn(marking+i+j, player.role, { // declare a move
                    x: position.x+player.dx, // position using each player's unique delta
                    y: position.y,
                });
                player.turn.tx(1, move); // take turn
                board[i][j].tx(1, move); // take board space
                move.tx(1, players[player.next].turn); // mark next turn
            }
        }
    }
}
pflow.dev petri-net editor