From 417d7d0117c87125074a53e54442b6597c360d13 Mon Sep 17 00:00:00 2001 From: Steve Bosman Date: Sat, 29 Jan 2022 10:41:23 +0000 Subject: [PATCH 1/4] 96 Word: Remove warnings --- 96_Word/javascript/word.js | 82 +++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/96_Word/javascript/word.js b/96_Word/javascript/word.js index 4df5d3fd..20131805 100644 --- a/96_Word/javascript/word.js +++ b/96_Word/javascript/word.js @@ -10,25 +10,22 @@ function print(str) function input() { - var input_element; - var input_str; return new Promise(function (resolve) { - input_element = document.createElement("INPUT"); + const input_element = document.createElement("INPUT"); print("? "); input_element.setAttribute("type", "text"); input_element.setAttribute("length", "50"); document.getElementById("output").appendChild(input_element); input_element.focus(); - input_str = undefined; input_element.addEventListener("keydown", function (event) { - if (event.keyCode == 13) { - input_str = input_element.value; - document.getElementById("output").removeChild(input_element); - print(input_str); - print("\n"); - resolve(input_str); + if (event.keyCode === 13) { + const input_str = input_element.value; + document.getElementById("output").removeChild(input_element); + print(input_str); + print("\n"); + resolve(input_str); } }); }); @@ -36,21 +33,21 @@ function input() function tab(space) { - var str = ""; + let str = ""; while (space-- > 0) str += " "; return str; } -var words = ["DINKY", "SMOKE", "WATER", "GLASS", "TRAIN", +const words = ["DINKY", "SMOKE", "WATER", "GLASS", "TRAIN", "MIGHT", "FIRST", "CANDY", "CHAMP", "WOULD", "CLUMP", "DOPEY"]; -var s = []; -var a = []; -var l = []; -var d = []; -var p = []; +const s = []; +const a = []; +const l = []; +const d = []; +const p = []; // Main control section async function main() @@ -68,47 +65,48 @@ async function main() print("\n"); print("\n"); print("YOU ARE STARTING A NEW GAME...\n"); - n = words.length; - ss = words[Math.floor(Math.random() * n)]; - g = 0; + let n = words.length; + let ss = words[Math.floor(Math.random() * n)]; + let g = 0; s[0] = ss.length; - for (i = 1; i <= ss.length; i++) + for (let i = 1; i <= ss.length; i++) s[i] = ss.charCodeAt(i - 1); - for (i = 1; i <= 5; i++) + for (let i = 1; i <= 5; i++) a[i] = 45; - for (j = 1; j <= 5; j++) + for (let j = 1; j <= 5; j++) p[j] = 0; + let ls = undefined; while (1) { print("GUESS A FIVE LETTER WORD"); ls = await input(); g++; - if (ss == ls) + if (ss === ls) break; - for (i = 1; i <= 7; i++) + for (let i = 1; i <= 7; i++) p[i] = 0; l[0] = ls.length; - for (i = 1; i <= ls.length; i++) { + for (let i = 1; i <= ls.length; i++) { l[i] = ls.charCodeAt(i - 1); } - if (l[1] == 63) { + if (l[1] === 63) { print("THE SECRET WORD IS " + ss + "\n"); print("\n"); break; } - if (l[0] != 5) { + if (l[0] !== 5) { print("YOU MUST GUESS A 5 LETTER WORD. START AGAIN.\n"); print("\n"); g--; continue; } - m = 0; - q = 1; - for (i = 1; i <= 5; i++) { - for (j = 1; j <= 5; j++) { - if (s[i] == l[j]) { + let m = 0; + let q = 1; + for (let i = 1; i <= 5; i++) { + for (let j = 1; j <= 5; j++) { + if (s[i] === l[j]) { p[q] = l[j]; q++; - if (i == j) + if (i === j) a[j] = l[j]; m++; } @@ -116,15 +114,15 @@ async function main() } a[0] = 5; p[0] = m; - as = ""; - for (i = 1; i <= a[0]; i++) + let as = ""; + for (let i = 1; i <= a[0]; i++) as += String.fromCharCode(a[i]); - ps = ""; - for (i = 1; i <= p[0]; i++) + let ps = ""; + for (let i = 1; i <= p[0]; i++) ps += String.fromCharCode(p[i]); print("THERE WERE " + m + " MATCHES AND THE COMMON LETTERS WERE... " + ps + "\n"); print("FROM THE EXACT LETTER MATCHES, YOU KNOW............ " + as + "\n"); - if (as == ss) { + if (as === ss) { ls = as; break; } @@ -134,15 +132,15 @@ async function main() print("\n"); } } - if (ss == ls) { + if (ss === ls) { print("YOU HAVE GUESSED THE WORD. IT TOOK " + g + " GUESSES!\n"); print("\n"); } else { continue; } print("WANT TO PLAY AGAIN"); - qs = await input(); - if (qs != "YES") + let qs = await input(); + if (qs !== "YES") break; } } From ff61ec7d07015eb633500b06510d6777d420f2e1 Mon Sep 17 00:00:00 2001 From: Steve Bosman Date: Sat, 29 Jan 2022 10:44:26 +0000 Subject: [PATCH 2/4] 96 Word: Make game case-insensitive --- 96_Word/javascript/word.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/96_Word/javascript/word.js b/96_Word/javascript/word.js index 20131805..8e5d4551 100644 --- a/96_Word/javascript/word.js +++ b/96_Word/javascript/word.js @@ -78,7 +78,7 @@ async function main() let ls = undefined; while (1) { print("GUESS A FIVE LETTER WORD"); - ls = await input(); + ls = (await input()).toUpperCase(); g++; if (ss === ls) break; @@ -139,7 +139,7 @@ async function main() continue; } print("WANT TO PLAY AGAIN"); - let qs = await input(); + let qs = (await input()).toUpperCase(); if (qs !== "YES") break; } From 41b10c4d8a9dfad42776eae6fc67341d21ce11ef Mon Sep 17 00:00:00 2001 From: Steve Bosman Date: Sat, 29 Jan 2022 11:41:24 +0000 Subject: [PATCH 3/4] 96 Word: Name the variables --- 96_Word/javascript/word.js | 105 ++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 49 deletions(-) diff --git a/96_Word/javascript/word.js b/96_Word/javascript/word.js index 8e5d4551..0d0ebe33 100644 --- a/96_Word/javascript/word.js +++ b/96_Word/javascript/word.js @@ -43,11 +43,10 @@ const words = ["DINKY", "SMOKE", "WATER", "GLASS", "TRAIN", "MIGHT", "FIRST", "CANDY", "CHAMP", "WOULD", "CLUMP", "DOPEY"]; -const s = []; -const a = []; -const l = []; -const d = []; -const p = []; +const secretWordDetails = []; +const knownLettersDetails = []; +const guessDetails = []; +const lettersInCommonDetails = []; // Main control section async function main() @@ -65,82 +64,90 @@ async function main() print("\n"); print("\n"); print("YOU ARE STARTING A NEW GAME...\n"); - let n = words.length; - let ss = words[Math.floor(Math.random() * n)]; - let g = 0; - s[0] = ss.length; - for (let i = 1; i <= ss.length; i++) - s[i] = ss.charCodeAt(i - 1); + + const n = words.length; + const secretWord = words[Math.floor(Math.random() * n)]; + + let guessCount = 0; + secretWordDetails[0] = secretWord.length; + for (let i = 1; i <= secretWord.length; i++) + secretWordDetails[i] = secretWord.charCodeAt(i - 1); for (let i = 1; i <= 5; i++) - a[i] = 45; + knownLettersDetails[i] = "-".charCodeAt(0); for (let j = 1; j <= 5; j++) - p[j] = 0; - let ls = undefined; + lettersInCommonDetails[j] = 0; + + let guess = undefined; while (1) { print("GUESS A FIVE LETTER WORD"); - ls = (await input()).toUpperCase(); - g++; - if (ss === ls) + guess = (await input()).toUpperCase(); + guessCount++; + if (secretWord === guess) break; for (let i = 1; i <= 7; i++) - p[i] = 0; - l[0] = ls.length; - for (let i = 1; i <= ls.length; i++) { - l[i] = ls.charCodeAt(i - 1); + lettersInCommonDetails[i] = 0; + + // store detail about the guess + guessDetails[0] = guess.length; + for (let i = 1; i <= guess.length; i++) { + guessDetails[i] = guess.charCodeAt(i - 1); } - if (l[1] === 63) { - print("THE SECRET WORD IS " + ss + "\n"); + + if (guessDetails[1] === 63) { + print("THE SECRET WORD IS " + secretWord + "\n"); print("\n"); break; } - if (l[0] !== 5) { + if (guessDetails[0] !== 5) { print("YOU MUST GUESS A 5 LETTER WORD. START AGAIN.\n"); print("\n"); - g--; + guessCount--; continue; } - let m = 0; - let q = 1; + let lettersInCommonCount = 0; + let nextCorrectLetterIndex = 1; for (let i = 1; i <= 5; i++) { for (let j = 1; j <= 5; j++) { - if (s[i] === l[j]) { - p[q] = l[j]; - q++; + if (secretWordDetails[i] === guessDetails[j]) { + lettersInCommonDetails[nextCorrectLetterIndex] = guessDetails[j]; + nextCorrectLetterIndex++; if (i === j) - a[j] = l[j]; - m++; + knownLettersDetails[j] = guessDetails[j]; + lettersInCommonCount++; } } } - a[0] = 5; - p[0] = m; - let as = ""; - for (let i = 1; i <= a[0]; i++) - as += String.fromCharCode(a[i]); - let ps = ""; - for (let i = 1; i <= p[0]; i++) - ps += String.fromCharCode(p[i]); - print("THERE WERE " + m + " MATCHES AND THE COMMON LETTERS WERE... " + ps + "\n"); - print("FROM THE EXACT LETTER MATCHES, YOU KNOW............ " + as + "\n"); - if (as === ss) { - ls = as; + knownLettersDetails[0] = 5; + lettersInCommonDetails[0] = lettersInCommonCount; + + let lettersInCommonText = ""; + for (let i = 1; i <= lettersInCommonDetails[0]; i++) + lettersInCommonText += String.fromCharCode(lettersInCommonDetails[i]); + print("THERE WERE " + lettersInCommonCount + " MATCHES AND THE COMMON LETTERS WERE... " + lettersInCommonText + "\n"); + + let knownLettersText = ""; + for (let i = 1; i <= knownLettersDetails[0]; i++) + knownLettersText += String.fromCharCode(knownLettersDetails[i]); + print("FROM THE EXACT LETTER MATCHES, YOU KNOW............ " + knownLettersText + "\n"); + if (knownLettersText === secretWord) { + guess = knownLettersText; break; } - if (m <= 1) { + if (lettersInCommonCount <= 1) { print("\n"); print("IF YOU GIVE UP, TYPE '?' FOR YOUR NEXT GUESS.\n"); print("\n"); } } - if (ss === ls) { - print("YOU HAVE GUESSED THE WORD. IT TOOK " + g + " GUESSES!\n"); + if (secretWord === guess) { + print("YOU HAVE GUESSED THE WORD. IT TOOK " + guessCount + " GUESSES!\n"); print("\n"); } else { continue; } print("WANT TO PLAY AGAIN"); - let qs = (await input()).toUpperCase(); - if (qs !== "YES") + const playAgainResponse = (await input()).toUpperCase(); + if (playAgainResponse !== "YES") break; } } From 4c49492449b78c7449c815b06fe41457dcbe8fcd Mon Sep 17 00:00:00 2001 From: Steve Bosman Date: Sat, 29 Jan 2022 17:07:45 +0000 Subject: [PATCH 4/4] 96 Word: Simplify use of arrays; add some comments --- 96_Word/javascript/word.js | 91 ++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/96_Word/javascript/word.js b/96_Word/javascript/word.js index 0d0ebe33..3d7e3a5a 100644 --- a/96_Word/javascript/word.js +++ b/96_Word/javascript/word.js @@ -39,14 +39,11 @@ function tab(space) return str; } -const words = ["DINKY", "SMOKE", "WATER", "GLASS", "TRAIN", +// These are the words that the game knows about> If you want a bigger challenge you could add more words to the array +const WORDS = ["DINKY", "SMOKE", "WATER", "GLASS", "TRAIN", "MIGHT", "FIRST", "CANDY", "CHAMP", "WOULD", "CLUMP", "DOPEY"]; - -const secretWordDetails = []; -const knownLettersDetails = []; -const guessDetails = []; -const lettersInCommonDetails = []; +const WORD_COUNT = WORDS.length; // Main control section async function main() @@ -60,91 +57,87 @@ async function main() print("CLUES TO HELP YOU GET IT. GOOD LUCK!!\n"); print("\n"); print("\n"); - while (1) { + outer: while (1) { print("\n"); print("\n"); print("YOU ARE STARTING A NEW GAME...\n"); - const n = words.length; - const secretWord = words[Math.floor(Math.random() * n)]; + const secretWord = WORDS[Math.floor(Math.random() * WORD_COUNT)]; let guessCount = 0; - secretWordDetails[0] = secretWord.length; - for (let i = 1; i <= secretWord.length; i++) - secretWordDetails[i] = secretWord.charCodeAt(i - 1); - for (let i = 1; i <= 5; i++) - knownLettersDetails[i] = "-".charCodeAt(0); - for (let j = 1; j <= 5; j++) - lettersInCommonDetails[j] = 0; + // This array holds the letters which have been found in the correct position across all guesses + // For instance if the word is "PLAIN" and the guesses so far are + // "SHALL" ("A" correct) and "CLIMB" ("L" correct) then it will hold "-LA--" + const knownLetters = []; + for (let i = 0; i < 5; i++) + knownLetters[i] = "-"; let guess = undefined; while (1) { print("GUESS A FIVE LETTER WORD"); guess = (await input()).toUpperCase(); guessCount++; - if (secretWord === guess) + if (secretWord === guess) { + // The player has guessed correctly break; - for (let i = 1; i <= 7; i++) - lettersInCommonDetails[i] = 0; - - // store detail about the guess - guessDetails[0] = guess.length; - for (let i = 1; i <= guess.length; i++) { - guessDetails[i] = guess.charCodeAt(i - 1); } - if (guessDetails[1] === 63) { + if (guess.charAt(0) === "?") { + // Player has given up print("THE SECRET WORD IS " + secretWord + "\n"); print("\n"); - break; + // Start a new game by going to the start of the outer while loop + continue outer; } - if (guessDetails[0] !== 5) { + + if (guess.length !== 5) { print("YOU MUST GUESS A 5 LETTER WORD. START AGAIN.\n"); print("\n"); guessCount--; continue; } + + // Two things happen in this double loop: + // 1. Letters which are in both the guessed and secret words are put in the lettersInCommon array + // 2. Letters which are in the correct position in the guessed word are added to the knownLetters array let lettersInCommonCount = 0; - let nextCorrectLetterIndex = 1; - for (let i = 1; i <= 5; i++) { - for (let j = 1; j <= 5; j++) { - if (secretWordDetails[i] === guessDetails[j]) { - lettersInCommonDetails[nextCorrectLetterIndex] = guessDetails[j]; - nextCorrectLetterIndex++; - if (i === j) - knownLettersDetails[j] = guessDetails[j]; + const lettersInCommon = []; + for (let i = 0; i < 5; i++) {// loop round characters in secret word + let secretWordCharacter = secretWord.charAt(i); + for (let j = 0; j < 5; j++) {// loop round characters in guessed word + let guessedWordCharacter = guess.charAt(j); + if (secretWordCharacter === guessedWordCharacter) { + lettersInCommon[lettersInCommonCount] = guessedWordCharacter; + if (i === j) { + // Letter is in the exact position so add to the known letters array + knownLetters[j] = guessedWordCharacter; + } lettersInCommonCount++; } } } - knownLettersDetails[0] = 5; - lettersInCommonDetails[0] = lettersInCommonCount; - let lettersInCommonText = ""; - for (let i = 1; i <= lettersInCommonDetails[0]; i++) - lettersInCommonText += String.fromCharCode(lettersInCommonDetails[i]); + const lettersInCommonText = lettersInCommon.join(""); print("THERE WERE " + lettersInCommonCount + " MATCHES AND THE COMMON LETTERS WERE... " + lettersInCommonText + "\n"); - let knownLettersText = ""; - for (let i = 1; i <= knownLettersDetails[0]; i++) - knownLettersText += String.fromCharCode(knownLettersDetails[i]); + const knownLettersText = knownLetters.join(""); print("FROM THE EXACT LETTER MATCHES, YOU KNOW............ " + knownLettersText + "\n"); + if (knownLettersText === secretWord) { guess = knownLettersText; break; } + if (lettersInCommonCount <= 1) { print("\n"); print("IF YOU GIVE UP, TYPE '?' FOR YOUR NEXT GUESS.\n"); print("\n"); } } - if (secretWord === guess) { - print("YOU HAVE GUESSED THE WORD. IT TOOK " + guessCount + " GUESSES!\n"); - print("\n"); - } else { - continue; - } + + print("YOU HAVE GUESSED THE WORD. IT TOOK " + guessCount + " GUESSES!\n"); + print("\n"); + print("WANT TO PLAY AGAIN"); const playAgainResponse = (await input()).toUpperCase(); if (playAgainResponse !== "YES")