Programma's en documentatie bij Woordle
# Woordle 2 # Programma om Woordenlijsten te genereren # Ga uit van https://raw.githubusercontent.com/OpenTaal/opentaal-wordlist/master/wordlist.txt def LineReduce(line): return line[0:len(line)-1] DIR = "./" FILE = "wordlist.txt" FILEOUT = "woorden.txt" FILEOUT5 = "woorden5.txt" FILEOUT6 = "woorden6.txt" FILEOUT7 = "woorden7.txt" dfin = DIR+FILE dfout = DIR+FILEOUT dfout5 = DIR+FILEOUT5 dfout6 = DIR+FILEOUT6 dfout7 = DIR+FILEOUT7 fin = open(dfin, "r") fout = open(dfout, "w") fout5 = open(dfout5, "w") fout6 = open(dfout6, "w") fout7 = open(dfout7, "w") line = LineReduce(fin.readline()) ll = len(line) cnt = 0 cntOK = 0 W = [] W5 = [] W6 = [] W7 = [] WPlus = [] while ll > 0: cnt += 1 OK = 0 for c in line: if (ord(c) < ord("a")) | (ord(c) > ord("z")): OK += 1 if OK == 0: W.append(line) cntOK += 1 if len(line) == 5: W5.append(line) if len(line) == 6: W6.append(line) if len(line) == 7: W7.append(line) line = LineReduce(fin.readline()) ll = len(line) lw = len(W) W.sort() for w in W: fout.write(w + "\n") for w in W5: fout5.write(w + "\n") for w in W6: fout6.write(w + "\n") for w in W7: fout7.write(w + "\n") fout.close() fout5.close() fout6.close() fout7.close() fin.close() print("Aantal ingelezen woorden", cnt) print("Aantal correcte woorden", cntOK) print("Aantal woorden lengte 5", len(W5)) print("Aantal woorden lengte 6", len(W6)) print("Aantal woorden lengte 7", len(W7)) print("Ready")
Gebruikte procedures en variabelen
Hieronder volgt een overzicht van de gebruikte procedures en variabelen in de programmatuur
Procedures
LineReduce(line)
Verwijdert Nieuwe Regel op het einde van een woord.
LeesWoorden(letters)
De woorden het het bestand worden ingelezen.
LeesAfvalWoorden(letters)
Als LeesWoorden, maar dan voor de lijst met woorden die NIET worden gebruikt als te raden woord.
Overeenkomsten(KeuzeWoord, TeRadenWoord)
Er wordt per letter gecontroleerd of de letter voorkomt in het onbekende woord TeRadenWoord, zo ja, op de juiste plaats, of op een andere plaats. Per letter wordt een getal bepaald:
- 0 indien de letter niet voorkomt in TeRadenWoord
- 1 indien de letter voorkomt in TeRadenWoord, maar niet op de juiste plaats
- 2 indien de letter voorkomt in TeRadenWoord, ook op de juiste plaats
Bij elkaar gaat het om een lijst van 5, 6 of 7 getallen. De combinatie van deze getallen is de signatuur, die wordt geretourneerd.
ReduceerWoorden(RWL, R, KeuzeWoord)
Elke keer als je op Ok drukt wordt gekeken naar het aantal mogelijke oplossingen (RWL). Deze procedure controleert voor welke woorden RaadWoord in RWL exact dezelfde signature wordt gedenereerd als TeRadenWoord. Er wordt een nieuwe lijst RWL2 opgesteld bestaande uit deze woorden.
FacePrint(face, C, color)
De kleur van de letters en de letter zelf wordt gewijzigd.
BackPrint(face, color)
De achtergrondkleur wordt gewijzigd. Hierbij wordt gebruik gemaakt van:
- wit: standaard achtergrond
- magenta: het woord dat is ingetikt bestaat niet
- geel: de letter correspondeert met een letter uit het te raden woord, maar niet op de juiste positie
- groen: de letter correspondeert met een letter uit het te raden woord op de juiste plaats
Back()
Er wordt een letter gewist.
Del()
Het gehele woord wordt gewist.
New()
Er wordt een nieuw spel gestart, met hetzelfde aantal letters.
Char(x,y)
Er wordt een letter ingetikt. De x en y corresponderen met de coordinaten van de button waar de letter staat.
Ok()
Deze button kan pas worden gebruikt als er een bestaand woord is ingetikt. Dan wordt Overeenkomsten aangeroepen en wordt de kleuring uitgevoerd.
Stat()
Werkt nog niet. De bedoeling is dat de statistieken van alle gespeelde spelletjes worden getoond. Dit laat ik aan de gebruiker over!
Replay(NumLetters)
NumLetters is 5, 6 of 7. Het spel wordt in z'n geheel opnieuw opgestart. Hieronder volgt een opsomming waar de reset betrekking op heeft:
- De (global) variabele letters wordt gelijk gesteld aan NumLetters
- De regel waar GERADEN staat wordt weer schoongemaakt
- De achtergrond van de buttons boven wordt weer wit
- Alle letters op de buttons boven worden verwijderd
- De kolommen waar geen letters worden geplaatst (bij 5 en 6 letters) worden grijs gemaakt.
- De achtergrond van de buttens onder wordt weer grijs
- Er wordt een kopie gemaakt van de complete woordenlijst (WK) t.b.v. het bepalen van het resterende aantal woorden (zichtbaar rechtsonder)
- Rechtsonder wordt de grootte van WK geplaatst
ShowButtons()
Technische procedure die alle buttons tekent en bovendien per button de procedure toekent die moet worden uitgevoerd als op de betreffende button wordt gedrukt.
Variabelen
- 289: root wordt gebruikt om eenvoudig opdrachten met de buttons te kunnen aanroepen,
- 292: TEKSTEN is de lijst van opdrachten in de meest rechter kolom van het buttonoverzicht,
- 294: OPLOSSING (Constante) de afzonderlijke letters GERADEN,
- 295: ABC is een overzicht van de in te tikken letters (A t/m Z)
- 305: KLEUREN is een lijst van gebruikte kleuren voor de buttons (zowel de letters als de achtergrond)
- 307: WOORD Hier worden de afzonderlijke letters van het woord dat wordt ingetikt geplaatst.
- 308: FontName naam van het gebruikte font in de applicatie.
- 309: FontSize de grootte van de letters in de applicatie. Letop, de invoer moet een string zijn.
- 311: H maximaal aantal letters van de woorden. In deze applicatie is gekozen voor 7. De breedte van het bord is 1 meer, namelijk 8. In de laatste kolom staan een aantal opdrachten.
- 312: V Aantal rijen die de gebruiker tot zijn beschikking heeft om woorden in te voeren. We kiezen net als in Wordl en de applicatie van AppSurd voor 6 rijen. De hoogte van het bord is 4 meer, namelijk 10. In de laatste rijen staan de letters A t/m Z.
- 313: ABCstartregel geeft aan waar het ABC begint.
- 314: regel geeft aan met welk woord de gebruiker bezig is. (dus 0 <= woord <= 5)
- 315: letters Dit is het aantal letters van het te raden woord.
- 316: letter geeft aan met welke letter de gebruiker bezig is. (dus 0 <= woord <= letters-1).
- 317: KeuzeWoord Dit is het woord dat wordt ingetikt.
- 318: bestaandwoord is een boolean die wordt toegekend aan een woord als het compleet is. True, indien het een bestaand woord is (staat in W) en False als het een nietbestaand woord is (staat niet in W).
- 319: W De lijst met woorden die gebruikt mogen worden en waaruit random een woord gekozen wordt om te raden. (Let op, deze lijst wordt gewijzigd als letters wordt gewijzigd!)
- 320: AW De lijst met afvalwoorden die worden overgeslagen bij het kiezen van woorden om te raden.
- 321: lw Het aantal woorden in W
- 322: RWL (RaadWoordenlijst). Is aanvankelijk een kopie van W. Deze lijst wordt gebruikt om het aantal oplossingen bij te houden.
- 325: r_wnr (random_woordnummer). Hier wordt een random getal gekozen. Vervolgens wordt gecontroleerd of het woord W[r_wnr] is bevat in AW (de afvalwoorden). Zolang dit het geval is, wordt er een ander getal gekozen.
- 326: TeRadenWoord is het woord dat moet worden geraden.
- 332: ABCvalue is een lijst van waarden die correspondeert met de letters A t/m Z. Hierbij is:
- -1 indien de letter niet nog niet is gebruikt
- 0 indien de letter niet voorkomt in TeRadenWoord
- 1 indien de letter voorkomt in TeRadenWoord, maar niet op de juiste plaats
- 2 indien de letter voorkomt in TeRadenWoord, ook op de juiste plaats
- 336: buttons is een verwijzing naar het grid met buttons.
groen (in het geval je de code hebt geopend in je Python-editor) duidt er op dat de betreffende variabele ook als "global" in de procedures wordt gebruikt. Lijsten worden standaard op die manier in de procedures gebruikt.
# Woordle 6 # In het geval van WoordL.py in Linux omgeving: #!/usr/bin/python3 #WoordL v.0.2 basisversie import math import string import numpy import tkinter as tk import random import sys import os.path from tkinter import filedialog from tkinter import messagebox def LineReduce(line): return line[0:len(line)-1].upper() def LeesWoorden(letters): W = [] DIR = "./" FILE = "woorden" TXT = ".txt" dfin = DIR+FILE+str(letters)+TXT fin = open(dfin, "r") line = LineReduce(fin.readline()) ll = len(line) while ll == letters: W.append(line) line = LineReduce(fin.readline()) ll = len(line) fin.close() return W def LeesAfvalWoorden(letters): AW = [] DIR = "./" FILE = "afvalwoorden" TXT = ".txt" dfin = DIR+FILE+str(letters)+TXT if os.path.exists( dfin): fin = open(dfin, "r") line = LineReduce(fin.readline()) ll = len(line) while ll == letters: AW.append(line) line = LineReduce(fin.readline()) ll = len(line) fin.close() return AW def Overeenkomsten(KeuzeWoord, TeRadenWoord): global letters orig = "#" subs = "@" signatuur = [0,0,0,0,0,0,0] AWOORD = [orig, orig, orig, orig, orig, orig, orig] ARADEN = [subs, subs, subs, subs, subs, subs, subs] for i in range(letters): AWOORD[i] = KeuzeWoord[i] ARADEN[i] = TeRadenWoord[i] if AWOORD[i] == ARADEN[i]: AWOORD[i] = orig ARADEN[i] = subs signatuur[i] = 2 for i in range(letters): if AWOORD[i] in ARADEN: j = ARADEN.index(AWOORD[i]) AWOORD[i] = orig ARADEN[j] = subs signatuur[i] = 1 return signatuur def ReduceerWoorden(RWL, R, KeuzeWoord): RWL2 = [] for w in RWL: R2 = Overeenkomsten(KeuzeWoord, w) if R2 == R: RWL2.append(w) return RWL2 def FacePrint(face, C): face.config(text=C, font=(FontName, FontSize, 'bold'), fg = zwart) return def BackPrint(face, color): color = KLEUREN[color] face.config(bg = color) return def Back(): # Een letter terug global regel, letter, letters, bestaandwoord if bestaandwoord == False: bestaandwoord = True for i in range(letters): BackPrint(buttons[regel][i], 4) if letter > 0: letter -= 1 FacePrint(buttons[regel][letter], " ") return def Del(): # Regel verwijderen global regel, letter, letters, bestaandwoord while letter > 0: Back() return def New(): # Regel verwijderen Replay(letters) return def Char(x,y): # Plaatsen van letter global regel, letter, letters, bestaandwoord, KeuzeWoord if letter < letters: FacePrint(buttons[regel][letter], ABC[y-ABCstartregel][x]) WOORD[letter] = ABC[y-ABCstartregel][x] if 7*(y-ABCstartregel)+x < 26: letter += 1 if letter == letters: KeuzeWoord = "" for i in range(letters): KeuzeWoord = KeuzeWoord + WOORD[i] if KeuzeWoord not in W: for i in range(letters): BackPrint(buttons[regel][i], 6) bestaandwoord = False return def Ok(): # Controleren van KeuzeWoord global regel, letter, letters, bestaandwoord, KeuzeWoord, TeRadenWoord, RWL if (letter == letters) & (bestaandwoord == True): R = Overeenkomsten(KeuzeWoord, TeRadenWoord) RWL = ReduceerWoorden(RWL, R, KeuzeWoord) lrwl = len(RWL) FacePrint(buttons[10][7], str(lrwl)) for i in range(letters): BackPrint(buttons[regel][i], R[i]) w = ord(KeuzeWoord[i]) - ord("A") y = w // 7 + ABCstartregel x = w % 7 ABCvalue[y-ABCstartregel][x] = max(ABCvalue[y-ABCstartregel][x], R[i]) BackPrint(buttons[y][x], ABCvalue[y-ABCstartregel][x]) regel += 1 letter = 0 if KeuzeWoord == TeRadenWoord: for i in range(7): BackPrint(buttons[6][i], 7) FacePrint(buttons[6][i], OPLOSSING[i]) #elif lrwl <= 10: # toont de laatste 10 woorden(Puur voor programmeren) # print(RWL) if (regel == 6) & (not (KeuzeWoord == TeRadenWoord)): for i in range(letters): BackPrint(buttons[6][i], 6) FacePrint(buttons[6][i], TeRadenWoord[i]) return def Stat(): # Statistieken van gespeelde partijen return def Replay(NumLetters): # Reset van het spel global letters, regel, letter, TeRadenWoord, bestaandwoord, KeuzeWoord, ABCvalue, W, RWL letters = NumLetters for y in range(6): # eerste zes regels for x in range(letters): BackPrint(buttons[y][x], 4) # 4 = wit FacePrint(buttons[y][x], " ") for x in range(7 - letters): BackPrint(buttons[y][letters+x], 3) # 3 = grijs FacePrint(buttons[y][x], "") for x in range(7): BackPrint(buttons[6][x], 3) # 3 = grijs FacePrint(buttons[6][x], "") W = LeesWoorden(letters) AW = LeesAfvalWoorden(letters) lw = len(W) RWL = [] for w in W: RWL.append(w) FacePrint(buttons[10][7], str(lw)) r_wnr = random.randrange(lw) TeRadenWoord = W[r_wnr] # r_lw = 7943 % lw # Met deze regel wordt er een niet-random woord gekozen, maar wel toepasselijk while TeRadenWoord in AW: r_wnr = random.randrange(lw) TeRadenWoord = W[r_wnr] ABCvalue = [[-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, 0, 0]] for x in range(7): for y in range(4): BackPrint(buttons[y+ABCstartregel][x], 3) Titel = "WoordL "+str(letters)+" letters" root.title(Titel) regel = 0 letter = 0 WOORD = ["", "", "", "", "", "", ""] bestaandwoord = True KeuzeWoord = "" return def ShowButtons(): for y in range (V+5): button_row = [] for x in range (H+1): if (x < letters) & (y < V): button = tk.Button(root, text="", width=2, height=1, bg=wit, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold')) elif (y < V) & (letters <= x) & (x < H): button = tk.Button(root, text="", width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold')) elif (y == 0) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Back()) elif (y == 1) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Del()) elif (y == 2) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Ok()) elif (y == 3) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: New()) elif (y == 4) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Replay(5)) elif (y == 5) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Replay(6)) elif (y == 6) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold')) elif (y == 7) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Replay(7)) elif (y == 8) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Stat()) elif (y == 9) & (x == H): button = tk.Button(root, text=TEKSTEN[y], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda root=root: root.destroy()) elif (y == 10) & (x == H): button = tk.Button(root, text=str(lw), width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold')) elif (y == 6) & (x < H): button = tk.Button(root, text="", width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold')) elif (y > 6) & (x < H): button = tk.Button(root, text=ABC[y-ABCstartregel][x], width=4, height=1, bg=grijs, fg=zwart, borderwidth = 1, font=(FontName, FontSize, 'bold'), command=lambda y=y, x=x: Char(x,y)) button.grid(row=y, column=x, sticky="nsew") button_row.append(button) buttons.append(button_row) root.grid_rowconfigure(V+4, weight=1) root.grid_columnconfigure(H+1, weight=1) return root = tk.Tk() root.title("WoordL 5 letters") TEKSTEN = ["Back", "Del", "OK", "New", "5", "6", "", "7", "Stat", "Exit", " "] # Nog eEn button kan worden toegevoegd OPLOSSING = ["G", "E", "R", "A", "D", "E", "N"] ABC = [["A", "B", "C", "D", "E", "F", "G"], ["H", "I", "J", "K", "L", "M", "N"], ["O", "P", "Q", "R", "S", "T", "U"], ["V", "W", "X", "Y", "Z", "", ""]] # kleuren grijs = "light gray" #3 wit = "white" #4 zwart = "black" #5 rood = "magenta" #6 blauw = "steelblue1" #7 KLEUREN = ["dim gray", "khaki1", "seagreen1", grijs, wit, zwart, rood, blauw] WOORD = ["", "", "", "", "", "", ""] FontName = 'Helvetica' FontSize = '28' H = 7 V = 6 ABCstartregel = 7 regel = 0 letters = 5 letter = 0 KeuzeWoord = "" bestaandwoord = True W = LeesWoorden(letters) AW = LeesAfvalWoorden(letters) lw = len(W) RWL = [] for w in W: RWL.append(w) r_wnr = random.randrange(lw) TeRadenWoord = W[r_wnr] # Als NietKiezen onbekend is: In de cel hierboven wordt NietKiezen gedefinieerd. while TeRadenWoord in AW: r_wnr = random.randrange(lw) TeRadenWoord = W[r_wnr] ABCvalue = [[-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, 0, 0]] buttons = [] ShowButtons() root.mainloop()
# Woordle 7 #Terug naar boven import math import numpy import tkinter as tk import random import sys root = tk.Tk() button = tk.Button(root, text="Exit", width=4, height=1, bg="light gray", fg="black", borderwidth = 1, font=('Helvetica', '32', 'bold'), command=lambda root=root: root.destroy()) button.grid(row=0, column=0, sticky="nsew") root.grid_rowconfigure(1, weight=1) root.grid_columnconfigure(1, weight=1) root.mainloop()