Nim-Spiel in PYTHON programmieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
lunar

Beitragvon lunar » Montag 13. April 2009, 11:21

@bremer
Nutz doch bitte ein Wörterbuch ... exec und eval sind hier völlig überflüssig.
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Beitragvon bremer » Montag 13. April 2009, 14:05

Fixed.

Code: Alles auswählen

switch = True
players = {True: "1", False: "2"}
heaps = {"a": 3, "b": 4, "c": 5}
print("""Sizes of heaps:
A B C""")
while any((heaps["a"], heaps["b"], heaps["c"])):
    print(heaps["a"], heaps["b"], heaps["c"])
    print()
    print("Turn of player", players[switch] + ".")
    try:
        number = int(input("How many? "))
        heap = (input("Heap a, b or c? ")).lower()
        if not (0 < number <= heaps[heap]) or heap not in heaps:
            raise ValueError
        else:
            heaps[heap] -= number
            switch = not switch
    except (KeyError, ValueError):
        print("Not possible.")
switch = not switch
print("Player", players[switch], "is the winner.")



Aber antwortet lieber mal auf mein Posting im PyQT-Forum.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Montag 13. April 2009, 14:40

Zeile 13 sollte besser umgestellt werden:

Code: Alles auswählen

if heap not in heaps or not (0 < number <= heaps[heap]):
Und Zeile 6:

Code: Alles auswählen

while any(heaps.itervalues()):
Und wo bleibt die KI?
MfG
HWK
lunar

Beitragvon lunar » Montag 13. April 2009, 15:00

Es sollte wohl "raise ValueError()" heißen. Die ganze Ausnahmesache ist sowieso überkompliziert.

Anstelle die Bedingung umzustellen, kann man den zweiten Teil auch einfach weglassen, da der KeyError eh behandelt wird. Allerdings kann man auch einfach auf die Ausnahmebehandlung verzichten, wenn man die Bedingung intelligent stellt:

Code: Alles auswählen

switch = True
players = {True: "1", False: "2"}
heaps = {"a": 3, "b": 4, "c": 5}
print("Sizes of heaps:", "A B C", sep="\n")
while any(heaps.values()):
    print(*heaps.values())
    print()
    print("Turn of player", players[switch] + ".")
    number = int(input("How many? "))
    heap = input("Heap a, b or c? ").lower()
    if heap in heaps and 0 < number <= heaps[heap]:
        heaps[heap] -= number
        switch = not switch
    else:
        print("Not possible.")
switch = not switch
print("Player", players[switch], "is the winner.")


Das Fehlen "from __future__ import print_function" sowie die Verwendung von "input()" mit Typcast legt nahe, dass das 3k-Code ist, daher muss es "heaps.values()" heißen ...
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Beitragvon bremer » Montag 13. April 2009, 18:06

Was ist gegen Multilineprints einzuwenden?
lunar

Beitragvon lunar » Montag 13. April 2009, 21:36

Da sie zumindest optisch die Einrückung zerstören, verringern sie die Lesbarkeit des Codes. Für längere, allein stehende Texte sind sie die richtige Wahl, aber für einen einfachen Zeilenumbruch, den man mit anderen Mitteln ebenso einfach erreichen kann, würde ich sie nicht einsetzen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder