Browse Source

Upload files to ''

master
Pukl 1 month ago
parent
commit
1236025b6c
  1. 203
      hra.py

203
hra.py

@ -0,0 +1,203 @@
import pygame
import random
import sys
import math
# Inicializace Pygame
pygame.init()
# Rozměry okna a mřížky
SIRKA, VYSKA = 400, 400
VELIKOST_POLICKA = 20
# Barevná paleta (RGB)
ASFALT = (35, 35, 40) # Tmavá silnice
CARA_SILNICE = (60, 60, 65) # Šedé linky mřížky
BILE_LAJNY = (180, 180, 180) # Vodorovné značení na silnici
BARVA_AUTA = (255, 40, 40) # Karoserie (červená)
KOLA_BARVA = (20, 20, 20) # Pneumatiky
SKLO_AUTA = (100, 200, 255) # Čelní sklo s odleskem
SVETLA_ZLUTA = (255, 255, 150) # Přední světlomety
STOPA_PNEU = (15, 15, 15) # Černá stopa gumy
# Barvy paliva a jejich neonové záře (Barva, BarvaZáře)
K_BENZIN = ((255, 50, 50), (100, 20, 20))
K_NAFTA = ((50, 150, 255), (20, 50, 100))
K_PLYN = ((200, 50, 255), (80, 20, 100))
K_PREMIUM = ((255, 215, 0), (100, 85, 20))
# Nastavení okna
okno = pygame.display.set_mode((SIRKA, VYSKA))
pygame.display.set_caption("Cyberpunk Racer - Fuel Hunter")
hodiny = pygame.time.Clock()
def nova_hra():
auto = [[10, 10], [9, 10], [8, 10]]
smer = [1, 0]
skore = 0
kanystr = vygeneruj_kanystr(auto)
return auto, smer, kanystr, skore
def vygeneruj_kanystr(auto):
while True:
pozice = [random.randint(0, (SIRKA // VELIKOST_POLICKA) - 1),
random.randint(0, (VYSKA // VELIKOST_POLICKA) - 1)]
if pozice not in auto:
typ = random.choices(
["benzin", "nafta", "plyn", "premium"],
weights=[40, 30, 20, 10],
k=1
)[0]
return [pozice, typ]
auto, smer, kanystr, skore = nova_hra()
font = pygame.font.SysFont("Lucida Console", 14, bold=True)
pulsace = 0 # Proměnná pro animaci záře paliva
# Hlavní herní smyčka
while True:
pulsace += 0.2 # Stará se o plynulé blikání/pulzování záře
# 1. Ovládání WASD / Šipky
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if (event.key == pygame.K_d or event.key == pygame.K_RIGHT) and smer != [-1, 0]:
smer = [1, 0]
elif (event.key == pygame.K_a or event.key == pygame.K_LEFT) and smer != [1, 0]:
smer = [-1, 0]
elif (event.key == pygame.K_w or event.key == pygame.K_UP) and smer != [0, 1]:
smer = [0, -1]
elif (event.key == pygame.K_s or event.key == pygame.K_DOWN) and smer != [0, -1]:
smer = [0, 1]
# 2. Logika pohybu
nova_pozice = [auto[0][0] + smer[0], auto[0][1] + smer[1]]
auto.insert(0, nova_pozice)
# Kolize se zdí
if (auto[0][0] < 0 or auto[0][0] >= SIRKA // VELIKOST_POLICKA or
auto[0][1] < 0 or auto[0][1] >= VYSKA // VELIKOST_POLICKA):
auto, smer, kanystr, skore = nova_hra()
continue
# Kolize se stopami
if auto[0] in auto[1:]:
auto, smer, kanystr, skore = nova_hra()
continue
# Snězení paliva
pozice_kanystru, typ_paliva = kanystr[0], kanystr[1]
if auto[0] == pozice_kanystru:
if typ_paliva == "benzin": skore += 1
elif typ_paliva == "nafta": skore += 2
elif typ_paliva == "plyn": skore += 3
elif typ_paliva == "premium": skore += 5
kanystr = vygeneruj_kanystr(auto)
else:
auto.pop()
# 3. VYKRESLOVÁNÍ
okno.fill(ASFALT)
# --- GRAFIKA SILNICE (Mřížka a dělicí čáry) ---
for x in range(0, SIRKA, VELIKOST_POLICKA):
pygame.draw.line(okno, CARA_SILNICE, (x, 0), (x, VYSKA), 1)
for y in range(0, VYSKA, VELIKOST_POLICKA):
pygame.draw.line(okno, CARA_SILNICE, (0, y), (SIRKA, y), 1)
# Přerušovaná bílá čára uprostřed silnic
for x in range(10, SIRKA, 40):
pygame.draw.line(okno, (50, 50, 55), (x, y), (x+15, y), 2)
# --- VYKRESLENÍ KANYSTRU SE ZÁŘÍ ---
kx, ky = pozice_kanystru[0] * VELIKOST_POLICKA, pozice_kanystru[1] * VELIKOST_POLICKA
data_paliva = K_BENZIN
if typ_paliva == "nafta": data_paliva = K_NAFTA
elif typ_paliva == "plyn": data_paliva = K_PLYN
elif typ_paliva == "premium": data_paliva = K_PREMIUM
barva_k, barva_zare = data_paliva[0], data_paliva[1]
# Pulzující neonový efekt na pozadí kanystru
velikost_zare = int(12 + math.sin(pulsace) * 4)
pygame.draw.circle(okno, barva_zare, (kx + 10, ky + 10), velikost_zare)
# Model kanystru
pygame.draw.rect(okno, barva_k, (kx + 5, ky + 5, 10, 13), border_radius=2) # Tělo
pygame.draw.rect(okno, (30, 30, 30), (kx + 7, ky + 8, 6, 7)) # Prolis/stínování uprostřed
pygame.draw.rect(okno, (220, 220, 220), (kx + 9, ky + 2, 3, 3)) # Kovové víčko
# --- KRESLENÍ AUTA A BRZDNÝCH STOP ---
for index, clanek in enumerate(auto):
x, y = clanek[0] * VELIKOST_POLICKA, clanek[1] * VELIKOST_POLICKA
if index == 0:
# --- MODEL ZÁVODNÍHO AUTA ---
# Základní stín pod autem
pygame.draw.rect(okno, (15, 15, 18), (x + 1, y + 1, 18, 18), border_radius=4)
# Hlavní karoserie
pygame.draw.rect(okno, BARVA_AUTA, (x + 3, y + 3, 14, 14), border_radius=3)
# Detaily specifické pro směr (Kola, Světla, Skla)
if smer == [1, 0]: # DOPRAVA
pygame.draw.rect(okno, KOLA_BARVA, (x+4, y+1, 3, 2)) # Levý přední
pygame.draw.rect(okno, KOLA_BARVA, (x+4, y+17, 3, 2)) # Levý zadní
pygame.draw.rect(okno, KOLA_BARVA, (x+13, y+1, 3, 2)) # Pravý přední
pygame.draw.rect(okno, KOLA_BARVA, (x+13, y+17, 3, 2))# Pravý zadní
pygame.draw.rect(okno, SKLO_AUTA, (x + 11, y + 5, 3, 10), border_radius=1) # Čelní sklo
pygame.draw.circle(okno, SVETLA_ZLUTA, (x + 17, y + 5), 2) # Světlomet 1
pygame.draw.circle(okno, SVETLA_ZLUTA, (x + 17, y + 15), 2) # Světlomet 2
pygame.draw.line(okno, (150, 0, 0), (x + 2, y + 4), (x + 2, y + 16), 2) # Zadní křídlo
elif smer == [-1, 0]: # DOLEVA
pygame.draw.rect(okno, KOLA_BARVA, (x+4, y+1, 3, 2))
pygame.draw.rect(okno, KOLA_BARVA, (x+4, y+17, 3, 2))
pygame.draw.rect(okno, KOLA_BARVA, (x+13, y+1, 3, 2))
pygame.draw.rect(okno, KOLA_BARVA, (x+13, y+17, 3, 2))
pygame.draw.rect(okno, SKLO_AUTA, (x + 6, y + 5, 3, 10), border_radius=1)
pygame.draw.circle(okno, SVETLA_ZLUTA, (x, y + 5), 2)
pygame.draw.circle(okno, SVETLA_ZLUTA, (x, y + 15), 2)
pygame.draw.line(okno, (150, 0, 0), (x + 17, y + 4), (x + 17, y + 16), 2)
elif smer == [0, -1]: # NAHORU
pygame.draw.rect(okno, KOLA_BARVA, (x+1, y+4, 2, 3))
pygame.draw.rect(okno, KOLA_BARVA, (x+17, y+4, 2, 3))
pygame.draw.rect(okno, KOLA_BARVA, (x+1, y+13, 2, 3))
pygame.draw.rect(okno, KOLA_BARVA, (x+17, y+13, 2, 3))
pygame.draw.rect(okno, SKLO_AUTA, (x + 5, y + 6, 10, 3), border_radius=1)
pygame.draw.circle(okno, SVETLA_ZLUTA, (x + 5, y), 2)
pygame.draw.circle(okno, SVETLA_ZLUTA, (x + 15, y), 2)
pygame.draw.line(okno, (150, 0, 0), (x + 4, y + 17), (x + 16, y + 17), 2)
elif smer == [0, 1]: # DOLŮ
pygame.draw.rect(okno, KOLA_BARVA, (x+1, y+4, 2, 3))
pygame.draw.rect(okno, KOLA_BARVA, (x+17, y+4, 2, 3))
pygame.draw.rect(okno, KOLA_BARVA, (x+1, y+13, 2, 3))
pygame.draw.rect(okno, KOLA_BARVA, (x+17, y+13, 2, 3))
pygame.draw.rect(okno, SKLO_AUTA, (x + 5, y + 11, 10, 3), border_radius=1)
pygame.draw.circle(okno, SVETLA_ZLUTA, (x + 5, y + 17), 2)
pygame.draw.circle(okno, SVETLA_ZLUTA, (x + 15, y + 17), 2)
pygame.draw.line(okno, (150, 0, 0), (x + 4, y + 2), (x + 16, y + 2), 2)
else:
# --- REALISTICKÁ BRZDNÁ DRÁHA ---
# Vykreslíme dvě souběžné čáry místo jedné tlusté kostky
if smer[0] != 0: # Jede vodorovně -> čáry nad sebou
pygame.draw.line(okno, STOPA_PNEU, (x, y + 4), (x + VELIKOST_POLICKA, y + 4), 2)
pygame.draw.line(okno, STOPA_PNEU, (x, y + 15), (x + VELIKOST_POLICKA, y + 15), 2)
else: # Jede svisle -> čáry vedle sebe
pygame.draw.line(okno, STOPA_PNEU, (x + 4, y), (x + 4, y + VELIKOST_POLICKA), 2)
pygame.draw.line(okno, STOPA_PNEU, (x + 15, y), (x + 15, y + VELIKOST_POLICKA), 2)
# --- RETRO FUTURISTICKÝ PANEL (HUD) ---
# Tmavá lišta pro text
pygame.draw.rect(okno, (20, 20, 25), (0, 0, SIRKA, 30))
pygame.draw.line(okno, (0, 210, 130), (0, 30), (SIRKA, 30), 2) # Svítící zelený předěl
text_skore = font.render(f"RPM: MAX | FUEL SCORE: {skore:03d}", True, (0, 255, 150))
okno.blit(text_skore, (15, 8))
pygame.display.flip()
hodiny.tick(10)
Loading…
Cancel
Save