Seite 1 von 1

Rasterfeld/Spielfeld in Python

Verfasst: Samstag 11. April 2015, 03:28
von zeta
Hallo zusammen,
lange habe ich gegrübelt und gesucht, um folgendes Problem anzugehen.

Ich möchte gerne ein 2d-Spielfeld in meinem Terminal anzeigen lassen, dies soll in Form einer nxm-Matrix geschehen.

Meine Idee war es, ein 2Dimensionales Array zu nutzen.

Code: Alles auswählen

def matr(m,n):
    matrix = [[0 for x in range(n)] for x in range(m)] 
    return matrix
Nun bekomme ich halt im Terminal sowas raus:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Raus bekommen möchte ich allerdings folgendes:
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
Es soll das Spiel Minesweeper für das Terminal entstehen.

Nun die Frage, wie initialisiere ich die Matrix in der Form wie im quote2?

Beste Grüße
Zeta

Re: Rasterfeld/Spielfeld in Python

Verfasst: Samstag 11. April 2015, 10:05
von jerch
@zeta:
Terminals sind eine Art Zeichen-"Canvas" mit einem Cursor und Steuerzeichen, wobei die Cursorposition angibt, wo das nächste druckbare Zeichen ausgegeben wird und Steuerzeichen u.a. die Cursorposition verändern können. Wie man den Cursor dazu bringt, dass er in an den nächsten Zeilenanfang springt, weiss Du wahrscheinlich - mit <Enter/Return> bzw. '\n' als Steuerzeichen:

Code: Alles auswählen

print '\n'.join(map(str, <dein Spielfeld>))
Minesweeper ist ja eigentlich für die Eingabe per Maus konzipiert. Das kann ein Terminal zwar auch (zumindest die Emulatoren unter X bzw. Console unter Windows), ist aber nicht ganz einfach umzusetzen. Hier musst Du Dir evtl. eine andere Eingabe überlegen.

Re: Rasterfeld/Spielfeld in Python

Verfasst: Samstag 11. April 2015, 10:18
von BlackJack
@zeta: Das was Du da als Arrays bezeichnest sind in Python Listen. Das ist nicht ganz unwichtig weil es neben Listen auch Array-Datentypen gibt und man damit Verwirrung stiften kann wenn man die Begriffe durcheinander bringt. Mit Array sind in Python nämlich in der Regel die entsprechenden Datentypen aus dem `numpy`-Package gemeint, oder in seltenen Fällen das `array`-Modul aus der Standardbibliothek. Und mit dem `ctypes`-Modul kann man mit Arrays der Programmiersprache C operieren.

Der Name `matr` ist unschön. Vermeide irgendwelche kryptischen Abkürzungen. Namen sollen dem Leser vermitteln was der Wert für den er im Programm steht bedeutet und nicht zum Rätselraten animieren. Funktionen werden gewöhnlich mit Tätigkeiten benannt weil wie etwas tun und um sie leichter von ”passiven” Werten unterscheiden zu können. Also Beispielsweise `create_matrix()` für eine Funktion die eine Matrixstruktur erstellt, und dann kann man die Struktur an den Namen `matrix` binden ohne das man Probleme bekommt die Funktion und die Matrixstruktur mit dem gleichen Namen belegen zu wollen.

Re: Rasterfeld/Spielfeld in Python

Verfasst: Samstag 11. April 2015, 11:20
von zeta
Ich danke dir vielmals, genau das habe ich gesucht. :D

Re: Rasterfeld/Spielfeld in Python

Verfasst: Samstag 11. April 2015, 14:29
von Sirius3
@zeta: die Umwandlung einer Liste in einen String ist nur für Debugzwecke sinnvoll. Ausgaben für den Anwender sollten immer Strings sein, die gegebenenfalls durch format aus Zahlen entstanden sind.
Für Deinen Fall also etwa:

Code: Alles auswählen

for row in matrix:
    print ' '.join('{:2d}'.format(x) for x in row)

Re: Rasterfeld/Spielfeld in Python

Verfasst: Samstag 11. April 2015, 18:25
von zeta
Super, danke euch für die wertvollen Tipps,
hab den Code dementsprechen verändert.

Code: Alles auswählen

print ' '.join('{:2d}'.format(x) for x in row)
Nur zum Verständnis. Was genau macht die for-Schleife hier?

Re: Rasterfeld/Spielfeld in Python

Verfasst: Sonntag 12. April 2015, 20:07
von BlackJack
@zeta: Das ist ein Generatorausdruck.