scrabble-solver
Version:
Scrabble Solver 2 - Free, open-source, cross-platform, multi-language analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Crossplay, Literaki, and Kelimelik. Quickly find the top-scoring words using the given board and tiles.
42 lines (33 loc) • 1.41 kB
text/typescript
import { type BoardJson, type CellJson, type Config } from '@scrabble-solver/types';
import { isRowValid } from './isRowValid';
export const isBoardValid = (board: BoardJson, config: Config): boolean => {
if (board.length !== config.boardHeight) {
return false;
}
for (const row of board) {
if (!isRowValid(row, config)) {
return false;
}
}
return areTwoCharacterTilesValid(board, config);
};
const areTwoCharacterTilesValid = (board: CellJson[][], config: Config): boolean => {
const cells: CellJson[] = board
.flat()
.filter((cell) => cell && cell.tile && config.isTwoCharacterTilePrefix(cell.tile.character));
for (const cell of cells) {
for (const characters of config.twoCharacterTiles) {
const cellDown = board[cell.y + 1]?.[cell.x];
const cellRight = board[cell.y]?.[cell.x + 1];
const canCheckDown = cell.y + 1 < board.length && Boolean(cellDown);
const canCheckRight = cell.x + 1 < board[0].length && Boolean(cellRight);
const collidesDown = canCheckDown && cellDown.tile && cellDown.tile.character === characters[1];
const collidesRight = canCheckRight && cellRight.tile && cellRight.tile.character === characters[1];
const collides = collidesDown || collidesRight;
if (cell.tile && characters.startsWith(cell.tile.character) && collides) {
return false;
}
}
}
return true;
};