Index: /tmp/galgje.py =================================================================== --- /dev/null +++ /tmp/galgje.py @@ -0,0 +1,179 @@ +# [ade] SHEBANG line +# [ade] Spel uit: dit is python3 code +# [ade] License, Copyright +# [ade] Documentatie +import random +import string +# [ade] Iets over import volgorde: ik zou alle standard-library dingen bij +# .. elkaar doen, dus de math import van hieronder, naar boven zetten. + +# [ade] Waarom heet het Definities en niet Strings? Of teksten. +import galgjeDefinities as gd +from galgjeWoordenlijst import woordenLijst +# [ade] Deze dus omhoog +from math import ceil + +def hoofdmenu(): + # [ade] Docstrings! + while (True): + # Laat menu zien + print(gd.HOOFDMENU) + # Neem invoer + invoer = input() + # [ade] Deze check is overbodig gezien je toch een if-elif-else hebt + # [ade] evt `if invoer.isdigit():` + if invoer in string.digits: # Is de invoer een cijfer? + # De invoer is een cijfer + # Neem actie + if invoer == '1': + # Speel het spel! + # [ade] Maar dat speelt het hele spel, is niet alleen het menu. + # .. De naam kan beter. + spelmenu() + elif invoer == '2': + # Stop programma + print(gd.GROET) + break + else: + # De invoer is een cijfer maar ongelijk aan 1 of 2 + # Geef foutmelding + # [ade] Deze melding is hetzelfde als hieronder, misschien + # .. aan gd als tekst toevoegen? + print("Ongeldige invoer: voer een 1 of een 2 in om je keuze te maken") + else: + # geef foutmelding wanneer invoer geen cijfer is + print("Ongeldige invoer: voer een 1 of een 2 in om je keuze te maken") + + +def spelmenu(): + # [ade] Je kunt ook function-local imports doen, en omdat woordenLijst alleen + # .. hier gebruikt wordt, kan je ook hier importeren. + # initialiseer spel: + # kies willekeurig woord uit de woordenlijst + speelWoord = random.choice(woordenLijst) + + # bepaal aantal letters om onzichtbaar te maken 40% + aantalOnbekenden = ceil(0.4*len(speelWoord)) + + # maak letters onzichtbaar: + # kies posities om onbekend te maken + # [ade] `range()` heeft ook een 1-argument variant waar de 0 begin impliciet is + onbekendePosities = random.sample(range(0, len(speelWoord)), aantalOnbekenden) + + # [ade] Interessante manier om je commentaar je geneste verfijningen + # .. te laten weergeven. Maar zou niet een `kies_startwoord()` + # .. die (spelWoord, raadWoord) teruggeeft, duidelijker zijn? + # maak posities in raadwoord underscorig + # [ade] Code suggestie: + # .. raadLetters= [letter for letter in speelWoord] # Een lijst! + # .. for i in onbekendePosities: + # .. raadLetters[i] = '_' + # .. raadWoord = "".join(raadLetters) + # [ade] Code suggestie voor Python nerds: + # .. raadWoord = "".join([ ('_' if positie in onbekendePosities else letter) for (letter, positie) in zip(speelWoord, range(len(speelWoord))) ]) + # [ade] Python style: meestal doet Python juist snake_case en niet camelCase. + raadWoord = speelWoord + for i in range(0, len(speelWoord)): + if i in onbekendePosities: + raadWoord = raadWoord[:i] + '_' + raadWoord[i+1:] + + # zet de speladministratie klaar + # [ade] Waarom een lijst en geen set? + gebruikteIndices = [] + aantalGokken = 0 + spelActief = True + + # initialiseer invoer + # start spel + while (spelActief): + # laat menu zien + # [ade] Als je toch met replace gaat werken, waarom geen langere namen? + # [ade] Als je standaard Python string-formatting gebruikt, dan zet je + # .. {woord} en {aantal} in de bron-tekst, en wordt dit gd.SPELMENU. + # .. format(woord=raadWoord, aantal=aantalOnbekenden-aantalGokken) + print(gd.SPELMENU.replace('', raadWoord).replace('', str(aantalOnbekenden-aantalGokken))) + # neem invoer + # [ade] Nogal overbodig commentaar ^^ + invoer = input() + # controleer invoer + # [ade] Zelfde soort dubbel-op check als in hoofdmenu() + if invoer in string.digits: + if invoer == '1': + # De gebruiker wil een letter raden + # Vraag de index op + while (True): + # [ade] Gebruik .format() + print(gd.RAADLETTERMENU_INDEX.replace('', str(len(raadWoord)))) + indexInvoer = input() + if indexInvoer.isdigit(): + # [ade] Ik zou hier een functietje neerzetten, misschien + # .. indexInvoer = rangedInvoer(1, len(raadWoord+1)) + # .. if indexInvoer is not None: + # .. print(raadIndex) + # .. break + if int(indexInvoer) in range(1, len(raadWoord)+1): + raadIndex = int(indexInvoer) + print(raadIndex) + break; + # [ade] Hier geen foutmelding? + else: + print(gd.RAADLETTERMENU_INDEX_FOUT.replace('', str(len(raadWoord)))) + # Vraag de letter op + while (True): + print(gd.RAADLETTERMENU_LETTER) + letterInvoer = input() + if letterInvoer.isalpha(): # Check of er letters ingevoerd zijn + # maak alles lowercase om te voorkomen dat er uppercase in de gebruikteletters terecht komen + letterInvoer = letterInvoer.lower() + + if len(letterInvoer) == 1: # check of er slechts 1 letter is ingevoerd + # er is een gok gepleegd + aantalGokken += 1 + + if speelWoord[raadIndex-1] == letterInvoer: + # de juiste letter geraden! + # pas het raadWoord aan door de letterInvoer op de raadIndex te zetten + # raadIndex gaat uit van gewone mensen (1 tot eind) en start niet met index 0 + raadWoord = raadWoord[:raadIndex - 1] + letterInvoer + raadWoord[raadIndex:] + gebruikteIndices.append(raadIndex) + print(gd.RAADLETTERMENU_LETTER_GOEDGERADEN) + break + else: + print(gd.RAADLETTERMENU_LETTER_FOUTGERADEN) + break + else: + print(gd.RAADLETTERMENU_LETTER_MEERDERELETTERS) + else: + print(gd.RAADLETTERMENU_LETTER_FOUT) + # check de score + if aantalOnbekenden - aantalGokken == 0: + # het spel is verloren + print(gd.VERLOREN.replace('', speelWoord)) + spelActief = False + + elif invoer == '2': + # De gebruiker wil een woord raden + print(gd.RAADWOORDMENU) + invoer = input() + if invoer == speelWoord: + print(gd.GEWONNEN.replace('', str(aantalOnbekenden-aantalGokken))) + else: + print(gd.VERLOREN.replace('', speelWoord)) + spelActief = False + + elif invoer == '3': + # Het spel wordt gestopt + print(gd.SPELSTOPPEN.replace('', str(aantalOnbekenden-aantalGokken))) + spelActief = False; + + else: + print("Ongeldige invoer: voer een 1, 2 of een 3 in om je keuze te maken") + else: + print("Ongeldige invoer: voer een 1, 2 of een 3 in om je keuze te maken") + + +def main(): + hoofdmenu() + +if __name__ == "__main__": + main()