Spaces:
Running
Running
File size: 4,585 Bytes
466436b 502af73 466436b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
/**
* TrigoGameFrontend - Frontend wrapper for TrigoGame
*
* Provides convenient string-based interfaces for frontend use
* Wraps TrigoGame's number-based types with string types
*/
import {
TrigoGame,
type BoardShape,
type Move,
type Player,
type TerritoryResult,
stoneToPlayer,
stepsToMoves,
makePosition,
type GameStatus,
type GameResult
} from "../../../inc/trigo";
/**
* TrigoGameFrontend - Extended TrigoGame with frontend-friendly interfaces
*/
export class TrigoGameFrontend extends TrigoGame {
/**
* Make a move with coordinates (convenience method)
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @returns true if move was successful
*/
makeMove(x: number, y: number, z: number): boolean {
return this.drop(makePosition(x, y, z));
}
/**
* Get current player as string
*
* @returns "black" | "white"
*/
getCurrentPlayerString(): Player {
return stoneToPlayer(this.getCurrentPlayer());
}
/**
* Get move history in frontend format
*
* @returns Array of Move objects
*/
getMoveHistory(): Move[] {
return stepsToMoves(this.getHistory());
}
/**
* Get stone at position, returns number format for frontend
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @returns 0 = Empty, 1 = Black, 2 = White
*/
getStoneAt(x: number, y: number, z: number): number {
return this.getStone(makePosition(x, y, z)) as number;
}
/**
* Check if position is valid
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @returns true if position is on the board
*/
isValidPosition(x: number, y: number, z: number): boolean {
const shape = this.getShape();
return x >= 0 && x < shape.x && y >= 0 && y < shape.y && z >= 0 && z < shape.z;
}
/**
* Check if position is empty
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @returns true if position is empty
*/
isEmpty(x: number, y: number, z: number): boolean {
if (!this.isValidPosition(x, y, z)) {
return false;
}
return this.getStoneAt(x, y, z) === 0;
}
/**
* Check if a move is valid at position
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @returns Object with valid flag and optional reason
*/
isValidMoveAt(x: number, y: number, z: number): { valid: boolean; reason?: string } {
return this.isValidMove(makePosition(x, y, z));
}
/**
* Get opponent player
*
* @returns Opponent player color
*/
getOpponentPlayer(): Player {
const current = this.getCurrentPlayerString();
return current === "black" ? "white" : "black";
}
/**
* Check if undo is available
*
* @returns true if can undo
*/
canUndo(): boolean {
return this.getCurrentStep() > 0;
}
/**
* Undo move (convenience wrapper)
*
* @returns true if undo was successful
*/
undoMove(): boolean {
return this.undo();
}
/**
* Redo move (convenience wrapper)
*
* @returns true if redo was successful
*/
redoMove(): boolean {
return this.redo();
}
/**
* Jump to specific move in history
*
* @param index Move index (-1 for initial state)
* @returns true if jump was successful
*/
jumpToMove(index: number): boolean {
return this.jumpToStep(index);
}
/**
* Get total move count
*
* @returns Number of moves played
*/
getMoveCount(): number {
return this.getCurrentStep();
}
/**
* Get current move index
*
* @returns Current step index
*/
getCurrentMoveIndex(): number {
return this.getCurrentStep();
}
/**
* Get board shape
*
* @returns Board dimensions
*/
getBoardShape(): BoardShape {
return this.getShape();
}
/**
* Initialize game with board shape
*
* @param shape Board dimensions
*/
initializeGame(shape?: BoardShape): void {
if (shape) {
// Would need to recreate the game instance with new shape
// For now, just reset
this.reset();
} else {
this.reset();
}
}
/**
* Compute territory (convenience wrapper)
*
* @returns Territory calculation result
*/
computeTerritory(): TerritoryResult {
return this.getTerritory();
}
/**
* Get game status
*
* @returns Game status
*/
getStatus(): GameStatus {
return this.getGameStatus();
}
/**
* Get game result
*
* @returns Game result if available
*/
getResult(): GameResult | undefined {
return this.getGameResult();
}
/**
* Get consecutive pass count
*
* @returns Number of consecutive passes
*/
getConsecutivePassCount(): number {
return this.getPassCount();
}
}
|