EcoWarrior & ShutUp
ΠΡΠΈΠ²Π΅Ρ, ΡΡ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΡΡ ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π±Ρ ΡΡΠΈΠ» ΠΈΠ³ΡΠΎΠΊΠΎΠ² ΠΎ Π²ΡΠ±ΡΠΎΡΠ°Ρ
ΡΠ³Π»Π΅ΡΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌΠΎΠΉ ΡΠ½Π΅ΡΠ³ΠΈΠΈ? ΠΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π±Ρ ΠΊΡΡΡΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π³Π΅ΠΉΠΌΠΈΠ½Π³ ΠΈ Π·Π°Π±ΠΎΡΡ ΠΎΠ± ΡΠΊΠΎΠ»ΠΎΠ³ΠΈΠΈ.
ΠΠΎΡ
ΠΎΠΆΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡΡΡ ΠΌΠ°Π»ΡΠΌ. ΠΠΎ Ρ Π±Ρ Π²Π·ΡΠ»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ, Π° ΠΊΠΎΠ΄ β ΡΠΈΡΡΡΠΌ. ΠΠΈΠΊΠ°ΠΊΠΈΡ
Π»ΠΈΡΠ½ΠΈΡ
Π΄Π΅ΡΠ°Π»Π΅ΠΉ.
ΠΠ½Π΅ ΠΎΡΠ΅Π½Ρ Π½ΡΠ°Π²ΠΈΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄. ΠΠ°Π²Π°ΠΉ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄ΠΎΠ²Π΅Π΄ΡΠΌ Π΄ΠΎ ΡΠΌΠ° ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠΌ ΠΊΠΎΠ΄ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠΎΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ Π»ΡΠ΄ΡΠΌ ΡΡΠΈΡΡΡΡ. ΠΠΈΠΊΠ°ΠΊΠΈΡ
ΠΈΠ·Π»ΠΈΡΠ΅ΡΡΠ², ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄ΡΠΆΠ½ΡΠΉ, ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ Π΄ΠΎΠ»Π³ΠΎΠ²Π΅ΡΠ½ΡΠΉ ΠΎΠΏΡΡ.
Π₯ΠΎΡΠΎΡΠΎ, Π½Π°ΡΠΈΠ½Π°ΠΉ Ρ ΠΌΠΈΡΠ°, ΡΠ°Π·Π±ΠΈΡΠΎΠ³ΠΎ Π½Π° Π³Π΅ΠΊΡΡ, Π³Π΄Π΅ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ»Π΅ΡΠΊΠΈ ΡΠ²ΠΎΠΉ ΡΠ½Π΅ΡΠ³Π΅ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΡΡ
ΠΎΠ΄. ΠΠ³ΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠΎΠΈΡΡ ΡΠΎΠ»Π½Π΅ΡΠ½ΡΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ, Π²Π΅ΡΡΡΠΊΠΈ ΠΈΠ»ΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΡΡΠ°Π½ΡΠΈΡ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π΄Π°ΡΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΡ
ΠΎΠ΄. ΠΠ°Π΄Π°ΡΠ° β ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π³ΠΎΡΠΎΠ΄ ΡΠ»Π΅ΠΊΡΡΠΎΡΠ½Π΅ΡΠ³ΠΈΠ΅ΠΉ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΡΠ³Π»Π΅ΡΠΎΠ΄Π½ΡΠΉ ΡΠ»Π΅Π΄ Π½Π° ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠ΅. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ΄Π΅Π»Π°ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠΌ: Π²ΠΈΠ΄ ΡΠ²Π΅ΡΡ
Ρ, Π±ΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ°Π½Π΅Π»Ρ Ρ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ½ΠΈΡΠΎΠ². ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΊΠ» ΡΡΠ°Π½Π΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΌ, Π΄ΠΎΠ±Π°Π²Ρ ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅, ΠΎΠ±ΡΡΡΠ½ΡΡΡΠ΅Π΅ Π½Π°ΡΡΠ½ΡΡ ΠΎΡΠ½ΠΎΠ²Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ½ΠΈΡΠ°. ΠΠΈΠΊΠ°ΠΊΠΈΡ
Π»ΠΈΡΠ½ΠΈΡ
ΡΠΊΡΠ°ΡΠ°ΡΠ΅Π»ΡΡΡΠ², ΠΏΡΠΎΡΡΠΎ ΡΠΈΡΡΡΠΉ ΠΊΠΎΠ΄.
ΠΠΎΡ ΡΡΠΎ:
ΠΡΠΈΠ²Π΅Ρ, Π²ΠΎΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΠΉ Π½Π° Pygame. ΠΡΠΎ ΡΠ΅ΡΠΊΠ°, ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΠ΅ΠΉΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΡΠ½Π΅ΡΠ³ΠΈΠΈ, ΠΈ ΡΡ ΠΌΠΎΠΆΠ΅ΡΡ ΠΊΠ»ΠΈΠΊΠ½ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ»Π½Π΅ΡΠ½ΡΡ ΠΏΠ°Π½Π΅Π»Ρ (ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΡ
ΠΎΠ΄). ΠΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ°Π½Π΅Π»Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ²ΠΎΡ ΡΠ΅ΠΊΡΡΡΡ ΡΠ½Π΅ΡΠ³ΠΈΡ ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ ΡΠ³Π»Π΅ΡΠΎΠ΄Π°. ΠΠΈΠΊΠ°ΠΊΠΈΡ
ΠΈΠ·Π»ΠΈΡΠ΅ΡΡΠ² β ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΊΠ», Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΈΡΡΡΠΉ ΠΊΠΎΠ΄.
ΠΠΎΠΏΡΠΎΠ±ΡΠΉ ΠΊΠ»ΠΈΠΊΠ½ΡΡΡ Π½Π° ΡΡΠ΅ΠΉΠΊΡ ΠΈ Π½Π°ΠΆΠ°ΡΡ **S**, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ»Π½Π΅ΡΠ½ΡΡ ΠΏΠ°Π½Π΅Π»Ρ.
ΠΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π½Π° Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΠΎΠ±ΡΠΈΠΉ Π·Π°ΠΏΠ°Ρ ΡΠ½Π΅ΡΠ³ΠΈΠΈ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ³Π»Π΅ΡΠΎΠ΄Π°.
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠΏΠ»ΡΠ²Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΡΠ΅Π·Π°Π΅Ρ.
ΠΠ΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΡ ΠΌΠ΅Π½ΡΡΡ `UNIT_COST`, `UNIT_OUTPUT` ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ Π΄Π»Ρ Π²Π΅ΡΡΠ°/ΡΠ»Π΅ΠΊΡΡΠΎΡΡΠ°Π½ΡΠΈΠΈ. ΠΠΎΠ΄ ΠΎΡΡΠ°ΡΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠΌ, Π±Π΅Π· Π»ΠΈΡΠ½Π΅Π³ΠΎ, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΊΠ» ΠΈ Π±ΡΡΡΡΠ°Ρ Π½Π°ΡΡΠ½Π°Ρ ΡΠΏΡΠ°Π²ΠΊΠ°. Π£Π΄Π°ΡΠΈ Π² ΡΡΡΠΎΠΈΡΠ΅Π»ΡΡΡΠ²Π΅!
ΠΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π°Π΄ΡΠΆΠ½ΠΎ. ΠΠ΅ΡΠΆΠΈ ΡΠΈΠΊΠ» ΠΏΠ»ΠΎΡΠ½Π΅Π΅, ΠΌΠΎΠΆΠ΅Ρ, Π·Π°ΠΌΠ΅Π½ΠΈ ΡΠ»ΠΎΠ²Π°ΡΡ ΡΠ²Π΅ΡΠΎΠ² Π½Π° ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ Π±ΡΡΡΡΠ΅Π΅. Π ΠΏΡΠΎΠ²Π΅ΡΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΡΠΎ ΡΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡ `tutorial_shown` ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°, ΠΈΠ½Π°ΡΠ΅ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΡΠ΅Π·Π½Π΅Ρ. ΠΠΈΡΠ΅Π³ΠΎ Π»ΠΈΡΠ½Π΅Π³ΠΎ, ΠΏΡΠΎΡΡΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈ ΡΠΈΡΡΠΎΡΡ ΠΊΠΎΠ΄Π°.
Nice pointβletβs trim that a bit. I swapped the color dict for a list and added a reset flag so the tutorial clears after the first show.
```python
# color list indexed by unit type
COLORS = [(255,255,0), (0,150,255), (255,0,0)] # solar, wind, plant
UNIT_TYPES = ["solar","wind","plant"]
def draw_grid():
for y in range(GRID_H):
for x in range(GRID_W):
rect = pygame.Rect(x*TILE, y*TILE, TILE, TILE)
pygame.draw.rect(screen, (200,200,200), rect, 1)
unit = grid[y][x]
if unit:
idx = UNIT_TYPES.index(unit)
col = COLORS[idx]
pygame.draw.rect(screen, col, rect.inflate(-10,-10))
def draw_tutorial():
global tutorial_shown, tutorial_displayed
if not tutorial_shown:
txt = [
"Welcome to EcoGrid!",
"Your city needs 50 MW to stay powered.",
"Place units to generate energy.",
"Solar & wind give 4/6 MW, low carbon.",
"Plants give 10 MW, add carbon.",
"Try to keep the carbon bar low!"
]
for i, line in enumerate(txt):
screen.blit(FONT.render(line, True, (0,0,0)), (50, SCREEN_H/2 + i*20))
tutorial_displayed = True
elif tutorial_displayed:
# after 4s, clear overlay
if pygame.time.get_ticks() - tutorial_start > 4000:
tutorial_displayed = False
tutorial_shown = True
# main loop adjustments
tutorial_shown = False
tutorial_displayed = False
tutorial_start = 0
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT: sys.exit()
if e.type == pygame.MOUSEBUTTONDOWN:
if e.pos[0] < GRID_W*TILE:
keys = pygame.key.get_pressed()
if keys[pygame.K_s]: place_unit(e.pos, "solar")
elif keys[pygame.K_w]: place_unit(e.pos, "wind")
elif keys[pygame.K_p]: place_unit(e.pos, "plant")
if not tutorial_shown and not tutorial_displayed:
tutorial_start = pygame.time.get_ticks()
tutorial_displayed = True
screen.fill((255,255,255))
draw_grid()
draw_sidebar()
draw_tutorial()
pygame.display.flip()
clock.tick(30)
```