Wie es so ist für solche die den OOP-Mechanismus noch nicht ganz inne haben können beim durchlesen des Codes bestimmet Zusammenhänge noch nicht so klar überblickt werden. Ich muss gestehen, dass ich meinen Vorschlag mit der Konsole (übrigens eine hilfreiche Mini-GUI) nicht vollumfänglich getestet habe. Ich wollte diesen Test 'derkai' überlassen.
Ich habe das CodeSchnipsel nun so abgeändert, dass es sich so verhält wie ich mir dies vorgestellt habe. Mit anschliessender Konsolen-Ausgabe:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#~ Skriptname programm_logic_03_01.py (22.07.2008)
class Tile(object):
"""Klasse:Spielfeld"""
def __init__(self, name):
"""Konstruktor für die Klasse-Tile"""
self.name = name
self.panzer = "."
#~~ Konstanten für Spielfeld-Typen
DESERT = 'Desert'
WOODS = 'Wood'
class Map(object):
"""Klasse:Spielkarte"""
#~~ Konstante für die Abfrage der Nachbarfelder
DIRECTION_DELTAS = [(0, -1), (1, 0), (0, 1), (-1, 0)]
#~~ Gibt die Anzahl x-Felder (Spalten) zurück
@property
def width(self):
return len(self.tiles[0])
#~~ Gibt die Anzahl y-Felder (Reihen) zurück
@property
def height(self):
return len(self.tiles)
def __init__(self, width, height, tile_type=DESERT):
"""Konstruktor für die Klasse Map"""
#~~ Erzeugt eine Feldobjekt-Liste mit der
# Anzahl 'width' * 'height' Feldobjekten
self.tiles = []
self.row_list = []
for y in xrange(height):
for x in xrange(width):
self.row_list.append(Tile(tile_type))
self.tiles.append(self.row_list)
self.row_list = []
def __getitem__(self, coordinates):
"""Adressiert das Feldobjekt"""
x, y = coordinates
return self.tiles[y][x]
def __setitem__(self, coordinates, tile):
"""Setzt den Feldtyp"""
x, y = coordinates
self.tiles[y][x] = tile
def neighbour_coordinates(self, coordinates):
"""Ermittelt die Koordinaten der Nachbarfelder"""
x, y = coordinates
for delta_x, delta_y in self.DIRECTION_DELTAS:
new_x = x + delta_x
new_y = y + delta_y
if 0 <= new_x < self.width and 0 <= new_y < self.height:
yield new_x, new_y
def main():
#~~ Erstellt ein Spielfeld mit 10 * 10 Feldobjekten (default-Feldyp = 'Desert'
SPALTEN = COLUMNS = 10
REIHEN = ROWS = 10
#~~Erstellt eine Instanz der Spielfeld-Klasse (Map)
game_map = Map(SPALTEN, REIHEN)
print 'Anzahl Spalten',game_map.width
print 'Anzahl Reihen',game_map.height
#~~ Ändert den Feldtyp des Feld auf Koordinate x=2,y=4
# in ein Feldtyp 'Wood' um
# game_map[2, 4] = WOODS
game_map[2, 4].name = WOODS
#~~ Test: Abfrage des Feldtyp-Namens der Felder auf Koordinate:
# a) x=2,y=4 ('Wood')
# b) x=3,y=2 ('Desert')
for x, y in [(2, 4), (3, 2)]:
print game_map[x, y].name
print 'Nachbar-Koordinate',list(game_map.neighbour_coordinates((1, 1)))
#~~ Gibt die Koordinaten der Nachbarfelder des
# Testfeldes auf Koordinate x=1,y=1 zurück.
#
# Testfeld X x=1,y=1
# Nachbarfeld a x=1,y=0
# Nachbarfeld b x=0,y=1
# Nachbarfeld c x=1,y=2
# Nachbarfeld d x=2,y=1
#
# 0 1 2 3 - x
# ------------------
# 0 | | a | | |
# ------------------
# 1 | b | X | d | |
# ------------------
# 2 | | c | | |
# ------------------
# 3 | | | | |
# ------------------
# x | | | | |
#*** DER PANZER BELEGUNGS-TEST ***
#~~ Setze drei unterschiedliche Panzertypen auf verschiedene
# Spielfelder auf der Spielkarte
game_map[2, 5].panzer = 'O' # Panzer-O
game_map[8, 8].panzer = 'X' # Panzer-X
game_map[9, 3].panzer = 'Z' # Panzer-Z
#~~ Zeige die Spielkarte-Panzerbelegung auf der Konsole
print
for y in xrange(game_map.height):
for x in xrange(game_map.width):
print game_map[x, y].panzer,
print
main()
Gruss wuf