Menu
CoddyTech

Duvarlar

Coddy'nin Pygame Journey'sinin Projeler bölümünün bir parçası. Ders 8 / 31.

Kafa ızgaranın dışına çıktığında 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 üzerindedir.

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 uygula

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

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

challenge icon

Görev

Orta
  1. Döngüden önce alive = True ayarlayın.
  2. Tüm hareketi if alive: koşulunun içine alın. x ve y değerlerini hesaplayın; bu hücre ızgaranın dışındaysa alive = False ayarlayın, aksi takdirde önceki gibi hücreyi ekleyin, yemi yiyin veya hücreyi çıkarın.
  3. alive false olduğunda, Game over mesajını (240, 180) konumunda ortalanmış olarak gösterin.

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()
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground