Hur man gör ett ormspel i Python

By rik

Om du fascineras av det klassiska ormspelet, är du säkerligen intresserad av det här inlägget.

Här kommer jag att guida dig genom stegen för att skapa ett enkelt ormspel, ett projekt som är tillgängligt även för nybörjare inom Pythonprogrammering.

Det finns olika sätt att bygga detta spel. Ett av dem är att använda PyGame, ett Pythonbibliotek specialiserat på spelutveckling.

Ett annat alternativ är att använda turtle-biblioteket. Denna modul medföljer Python och erbjuder en virtuell yta där användare kan generera former och figurer.

I den här artikeln kommer vi att använda turtle-biblioteket för att utveckla ett enkelt ormspel. Detta tillvägagångssätt är särskilt bra för Python-nybörjare.

Utöver turtle-modulen kommer vi att använda ytterligare två moduler:

  • Tidsmodulen – den hjälper oss att registrera tiden som har gått i sekunder.
  • Slumpmodulen – den genererar slumptal inom Python.

Förutom dessa moduler behöver du en textredigerare efter eget val. Jag kommer att använda VSCode. Självklart behöver du Python 3 installerad på din dator, annars kan du använda en onlinekompilator som adminvista.com.

Det här kommer att bli spännande!

Spelmekanik i ormspelet

Spelets mål är att spelaren ska uppnå högsta möjliga poäng genom att styra ormen och samla mat som visas på skärmen.

Spelaren styr ormen med fyra riktningsknappar som styr ormens rörelse. Om ormen kolliderar med väggen eller sig själv förlorar spelaren.

Vi kommer att följa dessa steg för att implementera spelet:

  • Importera de nödvändiga modulerna (turtle, time och random).
  • Skapa speldisplayen med turtle-modulen.
  • Konfigurera tangenterna för att styra ormens rörelse.
  • Implementera själva spelet.

Skapa en fil som heter `snakegame.py` och lägg till koden där.

Importera nödvändiga moduler

Följande kod importerar turtle-, time- och random-modulerna, som är standard i Python. Vi kommer också att definiera startvärden för spelarens poäng, högsta poäng och en fördröjning för varje rörelse. Tidsmodulen används för att hantera fördröjningen.

Kopiera in följande kod i din `snakegame.py`-fil.

import turtle
import random
import time

player_score = 0
highest_score = 0
delay_time = 0.1

Skapa speldisplayen

Turtle-modulen skapar en virtuell duk som fungerar som spelets fönster. Här ritar vi ormens kropp och maten som ormen samlar. Vi visar även spelarens aktuella poäng.

Lägg till följande kod i filen:

# Skapar spelfönstret
wind = turtle.Screen()
wind.title("Ormspelet🐍")
wind.bgcolor("red")

# Fönsterstorlek
wind.setup(width=600, height=600)


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

# Skapar maten
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("Poäng: 0 Högsta poäng: 0", align="center", 
font=("Arial", 24, "normal"))
turtle.mainloop()

Koden initierar turtle-skärmen, ställer in titeln och bakgrundsfärgen. Efter att ha ställt in fönsterstorleken ritar vi ormens form.

`penup()`-metoden lyfter pennan så att ingen linje ritas när ormen rör sig. `goto(x, y)`-metoden flyttar ormen till de angivna koordinaterna.

Sedan skapar vi ormens mat. Vi kommer att visa spelarens aktuella poäng varje gång ormen äter mat och spelarens högsta poäng. `pen.write()`-metoden används för det. `hideturtle()` döljer pennan.

Det är viktigt att lägga till `turtle.mainloop()` i slutet av koden. Den ser till att skärmen stannar kvar så att vi kan interagera med den.

Kör filen och du bör se följande:

Ställa in rörelsetangenter

Här definierar vi tangenterna som styr ormens rörelse på skärmen. Vi använder ’V’ för vänster, ’H’ för höger, ’U’ för upp och ’N’ för ner. Vi kommer att implementera rörelseriktningar med hjälp av turtle-metoderna.

Lägg till följande kod:

# Tilldelar riktningar
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, 'V')
wind.onkeypress(moveright, 'H')
wind.onkeypress(moveup, 'U')
wind.onkeypress(movedown, 'N')

`move()`-funktionen sätter ormens position i de bestämda koordinaterna.

`listen()`-funktionen är en händelsehanterare som anropar metoderna som rör ormen när spelaren trycker på en tangent.

Implementera spelmekaniken

Efter att ha definierat grunderna för ormspelet måste vi implementera själva spelet i realtid.

Detta inkluderar:

  • Att ormen blir längre varje gång den äter mat (helst med en annan färg).
  • Öka spelarens poäng varje gång ormen äter mat och spåra högsta poängen.
  • Förhindra ormen från att kollidera med väggen eller sin egen kropp.
  • Starta om spelet när ormen kolliderar.
  • Återställa spelarens poäng till noll när spelet startas om, men behålla den högsta poängen.

Lägg till resterande kod i Python-filen:

segments = []

# Implementera spelförloppet
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("Spelarens poäng: {} Högsta poäng: {}".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)

        # Lägger till segment
        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("Spelarens poäng: {} Högsta poäng: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    # Kollisionskontroll
    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("Spelarens poäng: {} Högsta poäng: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    time.sleep(delay_time)

turtle.mainloop()

Koden skapar en slumpmässig position för ormens mat. Varje gång ormen äter maten läggs ett segment till med en annan färg (vit i det här fallet).

När ormen äter maten utan att krascha får maten en ny slumpmässig position inom 270 koordinater från skärmens centrum. Varje gång ormen äter ökar spelarens poäng med 5. När ormen kraschar sätts spelarens poäng till 0, medan den högsta poängen behålls.

Kör Python-filen så ska du se:

Slutsats 🐍

Turtle-biblioteket är ett roligt och enkelt sätt att skapa ormspelet som vi har sett. Du kan också implementera det med PyGame-biblioteket. Kolla in PyGame tutorials för att se hur du kan skapa spelet på ett annat sätt.

Du kan även kolla in gissningsspel i Python eller hur man hanterar JSON-data i Python.
Njut av programmeringen!