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()