Files
awo-hamburg-intranet/module/intranet/playground/wordle.js
2026-02-17 14:56:23 +01:00

1834 lines
31 KiB
JavaScript

const words = [
"aalen",
"Abart",
"abbat",
"Abbau",
"abbog",
"Abend",
"abgab",
"Abgas",
"abhob",
"Abhol",
"abkam",
"ablag",
"Abort",
"Abruf",
"absah",
"Absud",
"abtat",
"Abtei",
"abtun",
"Abweg",
"abwog",
"abzog",
"Abzug",
"Achse",
"Acker",
"Acryl",
"Adams",
"adeln",
"Adels",
"adieu",
"Adler",
"adlig",
"Affen",
"affig",
"After",
"Agave",
"Agent",
"Agrar",
"ahmen",
"ahnen",
"Ahorn",
"Akten",
"Aktie",
"aktiv",
"Aktor",
"Alarm",
"Alben",
"Album",
"alert",
"alias",
"Alibi",
"Allee",
"allwo",
"allzu",
"Alpen",
"Alpha",
"alpin",
"Altar",
"Alten",
"Alter",
"Ammen",
"Ampel",
"Amsel",
"amten",
"Anbau",
"anbei",
"anbot",
"andre",
"angab",
"Angel",
"angst",
"anhob",
"ankam",
"Anker",
"Anmut",
"Anruf",
"ansah",
"antat",
"antik",
"antun",
"anzog",
"Anzug",
"apart",
"Apfel",
"April",
"Apsis",
"Arche",
"Areal",
"Arena",
"Arier",
"Armee",
"Armen",
"Armut",
"Aroma",
"Arsch",
"Arsen",
"arten",
"artig",
"Asche",
"Asien",
"Asket",
"Aspik",
"Assel",
"Aster",
"Astro",
"Atlas",
"atmen",
"Atoll",
"Audio",
"Augen",
"Autor",
"Axiom",
"baden",
"Bahre",
"Bambi",
"banal",
"Bande",
"Banjo",
"Barde",
"Baron",
"barst",
"basal",
"Basar",
"Basis",
"Batik",
"Bauch",
"bauen",
"Bauer",
"beben",
"Beere",
"begab",
"beide",
"beige",
"bekam",
"Belag",
"Beleg",
"belud",
"Berge",
"Beruf",
"besah",
"Besen",
"beste",
"beten",
"Beton",
"Beuge",
"Beule",
"Beute",
"bevor",
"bewog",
"Bezug",
"Bibel",
"Biber",
"Biene",
"Biest",
"Binde",
"Binse",
"birgt",
"Birke",
"Birne",
"Bitte",
"Biwak",
"blank",
"Blase",
"blass",
"Blatt",
"Blech",
"blich",
"Blick",
"blieb",
"blies",
"blind",
"Blink",
"Blitz",
"Block",
"blond",
"Bluff",
"Blume",
"Bluse",
"Boden",
"Bogen",
"Bohle",
"Bohne",
"Bombe",
"Bongo",
"Bonus",
"Bonze",
"Boots",
"Borke",
"Borte",
"Boten",
"Bowle",
"boxen",
"Boxer",
"brach",
"Brand",
"Braue",
"braun",
"Braut",
"Brech",
"breit",
"Brems",
"Brenn",
"Brett",
"Brief",
"briet",
"Brise",
"Brite",
"Bruch",
"Brumm",
"Brust",
"Buben",
"buhen",
"Bulle",
"Busch",
"Busen",
"Butan",
"Butze",
"Celli",
"Cello",
"Chaos",
"Chaot",
"Chlor",
"Choke",
"Chrom",
"Civil",
"Clown",
"Cobra",
"Codex",
"Comic",
"Couch",
"Coupe",
"Creme",
"Curry",
"dabei",
"Dachs",
"daher",
"dahin",
"Damen",
"damit",
"Dampf",
"Dandy",
"daran",
"darum",
"Datei",
"Daten",
"Datex",
"Dativ",
"Datum",
"Dauer",
"Daune",
"davon",
"davor",
"debil",
"Degen",
"Deich",
"Dekan",
"Dekor",
"Delle",
"Delta",
"Demut",
"Depot",
"derer",
"desto",
"Devon",
"devot",
"dicht",
"Diele",
"Dildo",
"Dinar",
"Diode",
"Dirne",
"Diwan",
"Docht",
"Dogge",
"Dogma",
"Dohle",
"Dolch",
"Donau",
"Dosen",
"Dosis",
"Draht",
"drall",
"Drama",
"drang",
"drauf",
"Dreck",
"Drift",
"Drink",
"dritt",
"Droge",
"Druck",
"Dudel",
"Duell",
"Duett",
"dumpf",
"Dunst",
"durch",
"Durst",
"Dusch",
"Dusel",
"duzen",
"ebben",
"Ebene",
"ebnen",
"ecken",
"eckig",
"Edukt",
"ehren",
"Eiche",
"Eifer",
"eigen",
"eilen",
"eilig",
"Eimer",
"einen",
"einig",
"Eisen",
"eisig",
"eitel",
"Eiter",
"ekeln",
"Eklat",
"eklig",
"Ekzem",
"elend",
"Elfen",
"Elite",
"Ellen",
"empor",
"emsig",
"enden",
"Engel",
"engen",
"Enkel",
"enorm",
"Enten",
"Enzym",
"erbat",
"erben",
"Erbin",
"Erbse",
"erden",
"erdig",
"ergab",
"Erker",
"erlag",
"ernst",
"Ernte",
"erzog",
"Esche",
"Essen",
"Esser",
"Essig",
"Etage",
"Ethik",
"Ethos",
"Eulen",
"Euter",
"exakt",
"extra",
"Fabel",
"Faden",
"Fahne",
"Fahrt",
"Falke",
"Falle",
"falls",
"Falte",
"famos",
"Fango",
"Farbe",
"Fasan",
"Faser",
"fatal",
"Fatum",
"Fauna",
"Faust",
"faxen",
"Fazit",
"Fecht",
"Feder",
"fegen",
"Feger",
"Fehde",
"Feier",
"Feile",
"feind",
"Felge",
"Ferse",
"fesch",
"Feuer",
"Fibel",
"Fiber",
"fidel",
"Figur",
"Filet",
"final",
"finit",
"Finne",
"Finte",
"Firma",
"First",
"Fisch",
"fixen",
"Fixer",
"Fjord",
"flach",
"Flair",
"Flaum",
"Fleck",
"flink",
"Flirt",
"Flora",
"floss",
"flott",
"Fluch",
"flugs",
"Fluid",
"Fluor",
"Fluss",
"focht",
"Fokus",
"Folge",
"Folie",
"Foren",
"Forst",
"Forum",
"Foyer",
"Frack",
"Frage",
"Franc",
"Freak",
"frech",
"fremd",
"Fress",
"Freud",
"Frist",
"fromm",
"Front",
"Frost",
"Frust",
"Fuchs",
"Fuder",
"Fugen",
"Fuhre",
"Furie",
"Fusel",
"Futur",
"Gabel",
"Galle",
"Garbe",
"Garde",
"garni",
"Gasse",
"Gassi",
"Gatte",
"Gauda",
"gebar",
"geben",
"Geber",
"Gebet",
"Gebot",
"gegen",
"gehen",
"Geier",
"Geige",
"Geist",
"Gelee",
"genau",
"Genie",
"Genom",
"Genre",
"genug",
"Genus",
"Geste",
"getan",
"Getto",
"Getue",
"Gicht",
"Gilde",
"Ginko",
"Glanz",
"glatt",
"Gleis",
"Gleit",
"glich",
"Glied",
"Glimm",
"glitt",
"Gnade",
"Gosse",
"Gouda",
"Gramm",
"Graph",
"Greif",
"Greis",
"grell",
"Grenz",
"griff",
"Grill",
"Grips",
"Groll",
"Grube",
"Gruft",
"Grund",
"Gulag",
"Gummi",
"Gunst",
"Gurke",
"Gusto",
"haben",
"Hades",
"Hafen",
"Hafer",
"Hagel",
"hager",
"haken",
"Halde",
"hallo",
"Halte",
"Handy",
"Hanse",
"Harem",
"Harfe",
"Hasel",
"Hasen",
"hatte",
"Haube",
"Hauch",
"hauen",
"Hauer",
"Haupt",
"Hebel",
"heben",
"Heber",
"Hecht",
"hegen",
"Heide",
"Helot",
"Henne",
"herab",
"heran",
"herum",
"herzu",
"heuer",
"heute",
"hexen",
"Hexer",
"hielt",
"Hilfe",
"Hilfs",
"hilft",
"hinab",
"hinan",
"Hindu",
"hinzu",
"Hirse",
"Hirte",
"Hitze",
"Hobby",
"Hobel",
"Hoden",
"holen",
"Honig",
"Horde",
"Horst",
"Hosen",
"Hotel",
"human",
"humid",
"Humor",
"Humus",
"Hunde",
"Hunne",
"hupen",
"huren",
"hurra",
"Husar",
"Hydra",
"Hymne",
"ideal",
"Ideen",
"Idiot",
"Idyll",
"Ihnen",
"igeln",
"Ikone",
"Iltis",
"Image",
"Imker",
"immer",
"immun",
"indem",
"indes",
"Index",
"Indio",
"Indiz",
"infam",
"Innen",
"innig",
"Insel",
"intim",
"intus",
"Ionen",
"irden",
"irren",
"irrig",
"Islam",
"Jacht",
"Jacke",
"jagen",
"Japan",
"jeher",
"jetzt",
"Joker",
"Jolle",
"Joule",
"Jubel",
"Juden",
"Jumbo",
"Junge",
"Juras",
"Juror",
"Juwel",
"Kabel",
"Kader",
"Kakao",
"Kalbs",
"Kalif",
"Kamel",
"Kamin",
"Kampf",
"Kanal",
"Kanne",
"Kanon",
"Kante",
"Kappe",
"Karat",
"Karre",
"Karte",
"Kasko",
"Kasse",
"Kasus",
"Kater",
"Katze",
"kauen",
"Kegel",
"Kehle",
"Kelch",
"Kelle",
"Kerze",
"Kette",
"Keule",
"Kiepe",
"Kiosk",
"Kippe",
"Kirch",
"Kiste",
"Klage",
"klamm",
"klang",
"Klapp",
"Klebe",
"Kleid",
"Kleie",
"klein",
"Klemm",
"Klick",
"Klima",
"klipp",
"Klops",
"Klotz",
"Kluft",
"Knabe",
"Knack",
"Knall",
"knapp",
"Knast",
"Knauf",
"Knick",
"knien",
"kniff",
"Knopf",
"Kobra",
"Kodex",
"Kohle",
"Kokon",
"Kolik",
"Komet",
"Komik",
"Komma",
"Konto",
"Kopie",
"Koran",
"Korps",
"Korso",
"Kosak",
"Krach",
"kraft",
"Krake",
"krank",
"Kranz",
"krass",
"kraus",
"Kraut",
"Krebs",
"Kreis",
"Krepp",
"Kreuz",
"Krieg",
"Krimi",
"Krise",
"kroch",
"Krone",
"Kropf",
"kross",
"Krume",
"krumm",
"Kuben",
"Kubus",
"Kugel",
"Kuhle",
"Kunde",
"Kunst",
"Kupee",
"Kupon",
"Kuppe",
"kuren",
"Kurie",
"Kurve",
"laben",
"labil",
"Labor",
"Lache",
"Lachs",
"laden",
"Lader",
"Lagen",
"Lager",
"Lakai",
"Laken",
"Lamee",
"Lampe",
"Lande",
"Lanze",
"Larve",
"Laser",
"Lasso",
"Latex",
"Latte",
"Laube",
"Lauch",
"Lauer",
"Laune",
"leben",
"Leber",
"Leder",
"ledig",
"legal",
"legen",
"leger",
"Lehne",
"Lehre",
"leibt",
"Leier",
"Leine",
"leise",
"Lemma",
"Lende",
"Lepra",
"Lesbe",
"lesen",
"Leser",
"Letzt",
"Leute",
"Liane",
"licht",
"Liebe",
"Liege",
"liest",
"Ligen",
"Lilie",
"Limes",
"Limit",
"Linde",
"Linie",
"linke",
"links",
"Linse",
"Lippe",
"Liter",
"Litze",
"Lobby",
"loben",
"Logik",
"Logis",
"lokal",
"losen",
"loten",
"Lotos",
"Lotse",
"Lotto",
"loyal",
"Luchs",
"Luder",
"lugen",
"Lunge",
"Lunte",
"Luxus",
"Lymph",
"Lyrik",
"Macho",
"Macht",
"Macke",
"madig",
"Mafia",
"Magen",
"mager",
"Magie",
"Magma",
"magst",
"Major",
"Makel",
"Makro",
"malen",
"Maler",
"Malus",
"Malve",
"manch",
"Manie",
"Manko",
"Manna",
"Mappe",
"Marge",
"Markt",
"Maske",
"Masse",
"Mauer",
"Media",
"Meile",
"Meise",
"meist",
"Melde",
"Menge",
"Mensa",
"Messe",
"Meter",
"Meute",
"Miene",
"Miete",
"Mieze",
"Mikro",
"Milan",
"Milbe",
"Milch",
"Miliz",
"Mimik",
"Minen",
"minus",
"Misch",
"Mitte",
"mixen",
"Mixer",
"mobil",
"Modul",
"Modus",
"Mogul",
"Mokka",
"Monat",
"Moped",
"Moral",
"Morse",
"Motel",
"Motiv",
"Motor",
"Motte",
"Motto",
"Muffe",
"Mulde",
"Multi",
"Mumie",
"Murks",
"Musik",
"musst",
"muten",
"mutig",
"Mutti",
"Myrre",
"Nabel",
"Nacht",
"nackt",
"Nadel",
"Nagel",
"nagen",
"Nager",
"nahen",
"Namen",
"Narbe",
"Nasen",
"nativ",
"Natur",
"Nebel",
"neben",
"nebst",
"Neffe",
"Nelke",
"netto",
"neuer",
"neunt",
"nicht",
"Niere",
"Niete",
"nimmt",
"nobel",
"Nomen",
"Nonne",
"norme",
"Notar",
"Noten",
"Notiz",
"Novum",
"Nudel",
"Nugat",
"Nylon",
"Obhut",
"oblag",
"ocker",
"Odium",,
"offen",
"Oheim",
"Ohren",
"Oktan",
"Oktav",
"Olive",
"Olymp",
"Onkel",
"Opern",
"Opfer",
"Opium",
"Optik",
"Orbit",
"Orden",
"Order",
"Organ",
"Orgel",
"Orgie",
"Orkan",
"orten",
"Osten",
"Oster",
"Otter",
"Ozean",
"Pacht",
"Paket",
"Palme",
"Panik",
"Panne",
"Pappe",
"Papst",
"parat",
"Pasta",
"Paste",
"Pater",
"Pauke",
"Pause",
"Pedal",
"Pegel",
"Perle",
"Pfahl",
"Pfand",
"Pfarr",
"Pfeil",
"Pferd",
"pfiff",
"Pflug",
"Pfote",
"Pfuhl",
"Pfund",
"Phase",
"Photo",
"piano",
"Piezo",
"Pille",
"Pilot",
"Pinie",
"Pinne",
"Pirat",
"Piste",
"Pixel",
"Pizza",
"platt",
"Platz",
"plump",
"Pluto",
"Pokal",
"Poker",
"polar",
"Polen",
"polig",
"Polis",
"Polit",
"Polle",
"Polyp",
"Poren",
"Porti",
"Porto",
"Posse",
"prall",
"Preis",
"Press",
"pries",
"prima",
"Prime",
"Prinz",
"Probe",
"Profi",
"Prosa",
"prost",
"Prunk",
"Psalm",
"Pudel",
"Puder",
"Pulle",
"Pulli",
"Pumpe",
"Punkt",
"Puppe",
"Puter",
"Pylon",
"Qualm",
"Quant",
"Quark",
"Quart",
"Quarz",
"quasi",
"Quell",
"Quere",
"Quirl",
"quitt",
"Quote",
"Rache",
"Radar",
"Radau",
"Radio",
"Radon",
"ragen",
"Rampe",
"rapid",
"Rappe",
"rasch",
"rasen",
"Rasse",
"raten",
"Ratte",
"Rauch",
"Raudi",
"rauen",
"Raupe",
"Realo",
"recht",
"reden",
"reell",
"Regal",
"Regel",
"regen",
"Regie",
"reich",
"Reihe",
"Reise",
"remis",
"Rente",
"reuig",
"Revue",
"Richt",
"Ricke",
"Riege",
"Riese",
"riete",
"rigid",
"Rille",
"Rinde",
"rings",
"Rinne",
"Rippe",
"Riten",
"Robbe",
"roden",
"Rolle",
"Rolli",
"Roman",
"Rommé",
"Rondo",
"Rosen",
"rosig",
"Rotor",
"Route",
"Rubel",
"Rubin",
"Ruder",
"rufen",
"Rufer",
"Rugby",
"ruhen",
"ruhig",
"Rumpf",
"Runde",
"Rupie",
"Sache",
"sacht",
"sagen",
"Sahne",
"Saite",
"Salat",
"Salbe",
"Saldo",
"Salon",
"Salto",
"Salut",
"Salve",
"Samba",
"Samen",
"sanft",
"Satan",
"Satin",
"Satyr",
"Sauce",
"sauen",
"sauer",
"Sauna",
"Schad",
"Schaf",
"Schah",
"schal",
"Scham",
"Schar",
"Schau",
"scheu",
"schob",
"schon",
"schor",
"Schub",
"schuf",
"Schuh",
"Schul",
"Schur",
"sechs",
"Seele",
"Segel",
"Segen",
"sehen",
"Seher",
"Seide",
"Seife",
"Seite",
"selbe",
"selig",
"Semit",
"Senat",
"Sende",
"senil",
"Señor",
"Seren",
"Serie",
"Serum",
"Sesam",
"Sexte",
"Sexus",
"Sicht",
"siech",
"sieht",
"Silbe",
"Sinus",
"Sippe",
"Sirup",
"Sitte",
"Skala",
"Skalp",
"Skier",
"Slawe",
"smart",
"Socke",
"sogar",
"Sohle",
"solch",
"Solei",
"solle",
"somit",
"Sonde",
"Sonne",
"sonor",
"sonst",
"sooft",
"Sorge",
"Sorte",
"sowie",
"Spalt",
"Spann",
"Spant",
"Spatz",
"Speck",
"Speer",
"Sperr",
"Spezi",
"Spiel",
"spien",
"Spike",
"Spind",
"Spion",
"spitz",
"Spore",
"Sporn",
"Sport",
"Spott",
"Spreu",
"Sprit",
"Spule",
"Spurt",
"Staat",
"Stabs",
"stach",
"Stadt",
"stahl",
"Stall",
"Stamm",
"stand",
"stank",
"starb",
"stark",
"starr",
"Start",
"statt",
"Staub",
"Steak",
"Stech",
"Steck",
"steif",
"Steig",
"steil",
"Stein",
"Stell",
"Stemm",
"Stern",
"stete",
"stets",
"Stich",
"stieg",
"Stiel",
"Stier",
"Stift",
"still",
"Stimm",
"Stirn",
"Stock",
"Stoff",
"Stola",
"stolz",
"Stopp",
"Straf",
"Streb",
"Streu",
"Stroh",
"Strom",
"Stube",
"Stuck",
"Stufe",
"Stuhl",
"stumm",
"Stunk",
"Sturm",
"Sturz",
"Stuss",
"Stute",
"Suche",
"Sucht",
"Suite",
"Summe",
"Sumpf",
"super",
"Suppe",
"Sushi",
"Szene",
"Tabak",
"Tadel",
"Tafel",
"tagen",
"Tages",
"Taiga",
"Takel",
"Taler",
"Talon",
"Tango",
"Tanne",
"Tante",
"Tapet",
"Tarif",
"Tasse",
"Taste",
"Tatze",
"Taube",
"Tauch",
"tauen",
"Taxen",
"Teeei",
"Teich",
"Teile",
"Teint",
"Telex",
"Tempo",
"Tenne",
"Tenor",
"teuer",
"Theke",
"Thema",
"These",
"Thron",
"Tiger",
"Tilde",
"Tinte",
"Tisch",
"Titan",
"Titel",
"Toast",
"toben",
"Todes",
"Tonne",
"Topas",
"Torso",
"Torte",
"tosen",
"total",
"Toten",
"Trafo",
"Trage",
"Trakt",
"trank",
"Traum",
"Treff",
"Treib",
"Trend",
"Trenn",
"Treue",
"Trias",
"Trick",
"trieb",
"Trink",
"trist",
"Tritt",
"Troll",
"Tropf",
"Tross",
"Trost",
"Trott",
"trotz",
"Truhe",
"Trunk",
"Trupp",
"tuend",
"Tulpe",
"Tumor",
"Tunte",
"Turbo",
"Tusch",
"tuten",
"Tutor",
"Typen",
"Typus",
"ulken",
"ulkig",
"Ultra",
"Umbau",
"umgab",
"umher",
"umhin",
"umkam",
"umsah",
"umtun",
"Umweg",
"umzog",
"Umzug",
"Unfug",
"Union",
"unken",
"Unmut",
"Unrat",
"Unruh",
"unser",
"unsre",
"unten",
"unter",
"Urahn",
"uralt",
"urban",
"Vater",
"vegan",
"Velin",
"Venen",
"Venus",
"Video",
"viert",
"Vikar",
"Villa",
"Viper",
"Viren",
"Virus",
"Visum",
"vital",
"Vlies",
"Vogel",
"voilà",
"Vokal",
"Volks",
"vorab",
"voran",
"vorig",
"Votum",
"Waage",
"Wache",
"Wachs",
"Wacht",
"Waden",
"Waffe",
"wagen",
"Wagon",
"Waise",
"Walze",
"Wange",
"Wanne",
"Wanst",
"Wanze",
"waren",
"Warte",
"warum",
"Warze",
"Wasch",
"waten",
"Watte",
"weben",
"Weber",
"Wedel",
"weder",
"wehen",
"weich",
"Weide",
"Weihe",
"weise",
"Weite",
"welch",
"Welle",
"Welpe",
"Wende",
"wenig",
"Werbe",
"Werft",
"Werks",
"Werte",
"Wesen",
"Wespe",
"Weste",
"Wette",
"Wicke",
"wider",
"Wiese",
"wieso",
"Wille",
"wirbt",
"wirft",
"wirst",
"Wisch",
"Witwe",
"wobei",
"Woche",
"Wodka",
"woher",
"wohin",
"Wolfs",
"Wolke",
"Wolle",
"womit",
"Wonne",
"woran",
"worin",
"worum",
"Wotan",
"wovon",
"wovor",
"Wrack",
"wrang",
"wuchs",
"Wucht",
"Wulst",
"Wunde",
"wurde",
"Wurst",
"wusch",
"Yacht",
"Zange",
"Zebra",
"Zeche",
"zehnt",
"Zeige",
"Zeile",
"Zelle",
"Zeter",
"Zicke",
"Ziege",
"Zille",
"zirka",
"Zitat",
"Zitze",
"zivil",
"Zobel",
"Zonen",
"zotig",
"Zuber",
"Zucht",
"zudem",
"zugab",
"zugig",
"zumal",
"Zunft",
"Zunge",
"Zuruf",
"zusah",
"Zutat",
"Zutun",
"zuvor",
"zuzog",
"Zuzug",
"zwang",
"Zweck",
"Zweig",
"zweit",
"Zwerg",
"Zwirn",
"Zwist",
"Zyste",
];
const lowerWords = words.map(word => word.toLowerCase());
const letterArr = [
"Q",
"W",
"E",
"R",
"T",
"Z",
"U",
"I",
"O",
"P",
"A",
"S",
"D",
"F",
"G",
"H",
"J",
"K",
"L",
"ENTER",
"Y",
"X",
"C",
"V",
"B",
"N",
"M",
"DEL",
];
let END = false;
let LEVEL = 0;
let LETTER = 0;
const gameArea = document.getElementById("game-area");
const keyboard = document.getElementById("keyboard");
const wordle = document.getElementById("wordle");
var date = new Date();
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
var dateKey = day.toString() + month.toString() + year.toString();
Math.seedrandom(dateKey);
var randomNum = Math.floor(Math.random() * 1535) + 1;
const THEWORD = lowerWords[randomNum].toUpperCase();
// const THEWORD = lowerWords[Math.floor(Math.random() * lowerWords.length)].toUpperCase();
// console.log(THEWORD);
//setting up the game area
for (let i = 0; i <= 5; i++) {
for (let j = 0; j <= 4; j++) {
const newDiv = document.createElement("div");
newDiv.classList.add("row" + i);
newDiv.classList.add("wordle-box");
newDiv.id = "div" + i + j;
const newSpan = document.createElement("span");
newSpan.id = i + "-" + j;
newDiv.appendChild(newSpan);
gameArea.appendChild(newDiv);
}
}
//add letter function which is called by the keyboard and when you click on the in game keyboard
const addLetter = (letterEvent) => {
const currLetter = document.getElementById(LEVEL + "-" + LETTER);
currLetter.appendChild(letterEvent);
const animateDiv = document.getElementById("div" + LEVEL + LETTER);
animateDiv.classList.add("addLetter");
setTimeout(() => {
animateDiv.classList.remove("addLetter");
}, "100");
if (LETTER < 5) {
LETTER++;
}
};
//delete letter function called by the backspace and the clickable delete button
const deleteLetter = () => {
if (LETTER > 0) {
LETTER--;
}
const deletedLetter = document.getElementById(LEVEL + "-" + LETTER);
deletedLetter.innerText = "";
};
//setting up the keyboard
for (let i = 0; i < letterArr.length; i++) {
const newBtn = document.createElement("button");
newBtn.classList.add("keyboard-btn");
newBtn.id = "key" + letterArr[i];
const letter = document.createTextNode(letterArr[i]);
newBtn.appendChild(letter);
keyboard.appendChild(newBtn);
//adding event listeners to the keys
newBtn.addEventListener("click", (e) => {
if (e.target.id.length === 4) {
const newGuess = document.createTextNode(e.target.innerText);
addLetter(newGuess);
}
});
}
//adding event listener to the delete button
const deleteBtn = document.getElementById("keyDEL");
deleteBtn.addEventListener("click", (e) => {
deleteLetter();
});
//the warning box that pops up
const createWarning = (message) => {
const warning = document.createElement("div");
warning.innerText = message;
wordle.appendChild(warning);
warning.classList.add("warning-div");
warning.classList.add("appear");
setTimeout(() => {
wordle.removeChild(warning);
}, "3000");
};
//the animation that gets called when you make an illegal guess
const shakeAnimation = () => {
currRow = document.getElementsByClassName("row" + LEVEL);
for (let i = 0; i < currRow.length; i++) {
currRow[i].classList.add("shake");
}
setTimeout(() => {
for (let i = 0; i < currRow.length; i++) {
currRow[i].classList.remove("shake");
}
}, "400");
};
//the animation that gets called when you make a legal guess
const animateRow = (colorArr) => {
const currRow = document.getElementsByClassName("row" + LEVEL);
for (let i = 0; i < 5; i++) {
const milliseconds = i * 3 + "50";
setTimeout(() => {
currRow[i].classList.add(colorArr[i]);
}, milliseconds);
currRow[i].style.animationDelay = i * 3 + "00ms";
currRow[i].classList.add("makeGuess");
}
};
//the function that gets called when you make a guess. It sends legal guesses to the makeGuess function
const guessFunction = () => {
if (LETTER < 5) {
shakeAnimation();
createWarning("Nicht genügend Buchstaben.");
} else if (LETTER === 5) {
let currWord = "";
for (let i = 0; i < LETTER; i++) {
currWord += document.getElementById(LEVEL + "-" + i).innerText;
}
if (!lowerWords.includes(currWord.toLowerCase())) {
shakeAnimation();
createWarning("Wort nicht in der Liste.");
} else {
makeGuess(currWord);
}
}
};
//the function that compares your guess to the word and ends the game
const makeGuess = (guess) => {
const guessWordArr = guess.split("");
const theWordArr = THEWORD.split("");
let colorArr = [0, 1, 2, 3, 4];
const letterCounts = {};
// first, I make 2 arrays with sub arrays that have the letters and their iterations in the word, or the amount of times that letter has been guessed.
theWordArr.forEach((element) => {
letterCounts[element] = (letterCounts[element] || 0) + 1;
});
const mappedLetterCounts = Object.entries(letterCounts).map(
([key, value]) => [key, value]
);
let guessCounts = mappedLetterCounts.map((eachLetter) => {
return [eachLetter[0], 0];
});
//GREEN
for (let i = 0; i < 5; i++) {
if (guessWordArr[i] === theWordArr[i]) {
colorArr.splice(i, 1, "green");
const letterToGreen = document.getElementById("key" + guessWordArr[i]);
letterToGreen.classList.add("green-letter");
guessCounts.forEach((eachLetter) => {
if (eachLetter[0] === guessWordArr[i]) {
eachLetter[1]++;
}
});
}
}
//for every correct letter guess, I iterate the sub array with the corresponding letter.
//YELLOW
let currentGuessCount = 0;
let maxGuessCount = 0;
for (let i = 0; i < 5; i++) {
if (theWordArr.includes(guessWordArr[i])) {
//I then check the total amount of times the current letter appears in the guess array and compare it
//to the total amount of times it appears in the word so that no extra boxes are made yellow.
guessCounts.forEach((eachLetter) => {
if (eachLetter[0] === guessWordArr[i]) {
currentGuessCount = eachLetter[1];
}
});
let index = mappedLetterCounts.findIndex(
(subArr) => subArr[0] === guessWordArr[i]
);
mappedLetterCounts.forEach((eachLetter) => {
if (eachLetter[0] === guessWordArr[i]) {
maxGuessCount = eachLetter[1];
}
});
if (currentGuessCount < maxGuessCount) {
if (typeof colorArr[i] === "number") {
colorArr.splice(i, 1, "yellow");
guessCounts[index][1]++;
const letterToYellow = document.getElementById(
"key" + guessWordArr[i]
);
letterToYellow.classList.add("yellow-letter");
}
}
}
//turning keys gray
if (!theWordArr.includes(guessWordArr[i])) {
const letterToGray = document.getElementById("key" + guessWordArr[i]);
letterToGray.classList.add("gray");
}
}
//This array sends the yellow and green classes to the animate function. It's a bit weird but it's what I thought of, and hey it works.
animateRow(colorArr);
//endgame messages
if (guess === THEWORD) {
if (LEVEL === 0) {
createWarning("Unbelievable!");
} else if (LEVEL === 1) {
createWarning("Incredible!");
} else if (LEVEL === 2) {
createWarning("Stupendous!");
} else if (LEVEL === 3) {
createWarning("Bananas!");
} else if (LEVEL === 4) {
createWarning("Close one!");
} else if (LEVEL === 5) {
createWarning("Phew!");
}
const keyboard = document.getElementsByClassName("keyboard-btn");
END = true;
}
LEVEL++;
LETTER = 0;
if (LEVEL === 6) {
createWarning(THEWORD);
}
};
if(END == false){
//adding event listener to the enter button and the users keyboard
const enterBtn = document.getElementById("keyENTER");
enterBtn.addEventListener("click", guessFunction);
window.addEventListener("keydown", (e) => {
if (e.key === "Enter") {
guessFunction();
} else if (letterArr.includes(e.key.toUpperCase())) {
const letter = document.createTextNode(e.key.toUpperCase());
addLetter(letter);
} else if (e.key === "Backspace") {
deleteLetter();
}
});
}