Spiel Robots

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
flashenposter
User
Beiträge: 4
Registriert: Dienstag 18. Juli 2006, 12:12

Liebe Leute,

eins meiner ersten Projekte, eine textbasierte Umsetzung des ursprünglichen BSD-Spiels Robots

freue mich über Anregungen!

Link zum Code
Zuletzt geändert von flashenposter am Montag 23. April 2012, 19:49, insgesamt 1-mal geändert.
BlackJack

@flashenposter: Versuchs doch noch mal in idiomatischem Python. ;-)

Ordentlicher Einrückung statt einem Leerzeichen pro Ebene. Wahrheitswerte statt 0 und 1. Mit weniger magischen Zahlen. Ohne ``global``. Ohne den rekursiven Aufruf von `gameplay()` der in Sprachen die keine Endrekursion optimieren können den Speicher vollmüllt. Ohne Abkürzungen wie `ausg` wie oder `prtsnum`. Mit mehr Leerzeichen. Mit Zeichenkettenformatierung statt ``+`` und `str()`.

Eine ordentliche Datenstruktur für Spieler/Bots wäre auch schön. Diese Liste mit drei Zahlen, bei denen die letzen beiden Elemente eigenartigerweise mit einer leeren Liste initialisiert werden, die dann durch Zahlen ersetzt werden, ist ja schon fast bösartig irreführend. Diese ganze Indexerei ist auch nicht gerade schön lesbar. Das geht auch ohne, eben wenn man Python auch tatsächlich nutzt. Mal zwei Beispiele dafür:

Code: Alles auswählen

# ...
    evilbots=[]
    for i in range(bots):
        evilbots.append([1,[],[]])
        evilbots[i][1]=random.randint(0,49)
        evilbots[i][2]=random.randint(0,11)
Kann man einfacher so schreiben:

Code: Alles auswählen

    evilbots = [[True, (randint(49), randint(11))] for _ in xrange(bot_count)]
Und hier sind `on` und `kn` überflüssig, weil man die Identität der Objekte verwenden kann, selbst bei den Listen:

Code: Alles auswählen

            kn=0
            for k in evilbots:
                on=0
                for o in evilbots:
                    if k[1]==o[1] and k[2]==o[2] and on!=kn:
                        k[0]=0
                        o[0]=0
                    on=on+1
                kn=kn+1
Aber in lesbar würde das eher so aussehen:

Code: Alles auswählen

            for bot_a in evilbots:
                for bot_b in evilbots:
                    if bot_a is not bot_b and bot_a.position == bot_b.position:
                        bot_a.alive = bot_b.alive = False
flashenposter
User
Beiträge: 4
Registriert: Dienstag 18. Juli 2006, 12:12

Danke für deine Anregungen!

Wie umgehe ich das Problem mit der großen Rekursion? Und was meinst du mit Zeichenkettenformatierung?
BlackJack

@flashenposter: Statt der Rekursion würde man eine Schleife verwenden. Zum Beispiel ausserhalb von `gameplay()`.

Mit Zeichenkettenformatierung meine ich das umwandeln, formatieren, und einsetzen von Werten in Zeichenketten. Also statt ``'foo ' + str(value) + ' bar'`` zu schreiben, den ``%``-Operator (``'foo %s bar' % value``) oder die `format()`-Methode auf Zeichenketten (``'foo {0} bar'.format(value)``) verwenden. Wiederholtes zusammen setzen oder erweitern einer Zeichenkette mit ``+`` oder ``+=`` sollte man auch vermeiden. Da werden viele Daten unnötig im Speicher umkopiert, weil potentiell jedes mal eine neue Zeichenkette erstellt werden muss, die aus den beiden alten Werten zusammen gesetzt wird. Idiomatisches Python sammelt die Teilzeichenketten zum Beispiel in einer Liste und setzt dann am Ende die Einzelteile mit der `join()`-Methode auf Zeichenketten zusammen.
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Leider ist der Quellcode nicht mehr vergügbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Malta hat geschrieben:Leider ist der Quellcode nicht mehr vergügbar.
Ja, siehe auch hier.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten