Како направити игру змија у Питхон-у

Kreiranje jednostavne igre zmije u Pythonu

Ukoliko ste ljubitelj igrice zmija, ovaj tekst će vam sigurno biti interesantan.

Pokazaću vam kako da napravite jednostavnu igru zmija, koju čak i početnici u Python programiranju mogu lako razviti.

Postoji više načina za kreiranje ove igre, a jedan od njih uključuje korišćenje PyGame biblioteke, koja služi za razvoj igara u Pythonu.

Drugi pristup je korišćenje biblioteke `turtle`. Ovaj modul je već instaliran uz Python i pruža virtuelno platno na kojem korisnici mogu da kreiraju oblike i slike.

U ovom tekstu ćemo koristiti upravo `turtle` biblioteku za implementaciju naše jednostavne igre zmija, koja je idealna za početnike, posebno za one koji tek uče Python.

Pored ovog modula, koristićemo još dva modula:

  • `time` modul – Omogućava nam praćenje vremena proteklog od prethodnog trenutka.
  • `random` modul – Služi za generisanje nasumičnih brojeva u Pythonu.

Od ostalih osnovnih alata potreban vam je uređivač teksta po vašem izboru. Ja ću koristiti VSCode. Takođe, potrebno je da imate instaliran Python 3, a možete koristiti i online kompajler.

Biće zabavno, krenimo!

Kako funkcioniše igra zmija

Cilj igre je da igrač ostvari što veći rezultat tako što će kontrolisati zmiju koja sakuplja hranu prikazanu na ekranu.

Igrač kontroliše zmiju pomoću četiri strelice za smer, koje menjaju pravac kretanja zmije. Ako zmija udari u zid ili u samu sebe, igrač gubi igru.

Sledeći koraci su neophodni za implementaciju ove igre:

  • Uvoz unapred instaliranih modula (turtle, time i random).
  • Kreiranje ekrana igre pomoću turtle modula.
  • Podešavanje tastera za upravljanje kretanjem zmije po ekranu.
  • Implementacija logike igre.

Napravite datoteku `snakegame.py` u koju ćemo dodati kod za implementaciju.

Uvoz modula

U ovom delu koda uvešćemo turtle, time i random module koji su standardno uključeni u Python. Zatim ćemo definisati početne vrednosti za rezultat igrača, najveći rezultat koji će igrač postići i vreme kašnjenja između poteza. `time` modul se koristi za izračunavanje vremena kašnjenja.

Dodajte sledeći kod u datoteku `snakegame.py`:

  
import turtle
import random
import time

player_score = 0
highest_score = 0
delay_time = 0.1

Kreiranje ekrana igre

`turtle` modul nam omogućava da napravimo virtuelno platno koje će predstavljati ekran igre. Tu ćemo kreirati telo zmije i hranu koju zmija sakuplja. Na ekranu će biti prikazan i trenutni rezultat igrača.

Dodajte sledeći kod u Python datoteku:


# Kreiranje ekrana
wind = turtle.Screen()
wind.title("Zmijska avantura🐍")
wind.bgcolor("red")

# Veličina ekrana
wind.setup(width=600, height=600)


# Kreiranje zmije
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"

# Kreiranje hrane
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("Rezultat: 0 Najbolji Rezultat : 0", align="center", 
font=("Arial", 24, "normal"))
turtle.mainloop()

Gornji kod prvo inicijalizuje ekran, postavlja naslov i boju pozadine. Zatim definišemo veličinu prozora i crtamo oblik zmije na virtuelnom platnu.

Metoda `penup()` podiže olovku, tako da se linija ne iscrtava dok se kornjača kreće. Metoda `goto(x, y)` pomera kornjaču na apsolutnu poziciju.

Zatim kreiramo hranu koju zmija sakuplja. Prikazujemo trenutni rezultat igrača i najbolji rezultat tokom igre. Koristimo metodu `pen.write()` da bismo to ostvarili. `hideturtle()` sakriva ikonicu kornjače u delu ekrana gde je ispisan tekst.

Važno je da dodate `turtle.mainloop()` na kraj vašeg koda, što će omogućiti da ekran ostane otvoren i da korisnik može da interaguje.

Pokrenite datoteku i trebalo bi da dobijete sledeći izlaz:

Podešavanje tastera za kretanje zmije

Ovde ćemo definisati tastere za kontrolu smera kretanja zmije. Koristićemo ‘L’ za levo, ‘R’ za desno, ‘U’ za gore i ‘D’ za dole. Ova uputstva ćemo implementirati koristeći funkciju smera kornjače koju pozivamo na zmiju.

Dodajte sledeći isječak koda:


# Dodela pravca
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')

Funkcija `move()` postavlja kretanje zmije na definisanoj poziciji u okviru precizne vrednosti koordinata.

Funkcija `listen()` osluškuje događaje i poziva metode koje pomeraju zmiju u odgovarajućem smeru kada igrač pritisne taster.

Implementacija igre zmija

Nakon postavljanja osnovnog izgleda igre, moramo da je oživimo.

To uključuje sledeće:

  • Povećanje dužine zmije svaki put kada sakupi hranu, po mogućstvu različitom bojom.
  • Povećanje rezultata igrača svaki put kada zmija sakupi hranu i praćenje najboljeg rezultata.
  • Igrač mora biti u mogućnosti da izbegne sudar sa zidom ili telom zmije.
  • Igra se ponovo pokreće kada se zmija sudari.
  • Rezultat igrača se resetuje na nulu, dok se najbolji rezultat pamti.

Dodajte preostali kod u Python datoteku:


segments = []

# Implementacija igre
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("Rezultat igrača: {} Najbolji rezultat: {}".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)

            # Dodavanje segmenta
            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("Rezultat igrača: {} Najbolji rezultat: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    # Provera kolizije
    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("Rezultat igrača: {} Najbolji rezultat: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

     time.sleep(delay_time)

turtle.mainloop()

U gornjem isječku koda, postavljamo nasumičnu poziciju za hranu zmije na ekranu. Svaki put kada zmija sakupi hranu, njen segment tela se povećava različitom bojom; belom u ovom slučaju, kako bi se razlikovao njen rast.

Nakon što zmija sakupi hranu, a da se ne sudari sa zidom ili sobom, hrana se postavlja na nasumičnu lokaciju unutar opsega od 270 koordinata veličine ekrana. Svaki put kada zmija pokupi hranu, rezultat se povećava za 5. Kada se zmija sudari, rezultat je postavljen na 0, dok ekran i dalje pokazuje najbolji rezultat.

Sada pokrenite Python datoteku i trebali biste videti ekran kornjače sa igrom:

Zaključak 🐍

Korišćenje `turtle` biblioteke je zabavan i jednostavan način za kreiranje igre zmija, kao što smo videli u ovom tekstu. Alternativno, možete iskoristiti PyGame biblioteku. Možete pogledati PyGame uputstvo ovde da vidite kako drugačije možete implementirati igru.

Takođe možete isprobati igru pogađanja brojeva u Pythonu ili naučiti kako dohvatiti JSON podatke u Pythonu.
Uživajte u programiranju!