Przejdź do treści

Gra w kolory

Wstęp

TODO

Czego się nauczysz

  • Algorytmu Flood Fill
  • TODO

Gra

TODO

Pełen program z komentarzami

import pgzrun
import random

# Szerokość okna
WIDTH = 800

# Wysokość okna
HEIGHT = 600

# Długość boku pojedyńczego, kwadratowego pola
field_size = 20

# Szerokość całego pola gry - ilość pojedyńczych pól
field_width = WIDTH // field_size

# Wysokość całego pola gry - ilość pojedyńczych pól
field_height = HEIGHT // field_size

# Pole gry
field = []

# Dostępne kolory pól gry. Pierwszy jest zarezerwowany na kolor początkowy.
colors = [(255, 255, 255), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255)]

# Ilość dostępnych kolorów
colors_size = len(colors)

# Początkowo gracze mają pierwszy kolor z tablicy
player_color = 0
computer_color = 0

# Zaczyna gracz
current_player = 1

def draw():
    # Czyścimy ekran gry, wypełniając go czarnym kolorem
    screen.fill((0, 0, 0))

    # Rysujemy pole gry
    draw_field()

# Rysowanie pola gry
def draw_field():
    for x in range(field_width):
        for y in range(field_height):
            # Pobieramy kolor pola gry
            field_color = field[x][y]

            # Obliczamy współrzędne pola na ekranie
            field_x = x * field_size
            field_y = y * field_size

            # Tworzymy prostokąt pola gry do narysowania
            field_rect = Rect((field_x, field_y), (field_size, field_size))

            # Rysujemy pole gry na ekranie
            screen.draw.rect(field_rect, field_color)

def update():
    global current_player
    # Jeżeli jest tura komputera
    if current_player == 2:
        # Wykonujemy ruch komputera
        computer_move()
        current_player = 1

# Wykonujemy ruch komputera
def computer_move():
    global computer_color

    new_color = computer_color

    # Dopóki wylosowany ruch nie jest dozwolony
    while new_color == computer_color or new_color == player_color:
        # Losujemy nowy ruch
        new_color = random.randint(1, colors_size - 1)

    flood_fill(field_width - 1, field_height - 1, computer_color, new_color)
    computer_color = new_color

# Odczytujemy ruch gracza
def on_key_down(key):
    global player_color, current_player

    # Jeżeli nie jest tura gracza
    if current_player != 1:
        # Kończymy działanie funkcji
        return

    new_color = player_color
    if key == keys.K_1:
        new_color = 1

    if key == keys.K_2:
        new_color = 2

    if key == keys.K_3:
        new_color = 3

    if key == keys.K_4:
        new_color = 4

    if key == keys.K_5:
        new_color = 5

    # Jeżeli ruch nie jest dozwolony
    if new_color == player_color or new_color == computer_color:
        return

    flood_fill(0, 0, player_color, new_color)
    player_color = new_color
    current_player = 2

def flood_fill(x, y, old_color, new_color):
    global field

    if x < 0 or x >= field_width:
        return

    if y < 0 or y >= field_height:
        return

    if field[x][y] != colors[old_color]:
        return

    field[x][y] = colors[new_color]
    flood_fill(x + 1, y, old_color, new_color)
    flood_fill(x - 1, y, old_color, new_color)
    flood_fill(x, y + 1, old_color, new_color)
    flood_fill(x, y - 1, old_color, new_color)

# Przygotowanie pola gry, wypełniamy je losowymi wartościami
def prepare_field():
    for x in range(field_width):
        # Dodajemy pusty wiersz
        field.append([])

        for y in range(field_height):
            # Losujemy numer koloru, pomijając pierwszy z tablicy
            random_index = random.randint(1, colors_size - 1)

            # Wybieramy kolor, zgodnie z wylosowaną liczbą
            random_color = colors[random_index]

            # Dodajemy nowe pole do planszy
            field[x].append(random_color)

    # Ustawiamy początkowe kolory dla początkowych pól graczy
    field[0][0] = colors[0]
    field[field_width - 1][field_height - 1] = colors[0]

# Przygotowujemy pole gry
prepare_field()

# Uruchamiamy grę
pgzrun.go()

Testujemy działanie

https://replit.com/@damiankurpiewski/ColorsGame

TODO