Menu
CoddyTech

Duvarlar

Coddy'nin Pygame ile Oyun Yap kursunda ders 26 / 41.

Kafa ızgaranın dışına çıkacak olduğunda oyun sona erer. Bir hücrenin sütunu 0 ile COLS - 1 arasında ve satırı 0 ile ROWS - 1 arasında olduğunda hücre ızgaranın içindedir.

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:
        # önceki gibi insert, eat veya pop işlemlerini yap

x > COLS değil, x >= COLS olduğuna dikkat edin: sütunlar 0'dan başlayarak numaralandırılır, bu nedenle COLS sütunu zaten kenarın dışındadır.

Hareket etmeden önce test edin. Kafa hiçbir zaman ızgaranın dışına çıkmaz ve alive false olduktan sonra yılan bulunduğu yerde kalır. alive false iken Game over yazısını (240, 180) konumunda ortalanmış olarak gösterin.

challenge icon

Görev

Orta

Yılan bir duvara çarptığında oyunu bitir.

  1. Döngüden önce alive = True olarak ayarla ve hareketi if alive: koşulunun altına koy.
  2. Yeni hücre (x, y) ızgaranın dışındaysa alive = False olarak ayarla; aksi takdirde önceki gibi hücreyi ekle, yemi ye veya son hücreyi çıkar.
  3. alive false olduğunda, Game over mesajını (240, 180) koordinatında ortalanmış şekilde göster.

“Oyna” düğmesine bas ve bir duvara çarp: Game over mesajı görünür ve yılan durur. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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

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

    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    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))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()

Pygame ile Oyun Yap bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground