diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..5c0f15c97403164c68190f722ab1f19f39b5b0d7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Ben Eltschig and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/client/logic/SkribblServer.js b/client/logic/SkribblServer.js index 38c80c78742bab4e21b9e47b1366e6c6a55087a1..0db4d2e71d2275f7c954b12c300f8a8842cf7169 100644 --- a/client/logic/SkribblServer.js +++ b/client/logic/SkribblServer.js @@ -317,12 +317,125 @@ export default class SkribblServer { } /** - * Checks whether a given guess is close to the given word. + * Checks whether a given guess is close to the given word. A guess counts as close, if one letter is wrong, + * two letters are swapped or the guess has one letter too much or too little. * @param {string} guess * @param {string} word - * @todo implement */ - static _isClose(guess,word){ + static _isClose(guess,word) { + guess = guess.toLowerCase(); + word = word.toLowerCase(); + word.replace(/-/g," "); + guess.replace(/-/g," "); + + //if equal + if (guess == word) { + return true; + } + + //either one letter wrong or two letters swapped + if (guess.length == word.length) { + let wordArray = []; + let guessArray = []; + + //makes the string into an array + for (var i = 0; i < word.length; i++) { + wordArray[i] = word.charAt(i); + guessArray[i] = guess.charAt(i); + } + + //Counts the mistakes and their position + let errorCounter = 0; + let errorPos = 0; + + for (var i = 0; i < wordArray.length; i++) { + if (wordArray[i] != guessArray[i]) { + if (errorCounter == 0) { + errorPos = i; + } if (errorCounter == 1) { //if a second mistake occurs, either the letters are swapped or it is not correct + //but there could be a third mistake, so in the case of a swap, true is not directly returned. + if ((wordArray[i] != guessArray[errorPos]) || (wordArray[errorPos] != guessArray[i])) { + return false; + } + } if (errorCounter >= 2) { //with two or more mistakes, the word is not close + return false; + } + errorCounter++; + } + } + + //if it hasnt returned false by now, the guess is close + return true; + } + + //if one letter too much + if (guess.length - 1 == word.length) { + let wordArray = []; + let guessArray = []; + + for (var i = 0; i < word.length; i++) { + wordArray[i] = word.charAt(i); + guessArray[i] = guess.charAt(i); + } + guessArray[guessArray.length] = guess.charAt(guessArray.length); + + let errorCounter = 0; //also the offset + + for (var i = 0; i < wordArray.length; i++) { + if (wordArray[i] != guessArray[i + errorCounter]) { + errorCounter++; + if (errorCounter >= 2) { + return false; + } + } + } + + return true; + } + + //if one letter too little + if (guess.length + 1 == word.length) { + let wordArray = []; + let guessArray = []; + + for (var i = 0; i < guess.length; i++) { + wordArray[i] = word.charAt(i); + guessArray[i] = guess.charAt(i); + } + wordArray[wordArray.length] = word.charAt(wordArray.length); + + let errorCounter = 0; //also the offset + + for (var i = 0; i < guessArray.length; i++) { + if (wordArray[i + errorCounter] != guessArray[i]) { + errorCounter++; + if (errorCounter >= 2) { + return false; + } + } + } + + return true; + } + return false; } + + /** + * Checks if the guess is correct. It is not case-sensitive. + * @param {string} guess + * @param {string} word + */ + static _isCorrect(guess, word) { + guess = guess.toLowerCase(); + word = word.toLowerCase(); + word.replace(/-/g," "); + guess.replace(/-/g," "); + + if (guess == word) { + return true; + } else { + return true; + } + } } \ No newline at end of file