Browse Source

Update Pygame examples with asyncio support for web compatibility

master
skrabanek 7 days ago
parent
commit
5ded326110
  1. 114
      pygame/01_pexeso.py
  2. 80
      pygame/02_flappy_bird.py
  3. 118
      pygame/03_chytani_jablek.py
  4. 100
      pygame/04_pong_dva_hraci.py
  5. 106
      pygame/05_skakacka_gravitace.py
  6. 88
      pygame/06_vesmirna_strilecka.py
  7. 70
      pygame/07_had.py

114
pygame/01_pexeso.py

@ -1,42 +1,44 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import random
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á
(0, 255, 0), # Světle Zelená
(0, 0, 255), # Modrá
@ -45,24 +47,24 @@ BARVY_PARU = [
(0, 255, 255), # Azurová
(255, 165, 0), # Oranžová
(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):
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á
pygame.draw.rect(okno, BILA, self.rect, 3)
def hlavni_smycka():
def hlavni_smycka():
# --- 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.
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
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()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())

80
pygame/02_flappy_bird.py

@ -1,38 +1,40 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import random
import sys
# pygame.init() připraví knihovnu Pygame k použití. Volat to musíme vždy jako první věc!
pygame.init()
# --- Nastavení okna a základních konstant ---
# Konstanty nepíšeme malými písmeny, ale VELKÝMI, abychom zdůraznili, že se jejich hodnota za běhu nemění.
SIRKA_OKNA = 400
VYSKA_OKNA = 600
FPS = 60 # FPS (Frames Per Second) = kolikrát se celá obrazovka překreslí za vteřinu. 60 je hezky plynulé.
# Barvy zapisujeme jako mix tří kanálů: (Červená, Zelená, Modrá) - každý má hodnotu 0 až 255.
# (0,0,0) je černá (žádná barva), (255,255,255) je bílá (plné všechny barvy).
CERNA = (0, 0, 0)
BILA = (255, 255, 255)
MODRA_OBLOHA = (135, 206, 235)
ZELENA = (34, 139, 34)
ZLUTYP_PTAK = (255, 215, 0)
CERVENA = (255, 0, 0)
# Vytvoření okna (plocha, kam se bude vše vykreslovat)
okno = pygame.display.set_mode((SIRKA_OKNA, VYSKA_OKNA))
pygame.display.set_caption("Flappy Bird") # Nápis v horní liště programu
# Herní hodiny pro řízení rychlosti smyčky
hodiny = pygame.time.Clock()
# Tvorba písem. font_velky použijeme na herní nápisy (Konec hry apod.), font_maly na menší text.
font_velky = pygame.font.SysFont("arial", 48, bold=True)
font_maly = pygame.font.SysFont("arial", 24)
# Pomocná funkce pro snazší kreslení textu. Abychom nemuseli pokaždé opakovat stejné složité příkazy.
def zobraz_text(text, font, barva, x, y, zarovnat_stred=False):
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce
# pygame.init() připraví knihovnu Pygame k použití. Volat to musíme vždy jako první věc!
pygame.init()
# --- Nastavení okna a základních konstant ---
# Konstanty nepíšeme malými písmeny, ale VELKÝMI, abychom zdůraznili, že se jejich hodnota za běhu nemění.
SIRKA_OKNA = 400
VYSKA_OKNA = 600
FPS = 60 # FPS (Frames Per Second) = kolikrát se celá obrazovka překreslí za vteřinu. 60 je hezky plynulé.
# Barvy zapisujeme jako mix tří kanálů: (Červená, Zelená, Modrá) - každý má hodnotu 0 až 255.
# (0,0,0) je černá (žádná barva), (255,255,255) je bílá (plné všechny barvy).
CERNA = (0, 0, 0)
BILA = (255, 255, 255)
MODRA_OBLOHA = (135, 206, 235)
ZELENA = (34, 139, 34)
ZLUTYP_PTAK = (255, 215, 0)
CERVENA = (255, 0, 0)
# Vytvoření okna (plocha, kam se bude vše vykreslovat)
okno = pygame.display.set_mode((SIRKA_OKNA, VYSKA_OKNA))
pygame.display.set_caption("Flappy Bird") # Nápis v horní liště programu
# Herní hodiny pro řízení rychlosti smyčky
hodiny = pygame.time.Clock()
# Tvorba písem. font_velky použijeme na herní nápisy (Konec hry apod.), font_maly na menší text.
font_velky = pygame.font.SysFont("arial", 48, bold=True)
font_maly = pygame.font.SysFont("arial", 24)
# Pomocná funkce pro snazší kreslení textu. Abychom nemuseli pokaždé opakovat stejné složité příkazy.
def zobraz_text(text, font, barva, x, y, zarovnat_stred=False):
# render() převede text ze znaků do obrázku (tzv. "Surface"), který lze následně nakreslit.
plocha = font.render(text, True, barva)
if zarovnat_stred:
@ -43,7 +45,7 @@ def zobraz_text(text, font, barva, x, y, zarovnat_stred=False):
# Jinak ho plácneme normálně za jeho levý horní roh
okno.blit(plocha, (x, y))
def hlavni_smycka():
def hlavni_smycka():
# --- PROMĚNNÉ PTÁKA ---
# Toto jsou proměnné, které se v čase mění, proto nejsou VELKÝMI PÍSMENY
ptak_x = 50 # Zleva je pták relativně blízko okraji
@ -185,10 +187,16 @@ def hlavni_smycka():
# Pojistka pro správnou rychlost. Počká se milisekundu tak, abychom dodrželi stanovené FPS.
hodiny.tick(FPS)
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku
await asyncio.sleep(0)
# Toto funguje tak, že hru spouštíme donekonečna. Když hráč zemře a dá mezerník,
# funkce 'hlavni_smycka()' skončí (return), ale díky tomuto cyklu 'while True'
# se obratem zavolá od znova z čistého stolu a se skórem nula.
if __name__ == "__main__":
# Toto funguje tak, že hru spouštíme donekonečna. Když hráč zemře a dá mezerník,
# funkce 'hlavni_smycka()' skončí (return), ale díky tomuto cyklu 'while True'
# se obratem zavolá od znova z čistého stolu a se skórem nula.
if __name__ == "__main__":
while True:
hlavni_smycka()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())

