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

@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

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

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

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

Was ist gegen Multilineprints einzuwenden?
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.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten