POMOC NAPRAWA KODU

0

** Hej :) potrzebuję pomocy w naprawie kodu - kółko i krzyżyk 5x5, pygame :( Może znajdzie się jakaś dobra dusza, która wie jak pomóc :D **

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *

# ----------------------------------------------------------------------
# STAŁE
# ----------------------------------------------------------------------

WIDTH = 600
HEIGHT = 480

BOARD_SIZE = 5

BLOCK_SIZE = 50

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# ----------------------------------------------------------------------
# INICJALIZACJA
# ----------------------------------------------------------------------

pygame.init()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

# marginesy aby plansza była centralnie
margin_left = (WIDTH - (BOARD_SIZE * BLOCK_SIZE)) / 2
margin_top = (HEIGHT - (BOARD_SIZE * BLOCK_SIZE)) / 2

# tlo normalne kwadratu
bg_normal = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE))
pygame.draw.rect(bg_normal, WHITE, (1, 1, BLOCK_SIZE - 2, BLOCK_SIZE - 2))

# tlo kwadratu po najechaniu myszki
bg_hovered = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE))
pygame.draw.rect(bg_hovered, GREEN, (1, 1, BLOCK_SIZE - 2, BLOCK_SIZE - 2))

# kółko (nakładane później na tło - dzięki przezroczystości)
block_O = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE), pygame.SRCALPHA, 32)
pygame.draw.circle(block_O, RED, (BLOCK_SIZE / 2, BLOCK_SIZE / 2), (BLOCK_SIZE - 10) / 2, 4)

# krzyżyk (nakładany później na tło - dzięki przezroczystości)
block_X = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE), pygame.SRCALPHA, 32)
pygame.draw.line(block_X, BLUE, (5, 5), (BLOCK_SIZE - 5, BLOCK_SIZE - 5), 4)
pygame.draw.line(block_X, BLUE, (5, BLOCK_SIZE - 5), (BLOCK_SIZE - 5, 5), 4)

# słownik rodzai kwadratów - do rysowania planszy bez używania `if`
blocks = {
    'O': block_O,
    'X': block_X,
}

# pozycje kwadratów na ekranie
blocks_pos = [
    [(margin_left + x * BLOCK_SIZE, margin_top + y * BLOCK_SIZE)
     for x in range(BOARD_SIZE)]
    for y in range(BOARD_SIZE)
]

# fonty uzywane w napisach
font_50 = pygame.font.SysFont(None, 50)
font_20 = pygame.font.SysFont(None, 20)

# teksty o stałej treści
escape_text = font_20.render('press ESC to exit', False, WHITE, BLACK)
escape_text_rect = escape_text.get_rect()
escape_text_rect.midbottom = screen.get_rect().midbottom

# wiersz i kolumna bloku najechanego myszką
hovered = None

# pusta plansza
board = [[None for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]

# listy do zliczania postawionych znaków
# w wierszasz, kolumnach i przekatnych (diagonals)
rows = {
    'O': [0] * BOARD_SIZE,
    'X': [0] * BOARD_SIZE,
}
cols = {
    'O': [0] * BOARD_SIZE,
    'X': [0] * BOARD_SIZE,
}
dias = {
    'O': [0, 0],
    'X': [0, 0],
}

# aktualny gracz
player = 'X'

# stany gry
gameover = False
gameover_text = False
running = True

# zegar do utrzymywania stałej prędkosci gry
clock = pygame.time.Clock()

# ----------------------------------------------------------------------
# GŁÓWNA PĘTLA
# ----------------------------------------------------------------------

while running:

    # --- zdarzenia ---

    for event in pygame.event.get():

        if event.type == QUIT:
            running = False

        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False

        elif event.type == MOUSEMOTION:
            # przeliczanie pozycji myszy na numery wiersza i kolumny
            x, y = event.pos
            x, y = (x - margin_left) / BLOCK_SIZE, (y - margin_top) / BLOCK_SIZE

            # zapamietanie kwadratu jesli znajduje się na planszy
            if -1 < x < BOARD_SIZE and -1 < x < BOARD_SIZE:
                hovered = (x, y)
            else:
                hovered = None

        elif event.type == MOUSEBUTTONDOWN:
            if event.button == 1:  # lewy
                # sprawdzanie czy kliknięto na planszy przed końcem gry
                if hovered and not gameover:
                    x, y = hovered
                    # sprawdzenie czy pole jest puste
                    if not board[y][x]:
                        # wstawienie odpowiedniego znaku,
                        board[y][x] = player

                        # policzenie znakow w wierszach,
                        # kolumnach i na przekatnej
                        # oraz sprawdzenie czy koniec gry

                        # wiersz
                        rows[player][y] += 1
                        if rows[player][y] == BOARD_SIZE:
                            gameover = True

                        # kolumna
                        cols[player][x] += 1
                        if cols[player][x] == BOARD_SIZE:
                            gameover = True

                        # przekątne (diagonals)
                        if x == y:
                            dias[player][0] += 1
                            if dias[player][0] == BOARD_SIZE:
                                gameover = True
                        if x + y == BOARD_SIZE - 1:
                            dias[player][1] += 1
                            if dias[player][1] == BOARD_SIZE:
                                gameover = True

                        # zmiana gracza
                        if not gameover:
                            player = ('O' if player == 'X' else 'X')

    # --- przeliczenia ---

    if gameover and not gameover_text:
        win_text = font_50.render('WINNER: ' + player, False, BLACK, GREEN)
        win_text_rect = win_text.get_rect()
        win_text_rect.center = screen.get_rect().center
        gameover_text = True

    # --- rysowanie ---

    # plansza
    for y in range(BOARD_SIZE):
        for x in range(BOARD_SIZE):
            # tło kwadratu
            if hovered == (x, y):
                screen.blit(bg_hovered, blocks_pos[y][x])
            else:
                screen.blit(bg_normal, blocks_pos[y][x])
            # kółko lub krzyżyk
            if board[y][x]:
                screen.blit(blocks[board[y][x]], blocks_pos[y][x])

    # aktualny gracz (jako X lub O) w lewym górnym rogu
    screen.blit(bg_hovered, (0, 0))
    screen.blit(blocks[player], (0, 0))

    # stały tekst
    screen.blit(escape_text, escape_text_rect)

    # tekst zależny od stanu gry
    if gameover:
        screen.blit(win_text, win_text_rect)

    pygame.display.flip()

    # --- 25 FPS (Frames Per Seconds) ---

    clock.tick(25)

# ----------------------------------------------------------------------
# KONIEC
# ----------------------------------------------------------------------

pygame.quit()
exit(0)
0
  1. Doprowadź kod do stanu oglądalności na forum (odpowiednie znaczniki w odpowiednich miejscach).
  2. Powinnaś napisać co Ci nie działa i od kogo masz ten kod... wiesz, prawa autorskie i te sprawy :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1