Mercurial
diff react_games/public/games/main-XZMLBHCF.js @ 37:fb9bcd3145cb
[ReactGames] Few games I made using react just to practice few things.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 01 Dec 2025 20:22:47 -0800 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/react_games/public/games/main-XZMLBHCF.js Mon Dec 01 20:22:47 2025 -0800 @@ -0,0 +1,138 @@ +import { + __toESM, + require_jsx_runtime, + require_react +} from "./chunk-AX5M7HF6.js"; + +// src/Tictactoe/main.tsx +var import_react = __toESM(require_react()); +var import_jsx_runtime = __toESM(require_jsx_runtime()); +var MAX_ROW = 3; +var MAX_COL = 3; +var getInitialGameState = () => { + return { + board: Array.from( + { length: MAX_ROW }, + () => Array(MAX_COL).fill( + { + value: "", + isWonSquare: false + } + ) + ), + status: 0 /* PLAYABLE */, + player: "X" /* X */ + }; +}; +var cellCssStyle = (isWinningSquare) => ({ + display: "flex", + justifyContent: "center", + alignItems: "center", + width: "100%", + aspectRatio: "1 / 1", + background: isWinningSquare ? "blue" : "lightblue", + border: "1px solid black" +}); +var CellComponent = (0, import_react.memo)(({ cell, row, col, moveDispatch }) => { + const handleOnClick = (0, import_react.useCallback)(() => { + moveDispatch(row, col); + }, [row, col]); + return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: cellCssStyle(cell.isWonSquare), onClick: handleOnClick, children: cell.value }); +}); +var boardCssStyle = { + display: "grid", + gridTemplateColumns: `repeat(${MAX_COL}, 1fr)`, + width: 500 +}; +var getGameStatus = (board) => { + const direction = [ + [0, 1], + [1, 0], + [1, 1], + [1, -1] + ]; + let numberOfFilledValue = 0; + for (let row = 0; row < MAX_ROW; row++) { + for (let col = 0; col < MAX_COL; col++) { + if (board[row][col].value === "") continue; + numberOfFilledValue++; + for (const [dr, dc] of direction) { + if (board[row][col].value === board[row + dr]?.[col + dc]?.value && board[row][col].value === board[row + dr * 2]?.[col + dc * 2]?.value) { + return { + newStatus: 1 /* WON */, + winningPositions: [ + [row, col], + [row + dr, col + dc], + [row + dr + dr, col + dc + dc] + ] + }; + } + } + } + } + return numberOfFilledValue === MAX_ROW * MAX_COL ? { newStatus: 2 /* TIE */ } : { newStatus: 0 /* PLAYABLE */ }; +}; +var gameStateReducer = (state, action) => { + if (state.status === 1 /* WON */) return state; + switch (action.type) { + case 0 /* PLACE */: + if (state.board[action.row][action.col].value) return state; + let newBoard = state.board.map( + (row, rowIdx) => rowIdx === action.row ? row.map( + (col, c) => c === action.col ? { ...col, value: state.player } : col + ) : row + ); + const res = getGameStatus(newBoard); + let winner = null; + if (res.newStatus === 1 /* WON */) { + winner = state.player; + newBoard = newBoard.map( + (row, rowIdx) => row.map( + (col, colIdx) => res.winningPositions.some(([wr, wc]) => wr === rowIdx && wc === colIdx) ? { ...col, isWonSquare: true } : col + ) + ); + } + return { + ...state, + board: newBoard, + status: res.newStatus, + player: "X" /* X */ === state.player ? "O" /* O */ : "X" /* X */, + winner + }; + case 1 /* RESET */: + return getInitialGameState(); + } +}; +var TicTacToe = () => { + const [state, dispatch] = (0, import_react.useReducer)(gameStateReducer, null, getInitialGameState); + const moveDispatch = (0, import_react.useCallback)( + (rowIdx, colIdx) => dispatch({ type: 0 /* PLACE */, row: rowIdx, col: colIdx }), + [] + ); + return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [ + /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { children: " TicTacToe " }), + /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: state.status === 0 /* PLAYABLE */ ? `Player ${state.player} Turn!` : state.status === 2 /* TIE */ ? "Game is tied! Please reset" : `Player ${state.winner} has won!` }), + /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: boardCssStyle, children: state.board.map((row, rowIdx) => { + return row.map((cell, colIdx) => { + const cellComponentProp = { + cell, + row: rowIdx, + col: colIdx, + moveDispatch + }; + return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( + CellComponent, + { + ...cellComponentProp + }, + `${rowIdx}-${colIdx}` + ); + }); + }) }), + /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => dispatch({ type: 1 /* RESET */ }), children: "Reset" }) + ] }); +}; +export { + TicTacToe +}; +//# sourceMappingURL=main-XZMLBHCF.js.map