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