209 lines
3.9 KiB
JavaScript
209 lines
3.9 KiB
JavaScript
import wordExists from "word-exists";
|
|
import { generate } from "random-words";
|
|
|
|
export let WordLegnth = $state({ v: 5 });
|
|
|
|
let CorrectWord = generate({
|
|
minLength: WordLegnth.v,
|
|
maxLength: WordLegnth.v,
|
|
});
|
|
|
|
console.log("CorrectWord: ", CorrectWord);
|
|
export let words = $state({ v: [] });
|
|
export let CurrentWord = $state({ v: [] });
|
|
export let keys = $state({
|
|
v: [
|
|
["Q", "n"],
|
|
["W", "n"],
|
|
["E", "n"],
|
|
["R", "n"],
|
|
["T", "n"],
|
|
["Y", "n"],
|
|
["U", "n"],
|
|
["I", "n"],
|
|
["O", "n"],
|
|
["P", "n"],
|
|
["A", "n"],
|
|
["S", "n"],
|
|
["D", "n"],
|
|
["F", "n"],
|
|
["G", "n"],
|
|
["H", "n"],
|
|
["J", "n"],
|
|
["K", "n"],
|
|
["L", "n"],
|
|
["⌫", "o"],
|
|
["Z", "n"],
|
|
["X", "n"],
|
|
["C", "n"],
|
|
["V", "n"],
|
|
["B", "n"],
|
|
["N", "n"],
|
|
["M", "n"],
|
|
["⏎", "o"],
|
|
],
|
|
});
|
|
|
|
export function newGame() {
|
|
CorrectWord = generate({
|
|
minLength: WordLegnth.v,
|
|
maxLength: WordLegnth.v,
|
|
});
|
|
console.log("CorrectWord: ", CorrectWord);
|
|
words.v = [];
|
|
CurrentWord.v = [];
|
|
keys.v = [
|
|
["Q", "n"],
|
|
["W", "n"],
|
|
["E", "n"],
|
|
["R", "n"],
|
|
["T", "n"],
|
|
["Y", "n"],
|
|
["U", "n"],
|
|
["I", "n"],
|
|
["O", "n"],
|
|
["P", "n"],
|
|
["A", "n"],
|
|
["S", "n"],
|
|
["D", "n"],
|
|
["F", "n"],
|
|
["G", "n"],
|
|
["H", "n"],
|
|
["J", "n"],
|
|
["K", "n"],
|
|
["L", "n"],
|
|
["⌫", "o"],
|
|
["Z", "n"],
|
|
["X", "n"],
|
|
["C", "n"],
|
|
["V", "n"],
|
|
["B", "n"],
|
|
["N", "n"],
|
|
["M", "n"],
|
|
["⏎", "o"],
|
|
];
|
|
}
|
|
|
|
function GameWin() {
|
|
alert("You win!");
|
|
data.value[WordLegnth.v].push(words.v.length);
|
|
|
|
newGame();
|
|
}
|
|
|
|
function SendWord(word) {
|
|
let result = Array(word.length).fill(null);
|
|
let used = Array(CorrectWord.length).fill(false);
|
|
|
|
// First pass: exact matches
|
|
for (let i = 0; i < word.length; i++) {
|
|
if (word[i].toLowerCase() === CorrectWord[i].toLowerCase()) {
|
|
result[i] = [word[i].toUpperCase(), "c"];
|
|
used[i] = true;
|
|
}
|
|
}
|
|
|
|
// Second pass: wrong place but correct letter
|
|
for (let i = 0; i < word.length; i++) {
|
|
if (result[i]) continue;
|
|
|
|
let found = false;
|
|
for (let j = 0; j < CorrectWord.length; j++) {
|
|
if (
|
|
!used[j] &&
|
|
word[i].toLowerCase() === CorrectWord[j].toLowerCase()
|
|
) {
|
|
found = true;
|
|
used[j] = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
result[i] = found
|
|
? [word[i].toUpperCase(), "d"]
|
|
: [word[i].toUpperCase(), "w"];
|
|
}
|
|
|
|
words.v.push(result);
|
|
|
|
setTimeout(() => {
|
|
document.getElementById("DisplayOfWords").scrollTo({
|
|
top: document.getElementById("DisplayOfWords").scrollHeight,
|
|
behavior: "smooth",
|
|
});
|
|
}, 100);
|
|
|
|
// Update keyboard status
|
|
for (let [letter, status] of result) {
|
|
let keyIndex = keys.v.findIndex(
|
|
(k) => k[0].toLowerCase() === letter.toLowerCase()
|
|
);
|
|
if (keyIndex !== -1) {
|
|
let current = keys.v[keyIndex][1];
|
|
if (status === "c") {
|
|
keys.v[keyIndex][1] = "c";
|
|
} else if (status === "d" && current === "n") {
|
|
keys.v[keyIndex][1] = "d";
|
|
} else if (status === "w" && current === "n") {
|
|
keys.v[keyIndex][1] = "w";
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check for win
|
|
if (result.every(([_, status]) => status === "c")) {
|
|
GameWin();
|
|
}
|
|
}
|
|
|
|
export function ButtonPressed(key) {
|
|
document.getElementById("DisplayOfWords").scrollTo({
|
|
top: document.getElementById("DisplayOfWords").scrollHeight,
|
|
behavior: "smooth",
|
|
});
|
|
|
|
if (key === "⏎") {
|
|
if (CurrentWord.v.length === WordLegnth.v) {
|
|
let word = CurrentWord.v.join("").toUpperCase();
|
|
if (wordExists(word)) {
|
|
SendWord(CurrentWord.v);
|
|
CurrentWord.v = [];
|
|
} else {
|
|
alert("Not a valid word");
|
|
}
|
|
}
|
|
return;
|
|
} else if (key === "⌫") {
|
|
CurrentWord.v.pop();
|
|
return;
|
|
}
|
|
if (CurrentWord.v.length === WordLegnth.v) {
|
|
return;
|
|
}
|
|
|
|
CurrentWord.v.push(key);
|
|
}
|
|
export function handleKey(event) {
|
|
const key = event.key.toLowerCase();
|
|
|
|
if (key === "enter") {
|
|
ButtonPressed("⏎");
|
|
} else if (key === "backspace") {
|
|
ButtonPressed("⌫");
|
|
} else if (/^[a-z]$/.test(key)) {
|
|
ButtonPressed(key.toUpperCase());
|
|
}
|
|
}
|
|
|
|
export let data = $state({
|
|
value: {
|
|
3: [],
|
|
4: [],
|
|
5: [],
|
|
6: [],
|
|
7: [],
|
|
8: [],
|
|
9: [],
|
|
10: [],
|
|
},
|
|
});
|