118
pygame/03_chytani_jablek.py

@ -1,60 +1,62 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import sys
import random
# Inicializace knihovny Pygame - povinný krok. Nastaví všechny podmoduly zvuků, kreslení atd.
pygame.init()
# --- Nastavení herního okna ---
SIRKA = 800
VYSKA = 600
# Vytvoření hlavního okna hry o dané velikosti v pixelech (obrazových bodech)
okno = pygame.display.set_mode((SIRKA, VYSKA))
# Přidáme název hry do horní lišty softwarového okna
pygame.display.set_caption("Chytání jablek")
# --- Paleta barev ---
# Barvy zadáváme přes číselné hodnoty Červené, Zelené a Modré - RGB (Red, Green, Blue)
CERNA = (0, 0, 0) # Černá je absence všech barev
ZELENA = (0, 255, 0) # Barva hráče (košíku)
CERVENA = (255, 0, 0) # Barva padajícího jablka
BILA = (255, 255, 255) # Použijeme pro texty
# Vytvoření objektu 'Clock', který řídí rychlost, aby hra nejela super rychle na výkonných PC
hodiny = pygame.time.Clock()
# Tvorba "fontu" neboli stylu písma pro vypisování skóre atd.
font = pygame.font.SysFont("Arial", 36)
# --- Proměnné Hráče (Zelený Košík dole) ---
hrac_sirka = 100
hrac_vyska = 20
# Kde bude stát na začátku? X=vodorovně (uprostřed mínus půlka hráče), Y=svisle (úplně dole)
hrac_x = SIRKA // 2 - hrac_sirka // 2
hrac_y = VYSKA - 40
# Rychlost hráče říká, o kolik pixelů se posune, když drží šipku
rychlost_hrace = 8
# --- Proměnné Jablka (Červený čtvereček shora) ---
jablko_velikost = 30
# Vybereme mu náhodnou souřadnici X kdekoliv od okraje do okraje
jablko_x = random.randint(0, SIRKA - jablko_velikost)
# Y mu dáme do ZÁPORNÝCH HODNOT! To znamená, že začíná nahoře schovaný mimo obrazovku!
jablko_y = -jablko_velikost
rychlost_jablka = 5 # Jak rychle jablko letí dolů?
# Herní statistiky
skore = 0
zivoty = 3
# Pravdivostní proměnná (boolean) udávající, že aplikace běží.
bezime = True
# ==========================================
# HLAVNÍ HERNÍ SMYČKA (GAME LOOP)
# Vše, co se děje ve hře se opakuje zde, zhruba 60x za vteřinu
# ==========================================
while bezime:
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce
pygame.init()
# --- Nastavení herního okna ---
SIRKA = 800
VYSKA = 600
# Vytvoření hlavního okna hry o dané velikosti v pixelech (obrazových bodech)
okno = pygame.display.set_mode((SIRKA, VYSKA))
# Přidáme název hry do horní lišty softwarového okna
pygame.display.set_caption("Chytání jablek")
# --- Paleta barev ---
# Barvy zadáváme přes číselné hodnoty Červené, Zelené a Modré - RGB (Red, Green, Blue)
CERNA = (0, 0, 0) # Černá je absence všech barev
ZELENA = (0, 255, 0) # Barva hráče (košíku)
CERVENA = (255, 0, 0) # Barva padajícího jablka
BILA = (255, 255, 255) # Použijeme pro texty
# Vytvoření objektu 'Clock', který řídí rychlost, aby hra nejela super rychle na výkonných PC
hodiny = pygame.time.Clock()
# Tvorba "fontu" neboli stylu písma pro vypisování skóre atd.
font = pygame.font.SysFont("Arial", 36)
# --- Proměnné Hráče (Zelený Košík dole) ---
hrac_sirka = 100
hrac_vyska = 20
# Kde bude stát na začátku? X=vodorovně (uprostřed mínus půlka hráče), Y=svisle (úplně dole)
hrac_x = SIRKA // 2 - hrac_sirka // 2
hrac_y = VYSKA - 40
# Rychlost hráče říká, o kolik pixelů se posune, když drží šipku
rychlost_hrace = 8
# --- Proměnné Jablka (Červený čtvereček shora) ---
jablko_velikost = 30
# Vybereme mu náhodnou souřadnici X kdekoliv od okraje do okraje
jablko_x = random.randint(0, SIRKA - jablko_velikost)
# Y mu dáme do ZÁPORNÝCH HODNOT! To znamená, že začíná nahoře schovaný mimo obrazovku!
jablko_y = -jablko_velikost
rychlost_jablka = 5 # Jak rychle jablko letí dolů?
# Herní statistiky
skore = 0
zivoty = 3
# Pravdivostní proměnná (boolean) udávající, že aplikace běží.
bezime = True
# ==========================================
# HLAVNÍ HERNÍ SMYČKA (GAME LOOP)
# Vše, co se děje ve hře se opakuje zde, zhruba 60x za vteřinu
# ==========================================
while bezime:
# 1. ČTENÍ UDÁLOSTÍ
# Kontrolujeme, co uživatel dělá - například zda nechce program zavřít
@ -134,7 +136,13 @@ while bezime:
# A tohle vynutí pauzu natolik dlouhou, abychom za vteřinu nepřekročili 60 smyček (60 FPS)
hodiny.tick(60)
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku
await asyncio.sleep(0)
# Pokud 'bezime' skočí na False a vyskočíme ze smyčky 'while', musíme bezpečně zhasnout!
pygame.quit()
sys.exit()
# Pokud 'bezime' skočí na False a vyskočíme ze smyčky 'while', musíme bezpečně zhasnout!
pygame.quit()
sys.exit()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())

