Menu
CoddyTech

Dinding

Termasuk bagian Proyek dalam perjalanan Pygame di Coddy. Pelajaran 8 dari 31.

Permainan berakhir saat kepala akan keluar dari grid. Sebuah sel berada di grid jika kolomnya dari 0 sampai COLS - 1 dan barisnya dari 0 sampai ROWS - 1.

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:
        # sisipkan, makan, atau pop, seperti sebelumnya

Perhatikan x >= COLS, bukan x > COLS: kolom diberi nomor mulai dari 0, jadi kolom COLS sudah melewati tepi.

Lakukan pengujian sebelum kamu bergerak. Kepala tidak pernah keluar dari grid, dan setelah alive bernilai false, ular tetap berada di tempatnya. Tampilkan Game over di tengah pada posisi (240, 180) selama nilainya false.

challenge icon

Tantangan

Sedang
  1. Atur alive = True sebelum perulangan.
  2. Letakkan seluruh gerakan di dalam if alive:. Hitung x dan y; jika sel itu berada di luar grid, atur alive = False, jika tidak, sisipkan, makan, atau keluarkan seperti sebelumnya.
  3. Saat alive bernilai false, tampilkan Game over di tengah pada (240, 180).

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Pygame