You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
6.3 KiB

import pygame
import sys
import random
pygame.init()
SIRKA = 800
VYSKA = 600
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Vesmírná střílečka - Plná Hra")
# --- Barvy ---
CERNA = (0, 0, 0)
ZELENA = (0, 255, 0) # Hráč (naše loď)
CERVENA = (255, 0, 0) # Nepřátelé (meteority)
ZLUCA = (255, 255, 0) # Projektily (Lasery)
BILA = (255, 255, 255) # Text
hodiny = pygame.time.Clock()
font_velky = pygame.font.SysFont("Arial", 50)
font_maly = pygame.font.SysFont("Arial", 30)
STAV_MENU = 0
STAV_HRA = 1
STAV_KONEC = 2
stav = STAV_MENU
hrac_sirka = 40
hrac_vyska = 40
rychlost_hrace = 6
rychlost_projektilu = 10 # Jak rychle letí laser nahoru
# Vytvoření vlastního časovače pro přidávání nepřátel
SPAWN_NEPRITELE = pygame.USEREVENT + 1
# Funkce pro reset a začátek zbrusu nové hry
def reset_hry():
global hrac_x, hrac_y, projektily, nepratele, skore, rychlost_nepritele, spawn_cas
hrac_x = SIRKA // 2 - hrac_sirka // 2
hrac_y = VYSKA - 60
projektily = [] # Seznam na letící kulky (lasery)
nepratele = [] # Seznam na padající obdélníky
skore = 0
rychlost_nepritele = 2.0
spawn_cas = 1000 # Čas k přidání nového nepřítele v ms (1 sekunda)
# Zapneme náš vytvořený časovač na zvolený interval
pygame.time.set_timer(SPAWN_NEPRITELE, spawn_cas)
reset_hry()
bezime = True
while bezime:
for udalost in pygame.event.get():
if udalost.type == pygame.QUIT:
bezime = False
if udalost.type == pygame.KEYDOWN:
if stav == STAV_MENU and udalost.key == pygame.K_SPACE:
stav = STAV_HRA
elif stav == STAV_KONEC and udalost.key == pygame.K_SPACE:
reset_hry()
stav = STAV_HRA
elif stav == STAV_HRA and udalost.key == pygame.K_SPACE:
# --- Výstřel ---
# Když stiskneme mezerník, spočítáme střed hráče a vystřelíme nahoru
projektil_x = hrac_x + hrac_sirka // 2 - 5
# Přidáme nový obdélník laseru do seznamu kulek
projektily.append(pygame.Rect(projektil_x, hrac_y, 10, 20))
# Když vyprší náš nastavený časovač SPAWN_NEPRITELE (tzn. uběhla sekunda)
if udalost.type == SPAWN_NEPRITELE and stav == STAV_HRA:
# Vygenerujeme nepřítele na náhodné X souřadnici, hned nad okrajem obrazovky (-40)
n_x = random.randint(0, SIRKA - 40)
nepratele.append(pygame.Rect(n_x, -40, 40, 40))
# Postupné zrychlování hry (těžší obtížnost s ubíhajícím časem)
rychlost_nepritele += 0.05
if spawn_cas > 300: # Ochrana: Nechceme aby se spawnovali nesmyslně rychle (limit)
spawn_cas -= 20 # Zkrátíme čas mezi nepřáteli
pygame.time.set_timer(SPAWN_NEPRITELE, spawn_cas)
if stav == STAV_HRA:
# --- Plynulý Pohyb Hráče ---
klavesy = pygame.key.get_pressed()
if klavesy[pygame.K_LEFT] and hrac_x > 0:
hrac_x -= rychlost_hrace
if klavesy[pygame.K_RIGHT] and hrac_x < SIRKA - hrac_sirka:
hrac_x += rychlost_hrace
# --- Pohyb všech vystřelených projektilů ---
# Používáme [:] pro KOPII seznamu, abychom z originálu mohli během cyklu mazat bez chyb
for p in projektily[:]:
p.y -= rychlost_projektilu # Kulky letí nahoru, y se zmenšuje
# Pokud kulka vyletí nahoře z obrazovky, vymažeme ji, aby nezabírala paměť RAM
if p.y < 0: projektily.remove(p)
# --- Pohyb nepřátel a kontrola kolizí ---
hrac_rect = pygame.Rect(hrac_x, hrac_y, hrac_sirka, hrac_vyska)
for n in nepratele[:]:
n.y += int(rychlost_nepritele) # Nepřátelé letí dolů, y roste
# Pokud nepřítel proletí až dolů (ZEMĚ) nebo narazí přímo do HRÁČE = GAME OVER
if n.y > VYSKA or n.colliderect(hrac_rect):
stav = STAV_KONEC
# --- Zásah nepřítele kulkou (DVOJITÝ CYKLUS - FOR VE FORU) ---
# Kontrolujeme každého nepřítele vůči VŠEM létajícím kulkám
for p in projektily[:]:
if p.colliderect(n):
# Zásah! Odstraníme kulku i nepřítele ze seznamů
# Musíme bezpečně ověřit pomocí 'in', jestli už nebyla kulka/nepřítel vymazán
if p in projektily: projektily.remove(p)
if n in nepratele: nepratele.remove(n)
skore += 10 # Přičteme body za sestřel
# Slovo 'break' okamžitě ukončí VNTŘNÍ FOR CYKLUS.
# Tento konkrétní nepřítel už byl zničen, nemá smysl zkoumat, jestli ho trefila další kulka.
break
# --- Vykreslování všeho na monitor ---
okno.fill(CERNA)
if stav == STAV_MENU:
text = font_velky.render("VESMÍRNÁ STŘÍLEČKA", True, ZLUCA)
start = font_maly.render("Stiskni MEZERNÍK. Střílíš mezerníkem, pohyb šipkami.", True, BILA)
okno.blit(text, (SIRKA//2 - text.get_width()//2, 200))
okno.blit(start, (SIRKA//2 - start.get_width()//2, 300))
elif stav == STAV_HRA:
# Postupně vykreslíme ze seznamů všechny aktuální obdélníčky pomocí pygame.draw.rect()
pygame.draw.rect(okno, ZELENA, hrac_rect) # Hráč
for p in projektily: pygame.draw.rect(okno, ZLUCA, p) # Všechny lasery (Žlutě)
for n in nepratele: pygame.draw.rect(okno, CERVENA, n) # Všichni nepřátelé (Červeně)
skore_text = font_maly.render(f"Skóre: {skore}", True, BILA)
okno.blit(skore_text, (10, 10))
elif stav == STAV_KONEC:
text = font_velky.render("ZEMŘEL JSI!", True, CERVENA)
skore_text = font_velky.render(f"Tvé skóre: {skore}", True, BILA)
restart = font_maly.render("Stiskni MEZERNÍK pro novou hru", True, ZLUCA)
okno.blit(text, (SIRKA//2 - text.get_width()//2, 150))
okno.blit(skore_text, (SIRKA//2 - skore_text.get_width()//2, 250))
okno.blit(restart, (SIRKA//2 - restart.get_width()//2, 350))
pygame.display.flip()
hodiny.tick(60)
pygame.quit()
sys.exit()