100
pygame/04_pong_dva_hraci.py

@ -1,44 +1,46 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import sys
# pygame.init() spustí vnitřní motory knihovny Pygame. Bez toho nejde ani otevřít okno.
pygame.init()
# --- NASTAVENÍ OKNA ---
SIRKA = 800
VYSKA = 600
# Okno upevníme na tyto rozměry
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Pong - Plná Hra pro dva hráče")
# --- BARVY ---
BILA = (255, 255, 255)
CERNA = (0, 0, 0)
ZELENA = (0, 255, 0)
# Herní hodiny omezují, aby náš počítač nehrál 1000x za vteřinu, čímž by hra byla nehratelná.
hodiny = pygame.time.Clock()
# Tvorba písem (pro vykreslování textu potřebujeme vždy nastavit velikost a typ písma)
font_velky = pygame.font.SysFont("Arial", 50)
font_maly = pygame.font.SysFont("Arial", 30)
# --- STAVOVÝ AUTOMAT (State Machine) ---
# Trik profesionálů: Hra je vždy v nějakém "Stavu" (Menu, Hra, Konec).
# Podle tohoto čísla pak naše hlavní smyčka pozná, jaké má platit rozvržení obrazovky a pravidla.
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU # Začínáme logicky v hlavním menu
# --- PROMĚNNÉ HRÁČŮ (Pálky) A MÍČKU ---
palka_sirka = 15
palka_vyska = 100
rychlost_palky = 7
micek_velikost = 15
# Funkce, která vrátí všechny proměnné na začátek. Použije se po gólu nebo při startu nové hry.
def reset_hry():
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce
# pygame.init() spustí vnitřní motory knihovny Pygame. Bez toho nejde ani otevřít okno.
pygame.init()
# --- NASTAVENÍ OKNA ---
SIRKA = 800
VYSKA = 600
# Okno upevníme na tyto rozměry
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Pong - Plná Hra pro dva hráče")
# --- BARVY ---
BILA = (255, 255, 255)
CERNA = (0, 0, 0)
ZELENA = (0, 255, 0)
# Herní hodiny omezují, aby náš počítač nehrál 1000x za vteřinu, čímž by hra byla nehratelná.
hodiny = pygame.time.Clock()
# Tvorba písem (pro vykreslování textu potřebujeme vždy nastavit velikost a typ písma)
font_velky = pygame.font.SysFont("Arial", 50)
font_maly = pygame.font.SysFont("Arial", 30)
# --- STAVOVÝ AUTOMAT (State Machine) ---
# Trik profesionálů: Hra je vždy v nějakém "Stavu" (Menu, Hra, Konec).
# Podle tohoto čísla pak naše hlavní smyčka pozná, jaké má platit rozvržení obrazovky a pravidla.
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU # Začínáme logicky v hlavním menu
# --- PROMĚNNÉ HRÁČŮ (Pálky) A MÍČKU ---
palka_sirka = 15
palka_vyska = 100
rychlost_palky = 7
micek_velikost = 15
# Funkce, která vrátí všechny proměnné na začátek. Použije se po gólu nebo při startu nové hry.
def reset_hry():
# Klíčové slovo 'global' musíme použít vždycky, když uvnitř Funkce chceme MĚNIT proměnnou,
# která byla vytvořena venku (na nejvyšší úrovni skriptu).
global hrac1_y, hrac2_y, skore1, skore2, micek_x, micek_y, micek_rychlost_x, micek_rychlost_y
@ -57,12 +59,12 @@ def reset_hry():
micek_rychlost_x = 5
micek_rychlost_y = 5
# Okamžitě to zavoláme, abychom proměnným výše vložili výchozí čísla hned při spuštění programu
reset_hry()
# Okamžitě to zavoláme, abychom proměnným výše vložili výchozí čísla hned při spuštění programu
reset_hry()
bezime = True
# Hlavní cyklus hry, který točí snímek za snímkem donekonečna, dokud aplikaci neukončíme.
while bezime:
bezime = True
# Hlavní cyklus hry, který točí snímek za snímkem donekonečna, dokud aplikaci neukončíme.
while bezime:
# 1. ZPRACOVÁNÍ UDÁLOSTÍ
# Procházíme např. stisky tlačítek myši, křížek pro zavření okna, jedno-stisky kláves
@ -186,7 +188,13 @@ while bezime:
# Pauza na udržení stabilních 60 FPS
hodiny.tick(60)
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku
await asyncio.sleep(0)
# Konec programu
pygame.quit()
sys.exit()
# Konec programu
pygame.quit()
sys.exit()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())

