Hex-Welten und ein Mini-Catan-Brett#
Eine HexWorld besteht aus sechseckigen Kacheln. Hexfelder werden wie Kacheln in einer TiledWorld über (Spalte, Zeile)-Koordinaten angesprochen. Ungerade Zeilen sind um ein halbes Hexfeld nach rechts verschoben.
Actors können auf drei Arten von Positionen platziert werden:
Kacheln (die Hexfelder selbst), z. B.
(2, 3)Ecken (werden von bis zu drei Hexfeldern geteilt), z. B. die Ecke
"no"eines HexfeldsKanten (werden von zwei Hexfeldern geteilt), z. B. die Kante
"o"eines Hexfelds
Das ist genau die Struktur eines Catan-Bretts: Landhexfelder, Siedlungen auf Ecken und Straßen auf Kanten.
Eine Hex-Welt erstellen#
import miniworlds
world = miniworlds.HexWorld(7, 7, tile_size=40)
world.background.grid = True
world.run()
Ein Catan-ähnliches Brett bauen#
Die 19 Landhexfelder eines Catan-Bretts sind in Zeilen aus 3, 4, 5, 4 und 3 Hexfeldern angeordnet. Actors auf Hexfeldern werden als Sechsecke gezeichnet.
import miniworlds
world = miniworlds.HexWorld(7, 7, tile_size=40)
world.background.grid = True
land_positions = [
(2, 1), (3, 1), (4, 1),
(2, 2), (3, 2), (4, 2), (5, 2),
(1, 3), (2, 3), (3, 3), (4, 3), (5, 3),
(1, 4), (2, 4), (3, 4), (4, 4),
(2, 5), (3, 5), (4, 5),
]
terrain_colors = [
(0, 120, 0), # forest
(220, 180, 60), # field
(120, 200, 60), # meadow
(150, 150, 150), # mountain
(200, 90, 30), # hill
(230, 210, 160), # desert
]
for number, position in enumerate(land_positions):
actor = miniworlds.Actor(position)
actor.fill_color = terrain_colors[number % len(terrain_colors)]
actor.border = 1
world.run()
Auf Hexfelder, Ecken und Kanten klicken#
world.get_tile_from_pixel(mouse_pos) returns the hex under the mouse,
world.get_corner_from_pixel(mouse_pos) the nearest corner, and
world.get_edge_from_pixel(mouse_pos) the nearest edge. All three
queries return None if the pixel is outside the world.
Das Beispiel platziert eine Siedlung (kleiner Kreis) auf der angeklickten Ecke und eine Straße (kleines Rechteck) auf der angeklickten Kante:
import miniworlds
world = miniworlds.HexWorld(7, 7, tile_size=40)
world.background.grid = True
@world.register
def on_mouse_left(self, mouse_pos):
tile = world.get_tile_from_pixel(mouse_pos)
if tile is None:
return
print("you clicked the hex", tile.position)
@world.register
def on_mouse_right(self, mouse_pos):
corner = world.get_corner_from_pixel(mouse_pos)
settlement = miniworlds.Actor(corner.position)
settlement.fill_color = (200, 30, 30)
settlement.size = (0.3, 0.3)
world.run()
Die Nachbarschaft abfragen#
world.get_tiles_in_radius(position, radius) gibt alle Hexfelder innerhalb einer bestimmten Hex-Distanz zurück. tile.get_neighbour_tiles() gibt die bis zu sechs Nachbarn eines Hexfelds zurück. Das ist nützlich für Catan-Regeln wie „der Räuber blockiert alle Hexfelder um die Wüste“.
import miniworlds
world = miniworlds.HexWorld(7, 7, tile_size=40)
world.background.grid = True
center = world.get_tile((3, 3))
for tile in world.get_tiles_in_radius(center.position, 1):
actor = miniworlds.Actor(tile.position)
actor.fill_color = (0, 120, 0)
world.run()