export const MARKERS = { MISS: 'm', RIGHT_POS: 'g', RIGHT_CHAR: 'y' }; export class GameController { constructor() { this._currentWord = "DEERS"; this._guesses = 5; } wordLength() { return this._currentWord.length; } guesses() { return this._guesses; } checkGuess(guess) { if (guess.length != this._currentWord.length) { throw Error(`Expected length to be ${this._currentWord.length} but was ${guess.length}`); } // Check correct placements let markers = new Array(guess.length); let misses = {}; let hits = {}; for (let i = 0; i < guess.length; i++) { if (guess[i] == this._currentWord[i]) { markers[i] = MARKERS.RIGHT_POS; hits[guess[i]] = MARKERS.RIGHT_POS; } else { if (this._currentWord[i] in misses) { misses[this._currentWord[i]] += 1; } else { misses[this._currentWord[i]] = 1; } } } // Check words that are wrong placement but are in the word // Distribute based on the words position for (let i = 0; i < guess.length; i++) { if (markers[i]) { continue; } if (misses[guess[i]] && misses[guess[i]] > 0) { misses[guess[i]] -= 1; markers[i] = MARKERS.RIGHT_CHAR; if (!hits[guess[i]]) { hits[guess[i]] = MARKERS.RIGHT_CHAR; } } else { if (!hits[guess[i]]) { hits[guess[i]] = MARKERS.MISS; } markers[i] = MARKERS.MISS; } } return { hits: hits, markers: markers }; } }