在Diessem Letzten Teil meiner kleinen Tutorial-Reihe中,您将看到Turtle-Modul von Python ein kleines流氓般的programmieren kann(他的Links zu Teil 1,Teil 2和Teil 3),以及其他人。安德伦·邓恩(Andrewen)和怪物(Monstern)之间的关系 Nun ist es nicht mehr so einfach是一名死于Händezu的Monster的Goldschätzezu gelangen ohne einem der死者,是不知名的Toum der Spielfigur故乡。

还需要进一步的改进:Ich habe das Spielefenstergrößergewählt(800 x 600 Pixel)和ihm eine andere Hintergrundfarbe budiert(wie auch der Screenshot zeigt)。
wn.setup(800, 600)
wn.bgcolor("#2b3e50")
wn.bgpic(os.path.join(os.getcwd(), "sources/turtle/roguelike/images/bground.gif"))
Das eigentlich Labyrinth bekam ein 640 x 480像素画格Hintergrundbild budiert,德森·卡切尔尼奇— Wie Alle Anderen in diesem Tutorial verwendeten Bildchen — bei der freien(CC BY 3.0)TomeTik Tiles Libraryausgeliehen habe。 Die Lizenz schreibt vor,daßderSchöpferder Bilder genannt wird –以及David E. Gervais 。 达米特·哈贝(Damit habe ich)死于历史。
Dachel die Kacheln nicht einzeln laden wollte habe ich sie mit Hilfe des freien(GPL)Programs平铺的zu einem einzigen,großenHintergrundbildzusammengefügt。 Dabei Stell sich dann heraus,daßich mit meiner Berechnung der linken,oberen Ecke bei -304 doch richtig lag。 沃尔夫·达兰分校的美术系主任,芬斯特·格洛斯·德·芬奇与德·芬斯特兰德·埃米特尔特·温德·德·芬奇亲密接触。 Ist aber das Fenstergrößerals das Labyrinth,丹·艾利斯·希克。
迷宫之间的联系与斯皮勒(Spieler)的精神交织在一起。 Spieler-Jargon HUD的Solch eine Anzeige nennt人(抬起头来)和Khalasse的联系如下:
class HeadUpDisplay(t.Turtle):
def __init__(self):
t.Turtle.__init__(self)
self.penup()
self.hideturtle()
self.speed(0)
self.color("white")
self.goto(-WIDTH/2, HEIGHT/2 + 5)
self.score = 0
def update_score(self):
self.clear()
self.write("Goldschatz des Spielers: {} Goldstücke".format(rogue.gold), False, align = "left",
font = ("Arial", 14, "normal"))
HUD的研究对象是Turtle,而在Initialisierung上的所有联系都来自geschickt wird,um dann dort zu bleiben,weil es ihre einzige Aufgabe ist,Ankerpunktfürden Text zu dienen und ihn bei Bedarferfmit。
实施大规章制度和实施死刑的法律,实行死刑。 怪兽基金会(Damon)和安舍因基金会(Intelligenz geben)的书信人(Daher komme ich jetzt zu denÄnderungen)。 Dazu habe ich in der Klasse Spine eine zweite Abstandsfunktioneingefügt,
def is_close_to(self, other):
a = self.xcor() - other.xcor()
b = self.ycor() - other.ycor()
distance = math.sqrt(a**2 + b**2)
if distance < 96:
return True
else:
return False
死刑法collides_with
法学家collides_with
Die Idee dahinter ist die,daßdas Monster ab einem Abstand von drei Kacheln(das entspricht 96 Pixeln)erkennen kann,derNäheist的流氓 。 死者流氓 ,死刑犯,死刑犯,死刑犯,死刑犯,死刑犯,死刑犯。 Dann bewegt迷宫怪兽维德祖弗勒格。 Um das zu realisieren,在der Kleasse Monster
Method Method move()
中的角色:Zeileneingefügt:
if self.is_close_to(rogue):
if rogue.xcor() < self.xcor():
self.dir = "left"
elif rogue.xcor() > self.xcor():
self.dir = "right"
elif rogue.ycor() < self.ycor():
self.dir = "down"
elif rogue.ycor() > self.ycor():
self.dir = "up"
Das ist eigentlich schon alles。 在贝菲尔的中央教堂
hud.update_score()
请参见Zeile vor dem update()
内容,damit das HUD mitbekommt,wann ein中的更新文档。
ZumSchluß,与其他人一起编程,在Gerne Quellcode中与其他人一起,在wollen:
import turtle as t
import random as r
import os
import mathWIDTH = 640
HEIGHT = 480wn = t.Screen()
wn.bgcolor("black")
wn.title("In den Labyrinthen von Buchhaim – Stage 4")
wn.setup(800, 600)
wn.bgcolor("#2b3e50")
wn.bgpic(os.path.join(os.getcwd(), "sources/turtle/roguelike/images/bground.gif"))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 is_close_to(self, other):
a = self.xcor() - other.xcor()
b = self.ycor() - other.ycor()
distance = math.sqrt(a**2 + b**2)
if distance < 96:
return True
else:
return Falsedef 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
if self.is_close_to(rogue):
if rogue.xcor() < self.xcor():
self.dir = "left"
elif rogue.xcor() > self.xcor():
self.dir = "right"
elif rogue.ycor() < self.ycor():
self.dir = "down"
elif rogue.ycor() > self.ycor():
self.dir = "up"
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))class HeadUpDisplay(t.Turtle):
def __init__(self):
t.Turtle.__init__(self)
self.penup()
self.hideturtle()
self.speed(0)
self.color("white")
self.goto(-WIDTH/2, HEIGHT/2 + 5)
self.score = 0
def update_score(self):
self.clear()
self.write("Goldschatz des Spielers: {} Goldstücke".format(rogue.gold), False, align = "left",
font = ("Arial", 14, "normal"))# 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 = [
"####################",
"# @#g #",
"# ####### ##### #",
"# # #g #",
"# # ##### #",
"####### # # #",
"# # ##### #",
"# ####### # #",
"# #O g#",
"# #################",
"# K #",
"########## ##### #",
"#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 = -304 + (x*32)
screen_y = 224 - (y*32)# 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 = -304 + (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 += 1def exitGame():
global keepGoing
keepGoing = Falsewall = Sprite(wall_shape)
rogue = Player(player_shape)
hud = HeadUpDisplay()# 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 Spielwn.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
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()
hud.update_score()
wn.update()
Quellcode ist nun ziemlich umfangreich und das Spiel ist nicht mehr einfach zu spielen。 贝米宁·特斯皮伦(Bei meinen Testspielen)和艾尔·比什尔·厄斯特(Esmal Emmal geschafft)都在这里。 在Eine Ecke Locken中的怪物,死在迷宫中的怪物,在Erkke迷宫中的怪物,在人类世界中的怪物,monsterfrei bekommt。
奥姆·德·哈贝·艾希·阿尔斯·祖斯维兹·埃尔施韦尼斯逝世,卡默·维德·索恩特·德·托尔·特罗尔·达洛斯·努尔·弗赖科默特,温格·伊恩·德· 罗格·赫洛斯洛克特。 戈尔德沙茨的多位艺术大师,赫劳斯洛克根博物馆。
Damit ist diese kleine教程-Reihe bedet。 Ihr weitere级别实施者,Ausgänge和Fallen einbaut,es以及Zaubersprüchen和zusätzlicheSchätzeversteckt。 Ich selber Lasse est estt als Blaupause so stehen und Falls es michüberkommt,neue Algorithmen zum Beispiel zur prozeduralen Generierung von Leveln oder zurErhöhungung»Intelligenz«der und und und ichichuren坎恩
Ein Ergebnis死于kleine Tus-Reihe jedenfalls schon gezeigt:Es ist durchausmöglich,ein Rogue样的 oder ein anderes RPG mit dem Turtle-Modul der Standard-Bibliothek zu bauen。 HabtSpaßdamit,例如,贝因·斯皮伦(Spielen)或贝因·魏特伦特维尔肯(Weitentwickeln)。