From 6c1bc5105b1d5ed80f95abaf682ef7d861a2fc6f Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 16 Nov 2017 21:47:27 -0800 Subject: [PATCH 1/4] wave 1 complete, player class constructed --- package-lock.json | 123 ++++++++++++++++++++++++++++++++++++++++++++++ scrabble.js | 105 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..80043d7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,123 @@ +{ + "name": "js-scrabble", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "add-matchers": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/add-matchers/-/add-matchers-0.5.0.tgz", + "integrity": "sha1-UCGQ5HUM1XIWGDkyaLYaFXNm52U=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "eslint-plugin-jasmine": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-2.9.1.tgz", + "integrity": "sha1-IuGaWfFvOl9kOgSroEQ40OMEcDA=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "requires": { + "exit": "0.1.2", + "glob": "7.1.2", + "jasmine-core": "2.8.0" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" + }, + "jasmine-expect": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/jasmine-expect/-/jasmine-expect-3.8.1.tgz", + "integrity": "sha512-klARdR5AVX9nZhHhYDlbDYgxgi6kl9DGS0vguhaioKoSwr8HL1uOQ7FFUBASq/sqBL/s2nkh/1efqZ2ugcknFA==", + "requires": { + "add-matchers": "0.5.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/scrabble.js b/scrabble.js index 7a1f161..8a7aa19 100644 --- a/scrabble.js +++ b/scrabble.js @@ -1,14 +1,111 @@ +/* eslint-disable */ const Scrabble = { score: function(word) { - // TODO: implement score - } + if (!word.match(/^([a-zA-Z]){1,7}$/)) { + throw new Error("Not a valid word!"); + } else {word = word.toUpperCase(); + } + + let score = 0; + + if (word.length === 7) { + score += 50; + } else { + score = 0; + } + + let wordArr = word.split(""); + + + wordArr.forEach((letter) => { + switch (letter) { + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + case 'L': + case 'N': + case 'R': + case 'S': + case 'T': + score += 1; + break; + + case 'D': + case 'G': + score += 2; + break; + + case 'B': + case 'C': + case 'M': + case 'P': + score += 3; + break; + + case 'F': + case 'H': + case 'V': + case 'W': + case 'Y': + score += 4; + break; - // TODO: add the highestScoreFrom method + case 'k': + score += 5; + break; + + case 'J': + case 'X': + score += 8; + break; + + case 'Q': + case 'Z': + score += 10; + break; + + default: + throw new Error("Not a valid letter!"); + + } + }); + return score; + }, + + highestScoreFrom: function(arrayOfWords) { + if (arrayOfWords.length === 0) { + throw new Error ("No words...") + } + + let currentWinningWord = arrayOfWords[0]; + let currentWinningScore = this.score(currentWinningWord); + + arrayOfWords.forEach((word) => { + let wordScore = this.score(word); + if (currentWinningScore < wordScore) { + currentWinningWord = word; + currentWinningScore = wordScore; + } else if (currentWinningScore === wordScore) { + if (currentWinningWord.length > word.length) { + if (currentWinningWord.length != 7) + currentWinningWord = word; + }else if (word.length === 7){ + currentWinningWord = word; + } + } + }); + return currentWinningWord + }, }; Scrabble.Player = class { - // TODO: implement the Player class + constructor(name) { + this.name = name; + this.plays = []; + } }; module.exports = Scrabble; From d70bb7aa9b6c84a7d653253440953eac8df8613f Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 16 Nov 2017 21:57:30 -0800 Subject: [PATCH 2/4] added error handling to constructor --- scrabble.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scrabble.js b/scrabble.js index 8a7aa19..2064b99 100644 --- a/scrabble.js +++ b/scrabble.js @@ -103,9 +103,23 @@ const Scrabble = { Scrabble.Player = class { constructor(name) { + if (typeof name != 'string') { + throw new Error ("Name can't be blank"); + } this.name = name; this.plays = []; } + + play(word) { + if (!hasWon()){ + this.plays.push(word); + } else { + return false + } + } + + + }; module.exports = Scrabble; From 6128532060c3e284c260626b3bd12cfb00de7a1e Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 16 Nov 2017 22:58:52 -0800 Subject: [PATCH 3/4] tests passing for all methods --- scrabble.js | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/scrabble.js b/scrabble.js index 2064b99..884c2e4 100644 --- a/scrabble.js +++ b/scrabble.js @@ -110,14 +110,44 @@ Scrabble.Player = class { this.plays = []; } + hasWon() { + if (this.totalScore() >= 100) { + return true; + } else { + return false; + } + } + play(word) { - if (!hasWon()){ + if (typeof word != 'string' || typeof word === 'number') { + throw new Error ("Not a valid word."); + } + if (this.hasWon() === false) { this.plays.push(word); + return true; } else { - return false + return false; } } + totalScore() { + let sumScore = 0; + this.plays.forEach((word) => { + sumScore += Scrabble.score(word); + }); + return sumScore; + } + + + + highestScoringWord() { + return Scrabble.highestScoreFrom(this.plays); + } + + highestWordScore() { + return Scrabble.score(this.highestScoringWord()); + } + }; From 6c0d3d1f3819849f388308295a143eac7c34067c Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 16 Nov 2017 23:21:13 -0800 Subject: [PATCH 4/4] fixed linter errors --- scrabble.js | 102 +++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 54 deletions(-) diff --git a/scrabble.js b/scrabble.js index 884c2e4..feb9db4 100644 --- a/scrabble.js +++ b/scrabble.js @@ -1,9 +1,10 @@ -/* eslint-disable */ + const Scrabble = { score: function(word) { if (!word.match(/^([a-zA-Z]){1,7}$/)) { - throw new Error("Not a valid word!"); - } else {word = word.toUpperCase(); + throw new Error('Not a valid word!'); + } else { + word = word.toUpperCase(); } let score = 0; @@ -29,46 +30,45 @@ const Scrabble = { case 'R': case 'S': case 'T': - score += 1; - break; + score += 1; + break; case 'D': case 'G': - score += 2; - break; + score += 2; + break; case 'B': case 'C': case 'M': case 'P': - score += 3; - break; + score += 3; + break; case 'F': case 'H': case 'V': case 'W': case 'Y': - score += 4; - break; + score += 4; + break; case 'k': - score += 5; - break; + score += 5; + break; case 'J': case 'X': - score += 8; - break; + score += 8; + break; - case 'Q': - case 'Z': + case 'Q': + case 'Z': score += 10; break; default: - throw new Error("Not a valid letter!"); - + throw new Error('Not a valid letter!'); } }); return score; @@ -76,7 +76,7 @@ const Scrabble = { highestScoreFrom: function(arrayOfWords) { if (arrayOfWords.length === 0) { - throw new Error ("No words...") + throw new Error('No words...') } let currentWinningWord = arrayOfWords[0]; @@ -88,12 +88,12 @@ const Scrabble = { currentWinningWord = word; currentWinningScore = wordScore; } else if (currentWinningScore === wordScore) { - if (currentWinningWord.length > word.length) { - if (currentWinningWord.length != 7) - currentWinningWord = word; - }else if (word.length === 7){ - currentWinningWord = word; - } + if (currentWinningWord.length > word.length) { + if (currentWinningWord.length !== 7) + currentWinningWord = word; + } else if (word.length === 7) { + currentWinningWord = word; + } } }); return currentWinningWord @@ -103,8 +103,8 @@ const Scrabble = { Scrabble.Player = class { constructor(name) { - if (typeof name != 'string') { - throw new Error ("Name can't be blank"); + if (typeof name !== 'string') { + throw new Error("Name can't be blank"); } this.name = name; this.plays = []; @@ -113,43 +113,37 @@ Scrabble.Player = class { hasWon() { if (this.totalScore() >= 100) { return true; - } else { - return false; } + return false; } play(word) { - if (typeof word != 'string' || typeof word === 'number') { - throw new Error ("Not a valid word."); + if (typeof word !== 'string' || typeof word === 'number') { + throw new Error('Not a valid word.'); } if (this.hasWon() === false) { - this.plays.push(word); - return true; - } else { - return false; + this.plays.push(word); + return true; } - } - - totalScore() { - let sumScore = 0; - this.plays.forEach((word) => { - sumScore += Scrabble.score(word); - }); - return sumScore; - } - - - - highestScoringWord() { - return Scrabble.highestScoreFrom(this.plays); - } + return false; + } - highestWordScore() { - return Scrabble.score(this.highestScoringWord()); - } + totalScore() { + let sumScore = 0; + this.plays.forEach((word) => { + sumScore += Scrabble.score(word); + }); + return sumScore; + } + highestScoringWord() { + return Scrabble.highestScoreFrom(this.plays); + } + highestWordScore() { + return Scrabble.score(this.highestScoringWord()); + } }; module.exports = Scrabble;