1 changed files with 203 additions and 0 deletions
@ -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…
Reference in new issue