** 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)