Seite 2 von 2

Verfasst: Montag 13. April 2009, 11:21
von lunar
@bremer
Nutz doch bitte ein Wörterbuch ... exec und eval sind hier völlig überflüssig.

Verfasst: Montag 13. April 2009, 14:05
von bremer
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.

Verfasst: Montag 13. April 2009, 14:40
von HWK
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

Verfasst: Montag 13. April 2009, 15:00
von lunar
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 ...

Verfasst: Montag 13. April 2009, 18:06
von bremer
Was ist gegen Multilineprints einzuwenden?

Verfasst: Montag 13. April 2009, 21:36
von lunar
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.

Re: Nim-Spiel in PYTHON programmieren

Verfasst: Dienstag 5. November 2019, 00:19
von __blackjack__
Nur für den Fall das dieses Thema mal von jemanden gefunden wird der Nim implementieren möchte: `eval()` und `exec()` in bremer's letzten Beitrag geht ja mal gar nicht.

Die Ausnahmebehandlung könnte auch enger gefasst werden.

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    heap_names = ["a", "b", "c"]
    heaps = dict(zip(heap_names, [3, 4, 5]))
    switch = True
    players = {True: "1", False: "2"}
    print("Sizes of heaps:\nA B C")
    while any(heaps.values()):
        assert all(count >= 0 for count in heaps.values())
        print(" ".join(str(heaps[name]) for name in heap_names))
        print()
        print(f"Turn of player {players[switch]}.")
        try:
            number = int(input("How many? "))
        except ValueError:
            print("Please enter a number!")
        else:
            heap_name = input("Heap a, b or c? ").lower()
            if heap_name in heaps:
                if 0 < number <= heaps[heap_name]:
                    heaps[heap_name] -= number
                    switch = not switch
                else:
                    print("Please enter valid number!")
            else:
                print("Please enter a valid heap name!")
    
    print(f"Player {players[not switch]} is the winner.")


if __name__ == "__main__":
    main()