@bremer
Nutz doch bitte ein Wörterbuch ... exec und eval sind hier völlig überflüssig.
Nim-Spiel in PYTHON programmieren
Fixed.
Aber antwortet lieber mal auf mein Posting im PyQT-Forum.
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.
Zeile 13 sollte besser umgestellt werden:Und Zeile 6:Und wo bleibt die KI?
MfG
HWK
Code: Alles auswählen
if heap not in heaps or not (0 < number <= heaps[heap]):
Code: Alles auswählen
while any(heaps.itervalues()):
MfG
HWK
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:
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 ...
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.")
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.
- __blackjack__
- User
- Beiträge: 13099
- 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.
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