UNPKG

react-scrabble

Version:

The scrabble board game written in React

130 lines (116 loc) 3.44 kB
'use strict'; var matrix = null; var placeHolder = '-1'; function defineMatrix(n) { var matrix = []; for (var i = 0; i < n; i++) { matrix[i] = new Array(); for (var j = 0; j < n; j++) { matrix[i][j] = placeHolder; } } return matrix; } function fillWordAcrossRow(rowNum, startingPoint, word) { var wordArray = word.split(''); for (var i = startingPoint, j = 0; i < word.length + startingPoint; i++, j++) { matrix[rowNum][i] = wordArray[j]; } } function fillWordAcrossColumn(columnNum, startingPoint, word) { var wordArray = word.split(''); for (var i = startingPoint, j = 0; i < word.length + startingPoint; i++, j++) { matrix[i][columnNum] = wordArray[j]; } } function findCellsForRow(word, rowNum) { var len = matrix.length; var maxStartingPoint = len - word.length; for (var x = 1; x <= 3; x++) { var startingPoint = randomTill(maxStartingPoint); var canBeAllotted = true; for (var i = startingPoint; i < word.length + startingPoint; i++) { if (matrix[rowNum][i] != placeHolder) { canBeAllotted = false; break; } } if (canBeAllotted) { fillWordAcrossRow(rowNum, startingPoint, word); return true; } } return false; } function findCellsForColumn(word, columnNum) { var len = matrix.length; var maxStartingPoint = len - word.length; for (var x = 1; x <= 10; x++) { var startingPoint = randomTill(maxStartingPoint); var canBeAllotted = true; for (var i = startingPoint; i < word.length + startingPoint; i++) { if (matrix[i][columnNum] != placeHolder) { canBeAllotted = false; break; } } if (canBeAllotted) { fillWordAcrossColumn(columnNum, startingPoint, word); return true; } } return false; } function findCells(word, pos, direction) { if (direction == 'across') { return findCellsForRow(word, pos); } else { return findCellsForColumn(word, pos); } } function randomTill(n) { return Math.floor(Math.random() * (n - 0 + 1)) + 0; } function fillRandomAlphabets(n) { var alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { if (matrix[i][j] === placeHolder) { matrix[i][j] = alphabets[Math.floor(Math.random() * alphabets.length)]; } } } } function randomDirection() { var direction = ['across', 'down']; return direction[Math.floor(Math.random() * direction.length)]; } function otherDirection(curDirection) { return curDirection === 'across' ? 'down' : 'across'; } module.exports = { generateGrid: function generateGrid(words) { var n = 14; matrix = defineMatrix(n); words.sort(function (w1, w2) { return w2.length - w1.length; }); var hintDirection = { across: [], down: [] }; for (var i = 0; i < words.length; i++) { var word = words[i]; var direction = randomDirection(); var isAllocated = findCells(word, i, direction); isAllocated && hintDirection[direction].push(word); if (!isAllocated) { var newDirection = otherDirection(direction); isAllocated = findCells(word, i, newDirection); isAllocated && hintDirection[newDirection].push(word); } if (!isAllocated) { console.error("Could not allot word: " + word); } } fillRandomAlphabets(n); return { matrix: matrix, hintDirection: hintDirection }; } };