From e14669a479e042efb20a87ac85f02354e7f16916 Mon Sep 17 00:00:00 2001
From: Max Wehmeier <wehmeirm@hu-berlin.de>
Date: Tue, 23 Mar 2021 14:28:09 +0100
Subject: [PATCH] added _isCorrect and _isClose

---
 client/logic/SkribblServer.js | 119 +++++++++++++++++++++++++++++++++-
 1 file changed, 116 insertions(+), 3 deletions(-)

diff --git a/client/logic/SkribblServer.js b/client/logic/SkribblServer.js
index f6a36a2..6a7f06d 100644
--- a/client/logic/SkribblServer.js
+++ b/client/logic/SkribblServer.js
@@ -266,12 +266,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
-- 
GitLab