106
pygame/05_skakacka_gravitace.py

@ -1,44 +1,46 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import sys
import random
pygame.init()
# --- NASTAVENÍ OKNA A PROMĚNNÝCH PROSTŘEDÍ ---
SIRKA = 800
VYSKA = 600
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Skákačka přes překážky")
# --- BARVY ---
BILA = (255, 255, 255)
CERNA = (0, 0, 0)
MODRA = (50, 150, 255) # Na modrou oblohu
ZELENA = (50, 200, 50) # Zelená pro plošinu trávy
CERVENA = (255, 0, 0) # Nebezpečné překážky v cestě
hodiny = pygame.time.Clock()
font = pygame.font.SysFont("Arial", 40)
font_maly = pygame.font.SysFont("Arial", 25)
# --- STAVOVÝ AUTOMAT HRY ---
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU
# --- FYZIKA A HERNÍ PROMĚNNÉ ---
podlaha_y = VYSKA - 50 # V jaké hloubce se nachází hrana země/podlahy? (od shora dolů)
hrac_sirka = 40
hrac_vyska = 40
# Fyzika
# Gravitace způsobuje trvalé ZRYCHLOVÁNÍ pádu. Ne rychlost, zrychlení!
gravitace = 0.6
# Skok není nic jiného, než extrémní rána do záporných hodnot na ose Y (odstřelení do stropu)
sila_skoku = -12
def reset_hry():
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce
pygame.init()
# --- NASTAVENÍ OKNA A PROMĚNNÝCH PROSTŘEDÍ ---
SIRKA = 800
VYSKA = 600
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Skákačka přes překážky")
# --- BARVY ---
BILA = (255, 255, 255)
CERNA = (0, 0, 0)
MODRA = (50, 150, 255) # Na modrou oblohu
ZELENA = (50, 200, 50) # Zelená pro plošinu trávy
CERVENA = (255, 0, 0) # Nebezpečné překážky v cestě
hodiny = pygame.time.Clock()
font = pygame.font.SysFont("Arial", 40)
font_maly = pygame.font.SysFont("Arial", 25)
# --- STAVOVÝ AUTOMAT HRY ---
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU
# --- FYZIKA A HERNÍ PROMĚNNÉ ---
podlaha_y = VYSKA - 50 # V jaké hloubce se nachází hrana země/podlahy? (od shora dolů)
hrac_sirka = 40
hrac_vyska = 40
# Fyzika
# Gravitace způsobuje trvalé ZRYCHLOVÁNÍ pádu. Ne rychlost, zrychlení!
gravitace = 0.6
# Skok není nic jiného, než extrémní rána do záporných hodnot na ose Y (odstřelení do stropu)
sila_skoku = -12
def reset_hry():
"""Funkce pro nahození proměnných do výchozího stavu pro start čisté hry"""
global hrac_x, hrac_y, rychlost_y, na_zemi, prekazky, skore, rychlost_hry
hrac_x = 100 # Hráč stojí celkem blízko levému kraji, aby měl čas reagovat
@ -53,18 +55,18 @@ def reset_hry():
skore = 0
rychlost_hry = 6 # Jak rychle ubíhá terén směrem k hráči doleva?
reset_hry()
reset_hry()
# --- VLASTNÍ ČASOVAČ (Custom Event) ---
# Trik z programování: Pygame neustále běží ve smyčce a "naslouchá" událostem (jako stisk myši).
# Zde si vyrobíme událost NAŠI VLASTNÍ. Pojmenujeme ji libovolně SPAWN_PREKAZKY.
SPAWN_PREKAZKY = pygame.USEREVENT + 1
# Nastavíme pygame časovač tak, ať tuto 'neviditelnou klávesu SPAWN_PREKAZKY' pípne
# do fronty událostí přesně každých 1500 milisekund (1.5 sekundy). Úplně automaticky!
pygame.time.set_timer(SPAWN_PREKAZKY, 1500)
# --- VLASTNÍ ČASOVAČ (Custom Event) ---
# Trik z programování: Pygame neustále běží ve smyčce a "naslouchá" událostem (jako stisk myši).
# Zde si vyrobíme událost NAŠI VLASTNÍ. Pojmenujeme ji libovolně SPAWN_PREKAZKY.
SPAWN_PREKAZKY = pygame.USEREVENT + 1
# Nastavíme pygame časovač tak, ať tuto 'neviditelnou klávesu SPAWN_PREKAZKY' pípne
# do fronty událostí přesně každých 1500 milisekund (1.5 sekundy). Úplně automaticky!
pygame.time.set_timer(SPAWN_PREKAZKY, 1500)
bezime = True
while bezime:
bezime = True
while bezime:
# 1. ZPRACOVÁNÍ UDÁLOSTÍ
for udalost in pygame.event.get():
@ -164,6 +166,12 @@ while bezime:
# .flip() překlopí to, co jsme nakreslili v paměti na obrazovku k hráči
pygame.display.flip()
hodiny.tick(60) # Cílíme na hladkých 60 FPS (Frames Per Second)
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku
await asyncio.sleep(0)
pygame.quit()
sys.exit()
pygame.quit()
sys.exit()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())

