Rasterfeld/Spielfeld in Python

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.
Antworten
zeta
User
Beiträge: 3
Registriert: Samstag 11. April 2015, 03:14

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
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
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.
zeta
User
Beiträge: 3
Registriert: Samstag 11. April 2015, 03:14

Ich danke dir vielmals, genau das habe ich gesucht. :D
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
zeta
User
Beiträge: 3
Registriert: Samstag 11. April 2015, 03:14

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?
BlackJack

@zeta: Das ist ein Generatorausdruck.
Antworten