Lag ditt eget slangespill i Python
Er du en entusiast av det klassiske slangespillet? Da vil denne artikkelen sikkert vekke din interesse.
I denne veiledningen skal vi sammen utforske hvordan du kan utvikle et enkelt slangespill, selv om du er helt fersk i Python-programmering. Det finnes flere tilnærminger for å realisere dette spillet, inkludert bruk av Pythons PyGame-bibliotek – et kraftig verktøy for spillutvikling. En annen metode er å benytte seg av skilpaddebiblioteket, en modul som allerede er inkludert i Python og som gir oss et virtuelt lerret for å skape former og bilder.
Vi vil fokusere på skilpaddebiblioteket i denne opplæringen, siden det er spesielt brukervennlig for nybegynnere i Python-utvikling. I tillegg til skilpadden, vil vi dra nytte av to andre moduler:
- Tidsmodulen: Lar oss holde oversikt over hvor mange sekunder som har passert.
- Tilfeldigmodulen: Genererer tilfeldige tall, noe som er avgjørende for spillet.
For å komme i gang trenger du en tekstredigerer etter eget valg (jeg bruker VSCode) og Python 3 installert på din maskin. Alternativt kan du bruke en online Python-kompilator som tipsbilk.net.
La oss sette i gang med dette spennende prosjektet!
Hvordan slangespillet fungerer
Målet med spillet er å oppnå høyest mulig poengsum ved å styre slangen til å spise maten som vises på skjermen. Slangen kontrolleres ved hjelp av piltastene, som korresponderer til slangens bevegelsesretning. Hvis slangen kolliderer med en vegg eller seg selv, er spillet over.
Følgende steg vil vi gjennomføre for å bygge spillet:
- Importering av nødvendige moduler (skilpadde, tid, tilfeldig).
- Opprettelse av spillskjermen med skilpaddemodulen.
- Definering av tastene for slangens bevegelser.
- Implementering av selve spillet.
Lag en fil som heter snakegame.py
der vi vil skrive koden vår.
Importerer modulene
Her importerer vi skilpadde, tid og tilfeldig-modulene, som er standard i Python. I tillegg setter vi startverdier for spillerens poengsum, høyeste poengsum, og forsinkelsestiden mellom hver bevegelse, som beregnes ved hjelp av tidsmodulen.
Legg til følgende kode i snakegame.py
-filen:
import turtle
import random
import time
player_score = 0
highest_score = 0
delay_time = 0.1
Opprette spillskjermen
Skilpaddemodulen lar oss opprette et virtuelt lerret som fungerer som spillvindu. På dette lerretet tegner vi slangens kropp og maten den skal samle, samt viser poengsummen.
Legg til denne koden i filen:
# Lag vindu
wind = turtle.Screen()
wind.title("Slangespill 🐍")
wind.bgcolor("red")
# Sett skjermstørrelse
wind.setup(width=600, height=600)
# Lag slangen
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"
# Lag mat
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("Poeng: 0 Høyeste poeng: 0", align="center",
font=("Arial", 24, "normal"))
turtle.mainloop()
Koden starter med å initialisere skilpaddeskjermen med tittel og bakgrunnsfarge, og setter vindusstørrelsen. Deretter tegner vi slangen og maten på det virtuelle lerretet. `penup()`-metoden løfter pennen slik at det ikke tegnes linjer når skilpadden beveger seg, og `goto(x,y)` setter skilpaddens posisjon.
Vi bruker `pen.write()` for å vise spillerens poengsum og høyeste poengsum. `hideturtle()` skjuler skilpaddeikonet.
Husk å inkludere `turtle.mainloop()` på slutten for å holde skjermen synlig.
Når du kjører filen, skal du se en rød skjerm med en svart firkant (slangen) og en blå trekant eller sirkel (maten).
Setter opp retningstastene for slangen
Her definerer vi tastene som skal styre slangens bevegelser: «L» for venstre, «R» for høyre, «U» for opp og «D» for ned. Disse funksjonene vil endre slangens bevegelsesretning med skilpaddens funksjoner.
Legg til følgende kode:
# Tildel retninger
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')
`move()`-funksjonen setter slangens bevegelse i en definert posisjon. `listen()` aktiverer hendelseslytteren som kaller de spesifikke metodene for å flytte slangen.
Implementeringen av selve spillet
Nå må vi gjøre spillet interaktivt. Dette innebærer:
- Øke slangens lengde når den spiser mat (med en annen farge).
- Øke poengsummen og holde oversikt over den høyeste poengsummen.
- Sørge for at slangen ikke kolliderer med vegger eller seg selv.
- Resette spillet ved kollisjon.
- Resette poengsummen til null, men beholde høyeste poengsum.
Legg til følgende kode:
segments = []
# Implementer spillet
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("Poeng: {} Høyeste poeng: {}".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)
# Legg til 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("Poeng: {} Høyeste poeng: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))
# Sjekk kollisjoner
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("Poeng: {} Høyeste poeng: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))
time.sleep(delay_time)
turtle.mainloop()
Koden gir maten en tilfeldig posisjon. Hver gang slangen spiser, legges det til et hvitt segment i kroppen. Når slangen kolliderer, resettes spillet.
Konklusjon 🐍
Skilpaddebiblioteket er et flott verktøy for å lage enkle spill som slangespillet. Hvis du ønsker å utforske mer, kan du prøve å implementere det samme spillet med PyGame-biblioteket. Du kan se PyGame-opplæringen her. Husk også at det finnes mange andre spennende Python-prosjekter du kan ta fatt på!