88
pygame/06_vesmirna_strilecka.py

@ -1,42 +1,44 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import sys
import random
pygame.init()
# --- NASTAVENÍ OKNA ---
SIRKA = 800
VYSKA = 600
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Vesmírná střílečka (Space Invaders)")
# --- BARVY ---
CERNA = (0, 0, 0)
ZELENA = (0, 255, 0) # Hráč (Vesmírná loď)
CERVENA = (255, 0, 0) # Nepřátelé (Mimozemšťani, Meteority)
ZLUCA = (255, 255, 0) # Projektily (Lasery)
BILA = (255, 255, 255) # Text a UI
hodiny = pygame.time.Clock()
font_velky = pygame.font.SysFont("Arial", 50)
font_maly = pygame.font.SysFont("Arial", 30)
# Herní stav 0,1,2 - stejná logika oddělení úvodního menu od zápasu
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU
# Rozměry vesmírné lodi hráče
hrac_sirka = 40
hrac_vyska = 40
rychlost_hrace = 6
rychlost_projektilu = 10 # Lasery létají celkem svižně nahoru
# Vytvoření vlastního časovače pro přidávání nepřátel, viz skákačka
SPAWN_NEPRITELE = pygame.USEREVENT + 1
def reset_hry():
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce
pygame.init()
# --- NASTAVENÍ OKNA ---
SIRKA = 800
VYSKA = 600
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Vesmírná střílečka (Space Invaders)")
# --- BARVY ---
CERNA = (0, 0, 0)
ZELENA = (0, 255, 0) # Hráč (Vesmírná loď)
CERVENA = (255, 0, 0) # Nepřátelé (Mimozemšťani, Meteority)
ZLUCA = (255, 255, 0) # Projektily (Lasery)
BILA = (255, 255, 255) # Text a UI
hodiny = pygame.time.Clock()
font_velky = pygame.font.SysFont("Arial", 50)
font_maly = pygame.font.SysFont("Arial", 30)
# Herní stav 0,1,2 - stejná logika oddělení úvodního menu od zápasu
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU
# Rozměry vesmírné lodi hráče
hrac_sirka = 40
hrac_vyska = 40
rychlost_hrace = 6
rychlost_projektilu = 10 # Lasery létají celkem svižně nahoru
# Vytvoření vlastního časovače pro přidávání nepřátel, viz skákačka
SPAWN_NEPRITELE = pygame.USEREVENT + 1
def reset_hry():
"""Tato funkce srovná hru zpátky do prvního dne, když spustíme reset"""
global hrac_x, hrac_y, projektily, nepratele, skore, rychlost_nepritele, spawn_cas
@ -56,10 +58,10 @@ def reset_hry():
# Nastartování naší události (eventu), začne tikat...
pygame.time.set_timer(SPAWN_NEPRITELE, spawn_cas)
reset_hry()
reset_hry()
bezime = True
while bezime:
bezime = True
while bezime:
# 1. ZPRACOVÁNÍ UDÁLOSTÍ
for udalost in pygame.event.get():
if udalost.type == pygame.QUIT:
@ -180,6 +182,12 @@ while bezime:
# Obraz je spočítán. Posíláme do HDMI portu na monitor! (.flip)
pygame.display.flip()
hodiny.tick(60)
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku
await asyncio.sleep(0)
pygame.quit()
sys.exit()
pygame.quit()
sys.exit()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())

