-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed: Moved the correct content to main.py and updated constants.py
This commit corrects the mistake where the content of main.py was added to constants.py. The contents have been moved to their respective files properly.
- Loading branch information
1 parent
71bd8d5
commit e1cdf72
Showing
1 changed file
with
48 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,112 +1,50 @@ | ||
import pygame | ||
import sys | ||
import time | ||
import random | ||
from constants import WIDTH, HEIGHT, PANEL_WIDTH, BACKGROUND_COLOR, FPS, INITIAL_POPULATION, FOOD_APPEAR_INTERVAL, DEATH_ANIMATION_DURATION, record_highs, record_lows | ||
from terrain import draw_terrain | ||
from organism import Organism | ||
from utils import create_food | ||
from assets.font import load_font | ||
|
||
|
||
def draw_panel(screen, font, organism_count, food_count): | ||
panel_x = WIDTH | ||
pygame.draw.rect(screen, (50, 50, 50), (panel_x, 0, PANEL_WIDTH, HEIGHT)) | ||
|
||
text_lines = [ | ||
"Record Highs:", | ||
f"Speed: {record_highs['speed']:.2f}", | ||
f"Size: {record_highs['size']:.2f}", | ||
f"Energy Efficiency: {record_highs['energy_efficiency']:.2f}", | ||
f"Escape Ability: {record_highs['escape_ability']:.2f}", | ||
f"Recovery Ability: {record_highs['recovery_ability']:.2f}", | ||
f"Life Time: {record_highs['life_time']:.2f}", | ||
f"Organisms: {record_highs['max_organisms']}", | ||
f"Food: {record_highs['max_food']}", | ||
"", | ||
"Record Lows:", | ||
f"Speed: {record_lows['speed']:.2f}", | ||
f"Size: {record_lows['size']:.2f}", | ||
f"Energy Efficiency: {record_lows['energy_efficiency']:.2f}", | ||
f"Escape Ability: {record_lows['escape_ability']:.2f}", | ||
f"Recovery Ability: {record_lows['recovery_ability']:.2f}", | ||
f"Life Time: {record_lows['life_time']:.2f}", | ||
"", | ||
"Current Stats:", | ||
f"Current Organisms: {organism_count}", | ||
f"Current Food: {food_count}" | ||
] | ||
|
||
for i, line in enumerate(text_lines): | ||
text = font.render(line, True, (255, 255, 255)) | ||
screen.blit(text, (panel_x + 10, 10 + i * 20)) | ||
|
||
|
||
def main(): | ||
pygame.init() | ||
screen = pygame.display.set_mode((WIDTH + PANEL_WIDTH, HEIGHT)) | ||
clock = pygame.time.Clock() | ||
font = load_font() | ||
|
||
organisms = [Organism(random.randint(0, WIDTH), random.randint( | ||
0, HEIGHT), 2, 5, 0.5, 0.5, 0.1) for _ in range(INITIAL_POPULATION)] | ||
food_sources = [create_food() for _ in range(10)] | ||
last_food_time = pygame.time.get_ticks() | ||
|
||
while True: | ||
for event in pygame.event.get(): | ||
if event.type == pygame.QUIT: | ||
pygame.quit() | ||
sys.exit() | ||
|
||
screen.fill(BACKGROUND_COLOR) | ||
draw_terrain(screen) | ||
|
||
current_time = pygame.time.get_ticks() | ||
if current_time - last_food_time > FOOD_APPEAR_INTERVAL: | ||
food_sources.append(create_food()) | ||
last_food_time = current_time | ||
|
||
new_organisms = [] | ||
for organism in organisms: | ||
if organism.dead: | ||
if time.time() - organism.death_start_time > DEATH_ANIMATION_DURATION: | ||
continue # Skip dead organism after death animation | ||
else: | ||
organism.move(food_sources) | ||
organism.recover() | ||
if organism.energy <= 0 or organism.health <= 0: | ||
organism.die() | ||
continue | ||
for food in food_sources: | ||
if abs(organism.x - food[0]) < 5 and abs(organism.y - food[1]) < 5: | ||
organism.eat() | ||
food_sources.remove(food) | ||
break | ||
offspring = organism.reproduce() | ||
if offspring: | ||
new_organisms.append(offspring) | ||
new_organisms.append(organism) | ||
|
||
organisms = new_organisms | ||
organism_count = len(organisms) | ||
food_count = len(food_sources) | ||
|
||
record_highs['max_organisms'] = max( | ||
record_highs['max_organisms'], organism_count) | ||
record_highs['max_food'] = max(record_highs['max_food'], food_count) | ||
|
||
for organism in organisms: | ||
organism.draw(screen, font) | ||
|
||
for food in food_sources: | ||
pygame.draw.circle(screen, (255, 0, 0), food, 3) | ||
|
||
draw_panel(screen, font, organism_count, food_count) | ||
|
||
pygame.display.flip() | ||
clock.tick(FPS) | ||
|
||
|
||
if __name__ == "__main__": | ||
main() | ||
# Constants | ||
WIDTH, HEIGHT = 800, 600 | ||
BACKGROUND_COLOR = (0, 0, 0) | ||
PANEL_WIDTH = 200 | ||
FPS = 60 | ||
INITIAL_POPULATION = 20 | ||
MUTATION_RATE = 0.01 | ||
ENERGY_LOSS_RATE = 0.01 | ||
ENERGY_GAIN = 100 | ||
FOOD_APPEAR_INTERVAL = 1000 # milliseconds | ||
REPRODUCTION_RATE = 0 | ||
DETECTION_RADIUS = 100 # distance to detect food | ||
MOVEMENT_STEPS = 20 # number of steps to maintain direction | ||
EATING_ANIMATION_DURATION = 0.5 # seconds | ||
DEATH_ANIMATION_DURATION = 0.5 # seconds | ||
REPRODUCTION_ANIMATION_DURATION = 0.5 # seconds | ||
|
||
# Environmental factors | ||
TERRAIN = [[random.choice(['normal', 'difficult', 'trap']) | ||
for _ in range(WIDTH // 10)] for _ in range(HEIGHT // 10)] | ||
|
||
# Colors for terrain types in grayscale | ||
TERRAIN_COLORS = { | ||
'normal': (169, 169, 169), | ||
'difficult': (105, 105, 105), | ||
'trap': (50, 50, 50) | ||
} | ||
|
||
# Record highs and lows | ||
record_highs = { | ||
'speed': 0, | ||
'size': 0, | ||
'energy_efficiency': 0, | ||
'escape_ability': 0, | ||
'recovery_ability': 0, | ||
'life_time': 0, | ||
'max_organisms': 0, | ||
'max_food': 0 | ||
} | ||
|
||
record_lows = { | ||
'speed': float('inf'), | ||
'size': float('inf'), | ||
'energy_efficiency': float('inf'), | ||
'escape_ability': float('inf'), | ||
'recovery_ability': float('inf'), | ||
'life_time': float('inf') | ||
} |