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.
203 lines
9.1 KiB
203 lines
9.1 KiB
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)
|