|
|
@ -1,42 +1,44 @@ |
|
|
import pygame |
|
|
import pygame |
|
|
|
|
|
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku |
|
|
import random |
|
|
import random |
|
|
import sys |
|
|
import sys |
|
|
|
|
|
|
|
|
# pygame.init() nastartuje všechny vnitřní moduly Pygame. |
|
|
|
|
|
# Je to naprosto povinný první krok před tím, než můžeme v Pygame cokoliv udělat. |
|
|
|
|
|
pygame.init() |
|
|
|
|
|
|
|
|
|
|
|
# --- Konstanty okna a rozvržení mřížky --- |
|
|
|
|
|
# Konstanty (velkými písmeny) se během hry nemění. Určují základní vlastnosti naší hry. |
|
|
|
|
|
SIRKA_OKNA = 600 |
|
|
|
|
|
VYSKA_OKNA = 600 |
|
|
|
|
|
FPS = 30 # Počet snímků za sekundu (jak rychle se hra překresluje). 30 bohatě stačí pro Pexeso. |
|
|
|
|
|
|
|
|
|
|
|
# Kolik karet chceme mít na šířku a na výšku? |
|
|
|
|
|
RADKY = 4 |
|
|
|
|
|
SLOUPCE = 4 |
|
|
|
|
|
# Velikost jedné karty v pixelech (obrazových bodech) |
|
|
|
|
|
KARTICKA_VELIKOST = 100 |
|
|
|
|
|
# Mezera mezi kartičkami |
|
|
|
|
|
MEZERA = 20 |
|
|
|
|
|
|
|
|
|
|
|
# Výpočet celkové šířky a výšky celé mřížky karet, abychom ji pak mohli na obrazovce vycentrovat |
|
|
|
|
|
Mrizka_sirka = (SLOUPCE * KARTICKA_VELIKOST) + ((SLOUPCE - 1) * MEZERA) |
|
|
|
|
|
Mrizka_vyska = (RADKY * KARTICKA_VELIKOST) + ((RADKY - 1) * MEZERA) |
|
|
|
|
|
|
|
|
|
|
|
# Vypočítáme, kde mřížka začíná na osách X (vodorovně) a Y (svisle), aby byla přesně uprostřed okna |
|
|
|
|
|
Odsazeni_x = (SIRKA_OKNA - Mrizka_sirka) // 2 |
|
|
|
|
|
Odsazeni_y = (VYSKA_OKNA - Mrizka_vyska) // 2 |
|
|
|
|
|
|
|
|
|
|
|
# Barvy v Pygame se zadávají ve formátu (R, G, B) = Red, Green, Blue. |
|
|
|
|
|
# Každá hodnota je od 0 (nic) do 255 (maximum dané barvy). |
|
|
|
|
|
BILA = (255, 255, 255) |
|
|
|
|
|
SEDA = (150, 150, 150) |
|
|
|
|
|
TMAVE_MODRA = (20, 20, 80) |
|
|
|
|
|
ZELENA_TEXT = (50, 255, 50) |
|
|
|
|
|
|
|
|
|
|
|
# Budeme mít celkem 16 karet (4x4), což znamená 8 různých párů (8 unikátních barev). |
|
|
|
|
|
BARVY_PARU = [ |
|
|
|
|
|
|
|
|
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce |
|
|
|
|
|
# pygame.init() nastartuje všechny vnitřní moduly Pygame. |
|
|
|
|
|
# Je to naprosto povinný první krok před tím, než můžeme v Pygame cokoliv udělat. |
|
|
|
|
|
pygame.init() |
|
|
|
|
|
|
|
|
|
|
|
# --- Konstanty okna a rozvržení mřížky --- |
|
|
|
|
|
# Konstanty (velkými písmeny) se během hry nemění. Určují základní vlastnosti naší hry. |
|
|
|
|
|
SIRKA_OKNA = 600 |
|
|
|
|
|
VYSKA_OKNA = 600 |
|
|
|
|
|
FPS = 30 # Počet snímků za sekundu (jak rychle se hra překresluje). 30 bohatě stačí pro Pexeso. |
|
|
|
|
|
|
|
|
|
|
|
# Kolik karet chceme mít na šířku a na výšku? |
|
|
|
|
|
RADKY = 4 |
|
|
|
|
|
SLOUPCE = 4 |
|
|
|
|
|
# Velikost jedné karty v pixelech (obrazových bodech) |
|
|
|
|
|
KARTICKA_VELIKOST = 100 |
|
|
|
|
|
# Mezera mezi kartičkami |
|
|
|
|
|
MEZERA = 20 |
|
|
|
|
|
|
|
|
|
|
|
# Výpočet celkové šířky a výšky celé mřížky karet, abychom ji pak mohli na obrazovce vycentrovat |
|
|
|
|
|
Mrizka_sirka = (SLOUPCE * KARTICKA_VELIKOST) + ((SLOUPCE - 1) * MEZERA) |
|
|
|
|
|
Mrizka_vyska = (RADKY * KARTICKA_VELIKOST) + ((RADKY - 1) * MEZERA) |
|
|
|
|
|
|
|
|
|
|
|
# Vypočítáme, kde mřížka začíná na osách X (vodorovně) a Y (svisle), aby byla přesně uprostřed okna |
|
|
|
|
|
Odsazeni_x = (SIRKA_OKNA - Mrizka_sirka) // 2 |
|
|
|
|
|
Odsazeni_y = (VYSKA_OKNA - Mrizka_vyska) // 2 |
|
|
|
|
|
|
|
|
|
|
|
# Barvy v Pygame se zadávají ve formátu (R, G, B) = Red, Green, Blue. |
|
|
|
|
|
# Každá hodnota je od 0 (nic) do 255 (maximum dané barvy). |
|
|
|
|
|
BILA = (255, 255, 255) |
|
|
|
|
|
SEDA = (150, 150, 150) |
|
|
|
|
|
TMAVE_MODRA = (20, 20, 80) |
|
|
|
|
|
ZELENA_TEXT = (50, 255, 50) |
|
|
|
|
|
|
|
|
|
|
|
# Budeme mít celkem 16 karet (4x4), což znamená 8 různých párů (8 unikátních barev). |
|
|
|
|
|
BARVY_PARU = [ |
|
|
(255, 0, 0), # Červená |
|
|
(255, 0, 0), # Červená |
|
|
(0, 255, 0), # Světle Zelená |
|
|
(0, 255, 0), # Světle Zelená |
|
|
(0, 0, 255), # Modrá |
|
|
(0, 0, 255), # Modrá |
|
|
@ -45,24 +47,24 @@ BARVY_PARU = [ |
|
|
(0, 255, 255), # Azurová |
|
|
(0, 255, 255), # Azurová |
|
|
(255, 165, 0), # Oranžová |
|
|
(255, 165, 0), # Oranžová |
|
|
(139, 69, 19) # Hnědá |
|
|
(139, 69, 19) # Hnědá |
|
|
] |
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
# Vytvoříme samotné okno (obrazovku), kam se bude vše vykreslovat |
|
|
|
|
|
okno = pygame.display.set_mode((SIRKA_OKNA, VYSKA_OKNA)) |
|
|
|
|
|
# Nastavíme text, který uvidíme nahoře v liště okna |
|
|
|
|
|
pygame.display.set_caption("Pexeso (Hledání barevných párů)") |
|
|
|
|
|
|
|
|
# Vytvoříme samotné okno (obrazovku), kam se bude vše vykreslovat |
|
|
|
|
|
okno = pygame.display.set_mode((SIRKA_OKNA, VYSKA_OKNA)) |
|
|
|
|
|
# Nastavíme text, který uvidíme nahoře v liště okna |
|
|
|
|
|
pygame.display.set_caption("Pexeso (Hledání barevných párů)") |
|
|
|
|
|
|
|
|
# Založíme si herní "hodiny" - pomohou nám udržovat hru v rychlosti stanovené přes FPS |
|
|
|
|
|
hodiny = pygame.time.Clock() |
|
|
|
|
|
|
|
|
# Založíme si herní "hodiny" - pomohou nám udržovat hru v rychlosti stanovené přes FPS |
|
|
|
|
|
hodiny = pygame.time.Clock() |
|
|
|
|
|
|
|
|
# Fonty slouží pro vykreslování textu. Načteme si dva různé. |
|
|
|
|
|
font = pygame.font.SysFont("arial", 40, bold=True) |
|
|
|
|
|
font_maly = pygame.font.SysFont("arial", 20) |
|
|
|
|
|
|
|
|
# Fonty slouží pro vykreslování textu. Načteme si dva různé. |
|
|
|
|
|
font = pygame.font.SysFont("arial", 40, bold=True) |
|
|
|
|
|
font_maly = pygame.font.SysFont("arial", 20) |
|
|
|
|
|
|
|
|
# --- Třída objektu - objektově orientované programování (OOP) --- |
|
|
|
|
|
# Třída je jako "plánek" na vytvoření konkrétních věcí. Zde je to plánek na vytvoření "Kartičky". |
|
|
|
|
|
# Každá kartička si bude sama pamatovat, jakou má barvu a jestli je už otočená. |
|
|
|
|
|
class Karticka: |
|
|
|
|
|
|
|
|
# --- Třída objektu - objektově orientované programování (OOP) --- |
|
|
|
|
|
# Třída je jako "plánek" na vytvoření konkrétních věcí. Zde je to plánek na vytvoření "Kartičky". |
|
|
|
|
|
# Každá kartička si bude sama pamatovat, jakou má barvu a jestli je už otočená. |
|
|
|
|
|
class Karticka: |
|
|
def __init__(self, radek, sloupec, barva_vnitrku): |
|
|
def __init__(self, radek, sloupec, barva_vnitrku): |
|
|
self.barva = barva_vnitrku # Tato barva bude vidět, když se karta otočí |
|
|
self.barva = barva_vnitrku # Tato barva bude vidět, když se karta otočí |
|
|
|
|
|
|
|
|
@ -91,7 +93,7 @@ class Karticka: |
|
|
# Kromě výplně nakreslíme ještě bílý obrys (rámeček) o tloušťce 3 pixely, ať to lépe vypadá |
|
|
# Kromě výplně nakreslíme ještě bílý obrys (rámeček) o tloušťce 3 pixely, ať to lépe vypadá |
|
|
pygame.draw.rect(okno, BILA, self.rect, 3) |
|
|
pygame.draw.rect(okno, BILA, self.rect, 3) |
|
|
|
|
|
|
|
|
def hlavni_smycka(): |
|
|
|
|
|
|
|
|
def hlavni_smycka(): |
|
|
# --- PŘÍPRAVA HRY --- |
|
|
# --- PŘÍPRAVA HRY --- |
|
|
# 1. Připravíme si seznam barev. Chceme 8 párů, takže každou barvu z BARVY_PARU potřebujeme dvakrát. |
|
|
# 1. Připravíme si seznam barev. Chceme 8 párů, takže každou barvu z BARVY_PARU potřebujeme dvakrát. |
|
|
barvy_do_hry = BARVY_PARU * 2 |
|
|
barvy_do_hry = BARVY_PARU * 2 |
|
|
@ -209,8 +211,14 @@ def hlavni_smycka(): |
|
|
|
|
|
|
|
|
# Rychlost smyčky: Řekneme hodinám, že chceme, aby smyčka běžela maximálně tolikrát za vteřinu, jak určuje FPS |
|
|
# Rychlost smyčky: Řekneme hodinám, že chceme, aby smyčka běžela maximálně tolikrát za vteřinu, jak určuje FPS |
|
|
hodiny.tick(FPS) |
|
|
hodiny.tick(FPS) |
|
|
|
|
|
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku |
|
|
|
|
|
await asyncio.sleep(0) |
|
|
|
|
|
|
|
|
# Tohle říká Pythonu: Pokud tento soubor spouštíš jako hlavní program (ne jen importuješ), |
|
|
|
|
|
# tak teprve tehdy spusť hlani_smycka() |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
|
|
|
# Tohle říká Pythonu: Pokud tento soubor spouštíš jako hlavní program (ne jen importuješ), |
|
|
|
|
|
# tak teprve tehdy spusť hlani_smycka() |
|
|
|
|
|
if __name__ == "__main__": |
|
|
hlavni_smycka() |
|
|
hlavni_smycka() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry |
|
|
|
|
|
asyncio.run(main()) |