Nachdem ich im ersten Teil dieser kleinen Tutorialreihe die Grundlagen gelegt und ein Labyrinth erschaffen hatte,在德·西姆·塞尔(Dem sich unser Held),德· 罗格 (Ber Rogue) ,Bewegen konnte und im zweiten möchteich nun im Dritten Teil das Labyrinth mit Monsternbevölkern,die Spieer das Leben schwer machen sollen:

Die Monster habe ich mir ebenfalls wieder bei der freien(CC BY 3.0)TomeTik Tiles图书馆澳大利亚。 Die Lizenz schreibt vor,daßderSchöpferder Bilder genannt wird –以及David E. Gervais 。 Einwohner des Labyrinths sollen ein Ork,ein Schmerzkiller,reptilien-Mann和ein Troll sein。 更加激进的企业家:




像素级联32像素像素级警告。 Nachdem死于战争,《 Turngraphik载货登记册》上载明:
orc_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/orc.gif")
painkiller_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/painkiller.gif")
reptileman_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/reptileman.gif")
troll_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/troll.gif")
shapes = [wall_shape, player_shape, gold1_shape, gold2_shape, gold3_shape,
gold4_shape, gold5_shape, gold6_shape,
orc_shape, painkiller_shape, reptileman_shape, troll_shape]
for shape in shapes:
wn.register_shape(shape)
您可以在Eine Liste geformt中更改形状,而在-Schleife registriert中可以使用eine Liste gepackt和eise dan中的形状。
Die Klasse Monster
ist komplett neu hinzugekommen。 Auch sie erbtnatürlichvon Sprite
,帽子aine eine eigene move()
Methode,死了怪物Jason Gegensatz zum Rogue nicom vom Spieler gesteuert werden,儿子现代自治。
class Monster(Sprite):
def __init__(self, shape, x, y):
Sprite.__init__(self, shape)
self.x = x
self.y = y
self.goto(self.x, self.y)
self.dir = r.choice(["up", "down", "left", "right"])
def move(self):
if self.dir == "up":
dx = 0
dy = 32
elif self.dir == "down":
dx = 0
dy = -32
elif self.dir == "left":
dx = -32
dy = 0
elif self.dir == "right":
dx = 32
dy = 0
else:
dx = 0
dy = 0
move_to_x = self.xcor() + dx
move_to_y = self.ycor() + dy
if (move_to_x, move_to_y) not in walls:
self.goto(move_to_x, move_to_y)
else:
self.dir = r.choice(["up", "down", "left", "right"])
# Set Timer
t.ontimer(self.move, r.randint(100, 300))
死于“怪兽”的怪兽。 Zu Beginn wired mit choice()
最重要的是Himmelsrichtungen ausgesucht。 在《 Richtungläuftdas Monster solange weiter》中,一个人是Hindernisstößt。 Dannsucht es wiederzufälligeine neue Himmelsrichtung aus und wenn diese frist ist,Läuftes in Richse solange weiter,bis erneut auf ein Hindernis trifft。 Dieses doch recht einfache Bewegungsmuster bedeutet aber,daßdie Monster nichtüberallhinkommen。 取消链接后,您将无法正常连接(siehe Screenshot oben),请进入怪物网站(Monster sonst darin auf ewig gefangenwäre)。 Auch der Ork kann在Mittelgang zu Gelangen的Drittel nicht verlassen先生的帽子中工作。
在《怪物史》中的“聪明人”,《怪兽》,《怪兽》中。
Die Monster bewegen sich Timer -gesteuert,daich die ontimer
-Methode des Turtle-Moduls ausprobieren wollte。 Sieführteine Funktion靠近Millisekunden aus。 Damit ist das Spiel加强了genommen kein Rogue风格的模仿,daer柏林人的解释Rogue风格的喜欢。 Aber ich wollte zum einen nichtpäpstlicherals der Papst sein und zum anderen hat solch ein Spiel mit autonom sich bewegenden Gegnern,dasähnlichwie diefrühenZelda -Spiele funktionert,ja durchaus auch seinen Re。
einerspätere版本中的ic飞机aber版本wieder zum rundenbasierten Prinzipzurückzukehren。
首次修读入门课程(由怪物伍登·杰威尔斯·杜恩·爱因·格罗森·布赫斯塔本
level_1 = [
"####################",
"# @# #",
"# ####### ##### #",
"# K # #g #",
"# # ##### #",
"####### # # O #",
"# # ##### #",
"# ####### # #",
"# # g#",
"# #################",
"# #",
"########### #### #",
"#g # R #",
"# T #g #",
"####################"
]
Die Monster bekommen eine eigene Liste monsters = []
和迷宫建立游戏-威斯威根(Wezweigungen erweitert werden),怪物死在游戏中:
elif sprite == "O":
orc = Monster(orc_shape, screen_x, screen_y)
monsters.append(orc)
elif sprite == "K":
painkiller = Monster(painkiller_shape, screen_x, screen_y)
monsters.append(painkiller)
elif sprite == "R":
reptileman = Monster(reptileman_shape, screen_x, screen_y)
monsters.append(reptileman)
elif sprite == "T":
troll = Monster(troll_shape, screen_x, screen_y)
monsters.append(troll)
在类似 einem echten Rogue的 RPG游戏中 ,杰德姆(Jedem)怪物伊恩(Eine eigene eigene)克拉西(Keasse mit einem eigenen) Schrollßlichverhält与Ork anders als ein在Troll和dieer wieder anders als ein在Reptilienmensch。 Sie besitzen-盗版者Rogue kommt-非常不喜欢Stärken和Eigenschaften。 Aber dasschießtüberdas Ziel死于Tutorials hinaus,das ja nur eine Blaupausefüreigene Experimente sein und zeigen soll,daßman so eRogue like a mit mit pythons Turtle-Modul programmieren kann。
Nunmußnur Noch —在Hauptschleife后台编程–在Monster zum上启动Timer开始初始化,在怪物Vom上启动以下代码:
for monster in monsters:
t.ontimer(monster.move, 250)
在Hauptschleife中的一个角色是Monsterliste eine eigene Unterschleife:
for monster in monsters:
if rogue.collides_with(monster):
print("Du bist gestorben!!!")
# Für Testzwecke, muß in einem realen Spiel durch die
# unten auskommentierte Zeile ersetzt werden.
rogue.goto_start_pos()
# rogue.destroy()
Wenn der Rogue的怪物Trifft,stirbt er gnadenlos。 Auch das ist eine Eigenschaft,zu einem 流氓般的 柏林柏林译本 gehört (Permadeath) 。 开始之前,您必须先了解更多内容,然后再查看更多内容。 Dazu habe ich在der Klasse中的Player
在den beiden Zeilen中播放
self.start_x = 0
self.start_y = 0
beiden Variablen start_x
和start_y
initialisiert,beim start_y
Maze-Setup mit
elif sprite == "@":
rogue.start_x = screen_x
rogue.start_y = screen_y
rogue.goto(screen_x, screen_y)
rogue.stamp
我»»echten«Werte zugewiesen bekommen。 方法论与历史
def goto_start_pos(self):
self.goto(self.start_x, self.start_y)
einführen, Rogue
博士死于围网Startpositionzurückschickt。 Aber wie gesagt,死于尼姑wirklich nicht mehr的Rogue风格,在einem»echten«Spiel,由datz auchübermehrere Dutzend prozeduralgenerte Levelverfügt,stirt der Rogue undmußwieder wieder vonederténténund in Einem neuen und –冯·沃恩·贝宁。
因此,修女维德·弗·阿莱,杰恩·奎尔文本,莱斯·奥德·迪斯·斯皮尔·纳赫·普米尔米尔·沃尔伦,科普莱特·奎尔文本:
import turtle as t
import random as r
import os
import math
wn = t.Screen()
wn.bgcolor("black")
wn.title("In den Labyrinthen von Buchhaim – Stage 3")
wn.setup(640, 480)
wall_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/wall.gif")
player_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/player.gif")
gold1_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/gold1.gif")
gold2_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/gold2.gif")
gold3_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/gold3.gif")
gold4_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/gold4.gif")
gold5_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/gold5.gif")
gold6_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/gold6.gif")
orc_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/orc.gif")
painkiller_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/painkiller.gif")
reptileman_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/reptileman.gif")
troll_shape = os.path.join(os.getcwd(), "sources/turtle/roguelike/images/troll.gif")
shapes = [wall_shape, player_shape, gold1_shape, gold2_shape, gold3_shape,
gold4_shape, gold5_shape, gold6_shape,
orc_shape, painkiller_shape, reptileman_shape, troll_shape]
for shape in shapes:
wn.register_shape(shape)
# Die Oberklasse Sprite, zugleich die Klasse für die Mauern des Labyrinths
class Sprite(t.Turtle):
def __init__(self, shape):
t.Turtle.__init__(self)
self.shape(shape)
self.penup()
self.speed(0)
def go_left(self):
go_to_x = self.xcor() - 32
go_to_y = self.ycor()
if (go_to_x, go_to_y) not in walls:
self.goto(go_to_x, go_to_y)
def go_right(self):
go_to_x = self.xcor() + 32
go_to_y = self.ycor()
if (go_to_x, go_to_y) not in walls:
self.goto(go_to_x, go_to_y)
def go_up(self):
go_to_x = self.xcor()
go_to_y = self.ycor() + 32
if (go_to_x, go_to_y) not in walls:
self.goto(go_to_x, go_to_y)
def go_down(self):
go_to_x = self.xcor()
go_to_y = self.ycor() - 32
if (go_to_x, go_to_y) not in walls:
self.goto(go_to_x, go_to_y)
def collides_with(self, other):
a = self.xcor() - other.xcor()
b = self.ycor() - other.ycor()
distance = math.sqrt(a**2 + b**2)
if distance < 5:
return True
else:
return False
def destroy(self):
self.goto(5000, 5000)
self.hideturtle()
# Der Spieler
class Player(Sprite):
def __init__(self, shape):
Sprite.__init__(self, shape)
self.gold = 0
self.start_x = 0
self.start_y = 0
def goto_start_pos(self):
self.goto(self.start_x, self.start_y)
# Die Schätze
class Treasure(Sprite):
def __init__(self, shape, x, y, amount):
Sprite.__init__(self, shape)
self.x = x
self.y = y
self.gold = amount
self.goto(self.x, self.y)
# Die Monster
class Monster(Sprite):
def __init__(self, shape, x, y):
Sprite.__init__(self, shape)
self.x = x
self.y = y
self.goto(self.x, self.y)
self.dir = r.choice(["up", "down", "left", "right"])
def move(self):
if self.dir == "up":
dx = 0
dy = 32
elif self.dir == "down":
dx = 0
dy = -32
elif self.dir == "left":
dx = -32
dy = 0
elif self.dir == "right":
dx = 32
dy = 0
else:
dx = 0
dy = 0
move_to_x = self.xcor() + dx
move_to_y = self.ycor() + dy
if (move_to_x, move_to_y) not in walls:
self.goto(move_to_x, move_to_y)
else:
self.dir = r.choice(["up", "down", "left", "right"])
# Set Timer
t.ontimer(self.move, r.randint(100, 300))
# Listen der Labyrinthe, der Mauern und der Schätze
levels = []
walls = []
treasures = []
treasure_shapes = [gold1_shape, gold2_shape, gold3_shape,
gold4_shape, gold5_shape, gold6_shape]
monsters = []
level_1 = [
"####################",
"# @# #",
"# ####### ##### #",
"# K # #g #",
"# # ##### #",
"####### # # O #",
"# # ##### #",
"# ####### # #",
"# # g#",
"# #################",
"# #",
"########### #### #",
"#g # R #",
"# T #g #",
"####################"
]
levels.append(level_1)
# Level Setup
def setup_maze(level):
global num_treasures
for y in range(len(level)):
for x in range(len(level[y])):
sprite= level[y][x]
screen_x = -308 + (x*32)
screen_y = 224 - (y*32)
if sprite == "#":
wall.goto(screen_x, screen_y)
walls.append((screen_x, screen_y))
wall.stamp()
elif sprite == "@":
rogue.start_x = screen_x
rogue.start_y = screen_y
rogue.goto(screen_x, screen_y)
rogue.stamp
elif sprite == "O":
orc = Monster(orc_shape, screen_x, screen_y)
monsters.append(orc)
elif sprite == "K":
painkiller = Monster(painkiller_shape, screen_x, screen_y)
monsters.append(painkiller)
elif sprite == "R":
reptileman = Monster(reptileman_shape, screen_x, screen_y)
monsters.append(reptileman)
elif sprite == "T":
troll = Monster(troll_shape, screen_x, screen_y)
monsters.append(troll)
elif sprite == "g":
treasures.append(Treasure(r.choice(treasure_shapes), screen_x, screen_y, r.randint(25, 250)))
num_treasures += 1
def exitGame():
global keepGoing
keepGoing = False
wall = Sprite(wall_shape)
rogue = Player(player_shape)
# Auf Tastaturereignisse lauschen
t.listen()
t.onkey(rogue.go_left, "Left")
t.onkey(rogue.go_right, "Right")
t.onkey(rogue.go_up, "Up")
t.onkey(rogue.go_down, "Down")
t.onkey(exitGame, "Escape") # Escape beendet das Spiel
wn.tracer(0)
num_treasures = 0
setup_maze(levels[0])
# Timer für die Monster initialisieren
for monster in monsters:
t.ontimer(monster.move, 250)
keepGoing = True
while keepGoing:
for treasure in treasures:
if rogue.collides_with(treasure):
rogue.gold += treasure.gold
print("Goldschatz des Spielers: {} Goldstücke".format(rogue.gold))
treasure.destroy()
num_treasures -= 1
if num_treasures == 0:
print("Glückwunsch, Du hast diesen Level überlebt!")
for monster in monsters:
if rogue.collides_with(monster):
print("Du bist gestorben!!!")
# Für Testzwecke, muß in einem realen Spiel durch die
# unten auskommentierte Zeile ersetzt werden.
rogue.goto_start_pos()
# rogue.destroy()
wn.update()
Das Spiel的沉浸式场景wirklich schwer,aber es ist schon spielbar和der Spieler kann,wenn nichtaufpaßt和seinen Rogue verlieren。 在Intelligenz verpassen的derNächstenFolgemöchteich中,doch vermutlich wird diese ein wenig auf sich warten lassen,diese ersten drei Folgen waren die einzigen和Deutscher Feiertage Hagen都将成为节目制作人。 另外,我还不愿透露姓名。 还在挖!