Craven hat geschrieben:
Ich würds mir gerne mal ansehen, schon alleine weil mich interessiert, wie genau du die level aufbaust.
Der Aufbau der Level ist recht einfach. Nicht ich, sondern ein mir unbekannter Programmierer hat sich das bereits Ende der 70er Jahre ausgedacht:
Der Bildschirm wird in 3x3 Segmente á 26x7 aufgeteilt, in denen sich je ein Raum zufälliger Größe befinden kann. Nummeriert man die Segmente von oben links nach unten rechts, existieren entweder immer 1,4,7 oder 3,4,5. Die restlichen 6 Räume entstehen mit einer Wahrscheinlichkeit von ja 45%. Benachbarte Räume werden jetzt mit zufällig aussehenden Gängen verbunden und mit einigen toten Gängen dekoriert.
Ich würde das vielleicht so programmieren:
Code:
def create_level():
must_exist = choose([1, 4, 7], [3, 4, 5])
for r in range(9):
if r in must_exist or percent(45):
create_room(r)
for r in range(9):
try_to_connect(r, r + 1, must_exist)
try_to_connect(r, r + 3, must_exist)
for r1, r2, r3 in [[0, 1, 2], [0, 3, 6], [2, 5, 8], [6, 7, 8]]:
if room(r1) and not room(r2) and room(r3) and percent(75):
create_passage(r1, r3)
def create_room(r):
height = rnd(4, 6)
width = rnd(7, 26)
row = rnd(0, 6 - height) + (r / 3) * 7
col = rnd(0, 26 - width) + (r % 3) * 27
rooms[r] = Room(row, col, height, width)
def try_to_connect(r1, r2, must_exist):
if is_adjacent(r1, r2):
if r1 in must_exist or r2 in must_exist or percent(20):
create_passage(r1, r2)
def is_adjacent(r1, r2):
return room(r1) and room(r2) and (
(abs(r1 % 3 - r2 % 3) == 1 and same_row(r1, r2)) or
(abs(r1 / 3 - r2 / 3) == 1 and same_col(r1, r2)))
def room(r):
return rooms[r] if 0 <= r < 9 else None
def create_passage(r1, r2):
if r2 > r1: r1, r2 = r2, r1
if same_row(r1, r2):
start_row = room(r1).random_row
start_col = room(r1).right_col + 1
end_row = room(r2).random_row
end_col = room(r2).left_col - 1
middle = (start_col + end_col + rnd(0, 1)) / 2
# horizontal line from start to middle
# then vertical line if rows differ
# then horizontal line to end
elif same_col(r1, r2):
start_row = room(r1).bottom_row + 1
start_col = room(r1).random_col
end_row = room(r2).top_row - 1
end_col = room(r2).random_col
middle = (start_row + end_row + rnd(0, 1)) / 2
# vertical line from start to middle
# then horizontal line if cols differ
# then vertical line to end
else:
assert False
def same_row(r1, r2): return r1 / 3 == r2 / 3
def same_col(r1, r2): return r1 % 3 == r2 % 3
Stefan