2017-10-02 3 views
1

Ich versuche ein 10x10 Raster für eine Karte für ein einfaches textbasiertes Spiel in Python zu erstellen. Ich schaffte es, eine MapTile Klasse und eine Spielerklasse zu erstellen, die sich um ein (x, y) Gitter bewegen kann. Ich bin mir jedoch nicht sicher, wie man die Instanzen der Klasse erstellt, um einzelne MapTiles zu haben. Ich habe gelesen, dass es beliebig sein würde, maptile1, maptile2 ... usw. für alle 100 MapTile s zu erstellen, aber ich kann mir keinen anderen Weg vorstellen.Wie kann ich eine dynamische Instanz einer Klasse für ein textbasiertes Gitter erstellen?

Hier ist, was ich habe!

# This class contains the x and y values for a grid 
class MapTile: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

# basic char class containing position 
class Character: 
    def __init__(self, name, hp, x, y): 
     self.name = name 
     self.hp = hp 
     self.x = x 
     self.y = y 

    # movement func 
    def Move(self, Direction): 
     if Direction.upper() == "UP": 
      if self.y > 1: 
       self.y -= 1 
     elif Direction.upper() == "LEFT": 
      if self.x > 1: 
       self.x -= 1 
     elif Direction.upper() == "RIGHT": 
      if self.x < 10: 
       self.x += 1 
     elif Direction.upper() == "DOWN": 
      if self.y < 10: 
       self.y += 1 

    def __str__(self): 
     return "{}\n========\nHP = {}\nX = {}\nY = {}".format(self.name, 
                   self.hp, 
                   self.x, 
                   self.y) 

Lassen Sie mich wissen, wenn ich unklar bin.

+0

Setzen Sie das 10x10-Gitter von 'MapTile'-Instanzen in eine' liste' von 'Listen', die durch' [x] [y] 'indiziert wird, oder ein Wörterbuch, dessen Schlüssel' tuple's von '(x , y) 'Position von jedem. – martineau

+0

Also sollte ich nur eine Instanz haben und die (x, y) -Koordinaten sollten eine Liste von Listen sein? –

Antwort

0

Wie ich in einem Kommentar sagte, ich denke, Sie sollten entweder eine Liste von Listen oder ein Wörterbuch als Container für alle MapTile Instanzen verwenden. Hier ist, wie beide zu tun:

# This class contains the x and y values for a grid 
class MapTile: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

XDIM, YDIM = 10, 10 

# Create a list-of-lists. 
grid = [[MapTile(x, y) for y in range(YDIM)] for x in range(XDIM)] 

# Create a dictionary with tuple keys. 
grid = {(x, y): MapTile(x, y) for x in range(XDIM) for y in range(YDIM)} 

tun so etwas wie dies macht die x, y-Position gespeicherten Informationen in den MapTile Fällen etwas redundant, da es sein wird impliziert entweder durch die Indizes oder die Schlüssel verwendet Referenzieren Sie jede Instanz im Container. Zum Beispiel:

grid[1][2] enthält MapTile(1, 2)

      im ersten Fall, oder

grid[(1, 2)] enthält MapTile(1, 2)

im zweiten Szenario. Aus diesem Grund möchten Sie es vielleicht aus der Klasse MapTile in Ihrem Design lassen. Andernfalls müssen Sie sie wahrscheinlich aktualisieren, wenn sich der Speicherort ihrer MapTile-Instanz in dem von Ihnen ausgewählten Typ des grid Containers ändert.

+0

Verstanden! Ich danke dir sehr! –

+0

Matt: Ein anderer Vorschlag wäre es, eine andere Klasse zu erstellen, wie zum Beispiel 'class Game' oder' Board' oder etwas ähnliches, das ein 'grid() 'Attribut besitzt, seine Erstellung steuert und andere Methoden zur Verfügung stellt manipuliere die Sammlung von 'MapTile'-Instanzen, die es enthält (wie Verschieben oder Zeichnen von ihnen). Diese Klasse könnte auch die Instanz (en) der Zeichen enthalten, wenn dies sinnvoll ist. – martineau

+0

Ich mag diese Idee! Wie würde ich die Instanzen zeichnen? –

Verwandte Themen