Open WouterVrielink opened 4 years ago
Ik ben hier nu voorzichtig naar aan het kijken (in mjdv/hangman): een paar vragen/opmerkingen.
Bij Specification 5.6. staat "pick a word": moet je de eerste pakken zoals eerder aangegeven of moet dit random zijn?
Waar staat aangegeven dat je de eerste moet pakken? Ik zie alleen maar suggesties om één van de mogelijke woorden te pakken, zonder specificatie welke het is.
Specification 4: (and grading!), maar we doen hier niets mee bij grading
De intentie was: de nakijkers runnen het programma ook even kort, en testen of de interface iets zinnigs doet. Als we uiteindelijk toch alleen op de check50 checks af gaan heeft het voor de studenten geen nut om dat deel van de opdracht ook te doen, dus dan kunnen we het er beter uit halen, lijkt me.
Waarschijnlijk is het beter om de interface te geven of volledig te schrappen.
Dat is misschien handig, zeker als de opdracht (evil hangman) als te groot/ingewikkeld ervaren wordt. Maar dit is wel een redelijke grote ingreep, dus dan kijk ik toch ook even naar @stgm en/of @Jelleas: lijkt het jullie ook een goed idee? Dit loopt ook samen met...
Aan de ene kant moet je reprompten, en aan de andere kant moet je exceptions gooien. Voor studenten is het vaak niet duidelijk welk van de twee waar moet gebeuren. (haakt in op vorige punt)
De intentie was: de Hangman
class gooit exceptions, en de interface code vangt die (met try/catch
) op. Als we de interface geven, wordt het (hopelijk) vanzelf duidelijk hoe die exceptions werken.
In beschrijving staat overal she/her. Kan ook ambigu blijven.
Dit is mijn gewoonte, overgenomen uit speltheorieliteratuur die ik gelezen heb. Ik denk dat de tekst van de opgave clunky wordt zonder voornaamwoorden: dus dan zijn de keuzes she, he, of enkelvoudig they. (Of een mengeling.)
Niet duidelijk en niet conform standaard OOP.
Bedoel je dat het beter zou zijn als de Hangman class initializer een Lexicon-object als argument neemt? Ik zie de woordenlijst eerder als een soort back-end dingetje (juist weg-geabstraheerd voor de gebruiker), en de Lexicon class als de manier waarop de Hangman class met die 'back-end' interfacet. (Natuurlijk is dit sowieso krom, want in het echt zou je van iets als Lexicon geen hele class maken.)
@WouterVrielink is nog een week op vakantie!
Ik zou ondertussen gewoon verder gaan. Heb ook wel wat input op bovenstaande, dat helpt wellicht ;-) Ik spreek daarbij vooral over de classic (voorheen lovely)-versie.
Hangman
die een instantie van Lexicon
maakt lijkt me geen probleem, als dat idd is wat Wouter bedoelt.Ha @mjdv! Dit heb ik al een tijdje terug geschreven dus ik weet zelf ook niet helemaal meer wat ik bedoelde overal... Ik geloof dat een deel van de problemen al opgelost was in eerdere (kleine) aanpassingen.
Waar staat aangegeven dat je de eerste moet pakken? Ik zie alleen maar suggesties om één van de mogelijke woorden te pakken, zonder specificatie welke het is.
Ik kan dit niet terug vinden. Wel zie ik bij "classic" dat er staat If the player has run out of guesses, pick a word from the word list and display it as the word that the computer initially "chose." Ik denk dat dit een artefactje is van de evil versie van het algoritme, want je verandert niet van gekozen woord. Mogelijk bedoelde ik dit.
Ik denk inderdaad dat het net is om die exceptions af te vangen op die manier. Dat geeft direct een goed idee van hoe je dit soort dingen "in het echt" kan gebruiken. Ik heb destijds bij vrij weinig studenten een try/catch gezien, en bij heel veel mensen een kopie van de check zoals hij in de class ook al staat. Als we de interface niet geven moeten we de nadruk dus wel op try/catch leggen.
Bedoel je dat het beter zou zijn als de Hangman class initializer een Lexicon-object als argument neemt? Ik zie de woordenlijst eerder als een soort back-end dingetje (juist weg-geabstraheerd voor de gebruiker), en de Lexicon class als de manier waarop de Hangman class met die 'back-end' interfacet. (Natuurlijk is dit sowieso krom, want in het echt zou je van iets als Lexicon geen hele class maken.)
Ja dat bedoel ik inderdaad. Op die manier hoef je bij een herhaling van het spel niet helemaal opnieuw Lexicon in te lezen. Ik denk dat het een best representatieve manier is van hoe je het in het echt zou doen. Ik vind het zelfs een heel goed instapvoorbeeld voor dingen waar je van een datastructuur een class zou willen maken om zoals jij ook zegt weg te abstraheren voor de gebruiker. Normaal zou je wel iets doen waarin je als het ware meer woorden aan je lexicon zou kunnen toevoegen, via een import_words_from_file()
oid (waardeloze naamgeving dit). Voor nu lijkt het me prima als de init van Lexicon een filename aanneemt waaruit alles ingeladen wordt. De Hangman init neemt dan een Lexicon object aan. Eventueel kan je dan ook testen met een kleinere versie van een woordenlijst :)
----
is, terwijl dat-OO-
moet zijn.guess
moet zitten. De rest van de functies doet eigenlijk vrij weinig verder. Misschienguess
ook meer opdelen in subtasks?if __name__ = "__main__"
doetLexicon
class wordt nu opgevraagd inHangman
. Niet duidelijk en niet conform standaard OOP. Duidelijker zou zijn als je words meegeeft aan de__init__
. Dan kanLexicon
ook direct een variabele meekrijgen waar je de filepath meegeeft.