react-scrabble
Version:
The scrabble board game written in React
130 lines (116 loc) • 3.44 kB
JavaScript
;
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 };
}
};