Patříte-li k nadšencům, které baví klasická hadí hra, pak vás tento text s jistotou zaujme.
Ukážu vám, jak navrhnout základní verzi hadí hry, kterou zvládne vytvořit i programátor-začátečník v jazyce Python.
Existuje více postupů, jak takovou hru sestavit. Jedna z cest vede přes knihovnu PyGame, která je pro vývoj her v Pythonu určena.
Další možností je využití knihovny Turtle. Tento modul je součástí standardní instalace Pythonu a umožňuje vytvářet grafické tvary a obrázky na virtuálním plátně.
Právě knihovnu Turtle použijeme v tomto článku pro implementaci jednoduché hadí hry, která je ideální pro začátečníky, zejména ty, kteří s Pythonem teprve začínají.
Kromě tohoto modulu si vypomůžeme ještě dvěma dalšími:
- Modul `time` – s jeho pomocí budeme zaznamenávat časové intervaly.
- Modul `random` – ten nám v Pythonu zajistí generování náhodných čísel.
Dále budete potřebovat libovolný textový editor. Já v tomto případě používám VSCode. Samozřejmostí je mít nainstalovaný Python 3. Pokud ho ještě nemáte, můžete využít i online kompilátor etechblog.cz.
Můžeme se pustit do práce!
Jak funguje hadí hra
Cílem hry je dosáhnout co nejvyššího skóre ovládáním hada, který sbírá jídlo objevující se na hrací ploše.
Hráč ovládá pohyb hada pomocí čtyř šipek, které odpovídají směru pohybu. Pokud had narazí do stěny nebo sám do sebe, hra končí.
Při implementaci hry budeme postupovat dle následujících kroků.
- Importujeme potřebné moduly (turtle, time a random).
- Vytvoříme herní obrazovku s pomocí modulu turtle.
- Nastavíme ovládání hada pomocí kláves.
- Implementujeme herní logiku.
Vytvořte nový soubor s názvem `snakegame.py`, do kterého vložíme implementační kód.
Importování modulů
Tato část kódu importuje moduly `turtle`, `time` a `random`, které jsou standardní součástí Pythonu. Dále nastavíme výchozí hodnoty pro skóre hráče, nejvyšší dosažené skóre a časové zpoždění v každém herním kroku. Modul `time` zde slouží k výpočtu zpoždění.
Vložte následující kód do souboru `snakegame.py`.
import turtle
import random
import time
player_score = 0
highest_score = 0
delay_time = 0.1
Vytvoření herní obrazovky
Modul `turtle` nám poslouží k vytvoření virtuálního plátna, které bude fungovat jako okno hry. Na tomto plátně vykreslíme hada, jídlo a také budeme zobrazovat skóre hráče.
Vložte tento kód do vašeho Python souboru.
# vytvoření herního okna
wind = turtle.Screen()
wind.title("Hadí bludiště 🐍")
wind.bgcolor("red")
# Nastavení velikosti okna
wind.setup(width=600, height=600)
# Vytvoření hada
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"
# Vytvoření jídla
snake_food = turtle.Turtle()
shapes = random.choice(['triangle','circle'])
snake_food.shape(shapes)
snake_food.color("blue")
snake_food.speed(0)
snake_food.penup()
snake_food.goto(0, 100)
pen = turtle.Turtle()
pen.speed(0)
pen.shape('square')
pen.color('white')
pen.penup()
pen.hideturtle()
pen.goto(0, 250)
pen.write("Skóre: 0 Nejvyšší skóre: 0", align="center",
font=("Arial", 24, "normal"))
turtle.mainloop()
Kód výše inicializuje obrazovku `turtle` a nastaví její titulek a barvu pozadí. Po nastavení rozměrů okna, nakreslíme hada na virtuální plátno.
Metoda `penup()` jednoduše zvedne pero želvy, takže se při pohybu želvy nekreslí čára. Metoda `goto(x,y)` nastaví želvu do absolutní pozice podle daných souřadnic.
Dále vytvoříme jídlo, které bude had sbírat. Na obrazovce také budeme zobrazovat aktuální skóre a nejvyšší dosažené skóre. K tomu využijeme metodu `pen.write()`. Funkce `hideturtle()` skryje ikonu želvy z obrazovky v oblasti, kde je text zobrazen.
Nezapomeňte přidat `turtle.mainloop()` na konec kódu, který zajistí, že se okno hry nezavře a umožní uživateli hru ovládat.
Spusťte soubor a měli byste vidět následující výstup:
Nastavení směrových kláves pro hada
Nyní nastavíme klávesy, které budou ovládat směr pohybu hada. Budeme používat `L` pro pohyb doleva, `R` pro pohyb doprava, `U` pro pohyb nahoru a `D` pro pohyb dolů. Tyto směry implementujeme pomocí funkce směru želvy, kterou budeme aplikovat na hada.
Přidejte do vašeho kódu následující fragment.
# přiřazení směrových kláves
def moveleft():
if snake.direction != "right":
snake.direction = "left"
def moveright():
if snake.direction != "left":
snake.direction = "right"
def moveup():
if snake.direction != "down":
snake.direction = "up"
def movedown():
if snake.direction != "up":
snake.direction = "down"
def move():
if snake.direction == "up":
coord_y = snake.ycor()
snake.sety(coord_y+20)
if snake.direction == "down":
coord_y = snake.ycor()
snake.sety(coord_y-20)
if snake.direction == "right":
coord_x = snake.xcor()
snake.setx(coord_x+20)
if snake.direction == "left":
coord_x = snake.xcor()
snake.setx(coord_x-20)
wind.listen()
wind.onkeypress(moveleft, 'L')
wind.onkeypress(moveright, 'R')
wind.onkeypress(moveup, 'U')
wind.onkeypress(movedown, 'D')
Funkce `move()` zajišťuje pohyb hada o definovanou hodnotu souřadnic.
Funkce `listen()` naslouchá událostem a volá metody, které pohnou hadem daným směrem po stisknutí klávesy.
Implementace herní logiky
Po vytvoření základního vzhledu hry je třeba ji oživit a uvést do reálného času.
To bude zahrnovat následující:
- Prodlužování hada pokaždé, když sní jídlo, a to nejlépe jinou barvou.
- Zvyšování skóre při každém snězení jídla a zaznamenávání nejvyššího skóre.
- Zajištění, aby had nenarazil do stěny nebo do vlastního těla.
- Restartování hry po kolizi.
- Nulování skóre hráče po restartu, ale zachování nejvyššího dosaženého skóre.
Doplňte zbytek kódu do vašeho python souboru.
segments = []
# Implementace herní logiky
while True:
wind.update()
if snake.xcor() > 290 or snake.xcor() < -290 or snake.ycor() > 290 or snake.ycor() < -290:
time.sleep(1)
snake.goto(0, 0)
snake.direction = "Stop"
snake.shape("square")
snake.color("green")
for segment in segments:
segment.goto(1000, 1000)
segments.clear()
player_score = 0
delay_time = 0.1
pen.clear()
pen.write("Skóre: {} Nejvyšší skóre: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))
if snake.distance(snake_food) < 20:
coord_x = random.randint(-270, 270)
coord_y = random.randint(-270, 270)
snake_food.goto(coord_x, coord_y)
# Přidání segmentu hada
added_segment = turtle.Turtle()
added_segment.speed(0)
added_segment.shape("square")
added_segment.color("white")
added_segment.penup()
segments.append(added_segment)
delay_time -= 0.001
player_score += 5
if player_score > highest_score:
highest_score = player_score
pen.clear()
pen.write("Skóre: {} Nejvyšší skóre: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))
# Kontrola kolizí se segmenty hada
for i in range(len(segments)-1, 0, -1):
coord_x = segments[i-1].xcor()
coord_y = segments[i-1].ycor()
segments[i].goto(coord_x, coord_y)
if len(segments) > 0:
coord_x = snake.xcor()
coord_y = snake.ycor()
segments[0].goto(coord_x, coord_y)
move()
for segment in segments:
if segment.distance(snake) < 20:
time.sleep(1)
snake.goto(0, 0)
snake.direction = "stop"
snake.color('white')
snake.shape('square')
for segment in segments:
segment.goto(1000, 1000)
segment.clear()
player_score = 0
delay_time = 0.1
pen.clear()
pen.write("Skóre: {} Nejvyšší skóre: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))
time.sleep(delay_time)
turtle.mainloop()
V tomto úryvku kódu jsme nastavili náhodnou pozici jídla na obrazovce. Pokaždé, když had sní jídlo, přidá se k němu nový segment v bílé barvě, aby byl vidět jeho růst.
Po snězení jídla se jídlo přesune na nové náhodné místo v rozsahu 270 souřadnic velikosti obrazovky. Skóre se zvýší o 5 bodů za každé sežrané jídlo. Po kolizi se skóre hráče vynuluje, ale nejvyšší dosažené skóre se zachová.
Nyní opět spusťte váš Python soubor. Měla by se vám zobrazit funkční verze hadí hry.
Závěr 🐍
Knihovna `turtle` je zábavný a snadný způsob, jak vytvořit hadí hru, jak jsme si ukázali v tomto článku. Alternativně lze stejnou hru implementovat i pomocí knihovny PyGame. Můžete si prohlédnout tutoriály PyGame a podívat se, jak by se hra dala implementovat jiným způsobem.
Můžete si také zkusit vytvořit hru na hádání čísel v Pythonu nebo se naučit, jak zpracovávat data JSON.
Přeji příjemné kódování!