Beiß dich nicht selbst
Lektion 27 von 41 im Kurs Spiele mit Pygame erstellen von Coddy.
Das Spiel endet auch, wenn der Kopf mit dem Körper zusammenstößt. Ergänze den Test, der das Spiel beendet:
if x < 0 or x >= COLS or y < 0 or y >= ROWS or (x, y) in body[:-1]:
alive = FalseDer Test verwendet body[:-1], also jede Zelle außer der letzten. Bei einem Schritt ohne Futter bewegt sich der Schwanz im selben Schritt aus seiner Zelle heraus. Dem eigenen Schwanz nachzujagen ist sicher, daher zählt die Schwanzzelle nicht.
[:-1] ist ein Slice: die Liste vom Anfang bis zum letzten Element, das nicht eingeschlossen wird.
Aufgabe
SchwerBeende das Spiel, wenn die Schlange sich selbst beißt.
- Finde die Prüfung, die das Spiel an den Wänden beendet.
- Beende es auch, wenn sich der neue Kopf
(x, y)inbody[:-1]befindet.
Drücke auf „Spielen“, iss ein paar Mal und wende dich dann zurück in deinen Körper: Spiel vorbei. Drücke anschließend auf „Prüfen“.
Probier es selbst
import random
import pygame
CELL = 20
COLS, ROWS = 24, 18
TURNS = {
pygame.K_LEFT: (-1, 0),
pygame.K_RIGHT: (1, 0),
pygame.K_UP: (0, -1),
pygame.K_DOWN: (0, 1),
}
pygame.init()
screen = pygame.display.set_mode((COLS * CELL, ROWS * CELL))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
def draw_cell(cell, color):
col, row = cell
pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))
def new_food(body):
while True:
cell = (random.randrange(COLS), random.randrange(ROWS))
if cell not in body:
return cell
body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)
score = 0
alive = True
running = True
while running:
moving = direction
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key in TURNS:
turn = TURNS[event.key]
if turn != (-moving[0], -moving[1]):
direction = turn
if alive:
x = body[0][0] + direction[0]
y = body[0][1] + direction[1]
if x < 0 or x >= COLS or y < 0 or y >= ROWS:
alive = False
else:
body.insert(0, (x, y))
if (x, y) == food:
score += 1
food = new_food(body)
else:
body.pop()
screen.fill((30, 30, 46))
draw_cell(food, (235, 80, 80))
for cell in body[1:]:
draw_cell(cell, (120, 220, 120))
draw_cell(body[0], (180, 255, 160))
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (8, 6))
if not alive:
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 180)))
pygame.display.flip()
clock.tick(10)
pygame.quit()
Alle Lektionen in Spiele mit Pygame erstellen
3Raster und Listen
Ein Raster aus ZellenSchritt für SchrittÜbe selbstständig: Pygame-Playground