70
pygame/07_had.py

@ -1,39 +1,41 @@
import pygame
import asyncio # PŘIDÁNO PRO WEB: importujeme asyncio pro neblokující smyčku
import random
import sys
# Povinná příprava knihovny Pygame
pygame.init()
# --- NASTAVENÍ OKNA A MŘÍŽKY ---
# Hra SNAKE (Had) většinou nefunguje na pixely jako ostatní hry, ale funguje na jakési neviditelné "Mřížce".
SIRKA_OKNA = 800
VYSKA_OKNA = 600
VELIKOST_DILKU = 20 # Velikost jednoho čtverečku na mřížce (dílku hada i jídla)
FPS = 15 # Rychlost hada. Zde je nižší 15, protože pohyb po skocích na mřížce nevyžaduje 60 FPS.
# Definice Palety Barev (Red, Green, Blue)
CERNA = (0, 0, 0)
BILA = (255, 255, 255)
ZELENA = (0, 255, 0)
CERVENA = (255, 0, 0)
okno = pygame.display.set_mode((SIRKA_OKNA, VYSKA_OKNA))
pygame.display.set_caption("Klasický Had (Snake)")
hodiny = pygame.time.Clock()
font = pygame.font.SysFont("arial", 36)
# Pomocná funkce pro rychlé vykreslení textu na daných x, y.
# Zkracuje to kód, abychom pořád neopakovali metody render() a blit().
def zobraz_text(text, barva, x, y):
async def main(): # PŘIDÁNO PRO WEB: Zabalíme celou hru do asynchronní funkce
pygame.init()
# --- NASTAVENÍ OKNA A MŘÍŽKY ---
# Hra SNAKE (Had) většinou nefunguje na pixely jako ostatní hry, ale funguje na jakési neviditelné "Mřížce".
SIRKA_OKNA = 800
VYSKA_OKNA = 600
VELIKOST_DILKU = 20 # Velikost jednoho čtverečku na mřížce (dílku hada i jídla)
FPS = 15 # Rychlost hada. Zde je nižší 15, protože pohyb po skocích na mřížce nevyžaduje 60 FPS.
# Definice Palety Barev (Red, Green, Blue)
CERNA = (0, 0, 0)
BILA = (255, 255, 255)
ZELENA = (0, 255, 0)
CERVENA = (255, 0, 0)
okno = pygame.display.set_mode((SIRKA_OKNA, VYSKA_OKNA))
pygame.display.set_caption("Klasický Had (Snake)")
hodiny = pygame.time.Clock()
font = pygame.font.SysFont("arial", 36)
# Pomocná funkce pro rychlé vykreslení textu na daných x, y.
# Zkracuje to kód, abychom pořád neopakovali metody render() a blit().
def zobraz_text(text, barva, x, y):
text_plocha = font.render(text, True, barva)
okno.blit(text_plocha, (x, y))
# Veškerou logiku hry teď poprvé schováme do tzv. Hlavní Funkce.
# Proč? Jakmile funkce skončí (kvůli výhře/prohře), velmi jednoduše se tímto trikem dá celá hra resetovat,
# jelikož stačí funkci zavolat odznova.
def hlavni_smycka():
# Veškerou logiku hry teď poprvé schováme do tzv. Hlavní Funkce.
# Proč? Jakmile funkce skončí (kvůli výhře/prohře), velmi jednoduše se tímto trikem dá celá hra resetovat,
# jelikož stačí funkci zavolat odznova.
def hlavni_smycka():
# --- POČÁTEČNÍ STAV HRY ---
# Nejdůležitější princip této hry! Tělo hada není jeden objekt, je to SEZNAM SOUŘADNIC (pole v poli).
@ -162,13 +164,19 @@ def hlavni_smycka():
# Omezení rychlosti
hodiny.tick(FPS)
# PŘIDÁNO PRO WEB: Dáme prohlížeči šanci překreslit obrazovku
await asyncio.sleep(0)
# Úplný spodek skriptu Pythonu
# Tento 'if' ověřuje, jestli Python zapnul tento soubor napřímo jako první.
if __name__ == "__main__":
# Úplný spodek skriptu Pythonu
# Tento 'if' ověřuje, jestli Python zapnul tento soubor napřímo jako první.
if __name__ == "__main__":
# NEKONEČNÁ SLUČKA ŽIVOTA.
# Jakmile uvnitř `hlavni_smycka` zavoláme 'return' kvůli Game Over + stisku Mezerníku,
# funkce se zničí, a tento while True ji opět vzkřísí z prachu k novému životu s čistým listem skóre.
while True:
hlavni_smycka()
# PŘIDÁNO PRO WEB: Spuštění asynchronní hry
asyncio.run(main())
Loading…
Cancel
Save