Beiß dich nicht selbst
Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 9 von 31.
Das Spiel endet auch, wenn der Kopf gegen den Körper läuft. Füge dies zu der Prüfung hinzu, die das Spiel beendet:
if x < 0 or x >= COLS or y < 0 or y >= ROWS or (x, y) in body[:-1]:
alive = FalseBei der Prüfung wird body[:-1] verwendet, 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 Zelle des Schwanzes nicht.
[:-1] ist ein Slice: die Liste vom Anfang bis zum letzten Eintrag, wobei dieser nicht enthalten ist.
Aufgabe
SchwerBeende das Spiel, wenn sich der neue Kopf (x, y) in body[:-1] befindet, und zwar in derselben Prüfung wie bei den Wänden.
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 Projekte
Übe selbstständig: Pygame-Playground