import { defineEvent, defineGame } from "@openturn/core";
export const game = defineGame({
maxPlayers: 2,
events: {
place_mark: defineEvent<{ row: number; col: number }>(),
},
initial: "play",
setup: () => ({ board: createEmptyBoard() }),
selectors: {
winnerMark: ({ G }) => getWinner(G.board),
},
states: {
play: {
activePlayers: ({ match, position }) =>
[match.players[(position.turn - 1) % match.players.length]!],
label: "Take your turn",
control: () => ({ status: "playing" }),
},
won: {
activePlayers: () => [],
label: "Winner",
control: () => ({ status: "won" }),
},
},
transitions: ({ transition }) => [
transition("place_mark", {
from: "play",
to: "won",
turn: "increment",
label: "place_mark:win",
resolve: ({ G, event, playerID }) => {
const board = placeMark(G.board, event.payload.row, event.payload.col, playerID);
if (board === null || getWinner(board) === null) return null;
return { G: { board }, result: { winner: playerID } };
},
}),
// more branches: draw, continue...
],
views: {
public: ({ G }) => ({ board: G.board }),
},
});