From 8bb0e531776a2632c2276da926aa4191e83a5a8b Mon Sep 17 00:00:00 2001 From: Emil Shanaty Date: Tue, 15 Apr 2025 21:15:24 +0300 Subject: [PATCH] Add comments in the code. --- fitness_plot.png | Bin 31094 -> 34634 bytes gameobjects.py | 106 ++++++++++++++++++++++++++++++----------------- main.py | 14 ++++++- 3 files changed, 80 insertions(+), 40 deletions(-) diff --git a/fitness_plot.png b/fitness_plot.png index 1c6c9f3412b62ed7e5e3215409b23d9b7581b745..a050b16bb3264eddcee8a217b97ce2fffa4651e5 100644 GIT binary patch literal 34634 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 F{9p7F=kfpm literal 31094 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%0DLD0zZK*n@$Whi8uZAI zA%5&o@+SsjO8Ee|9uaPVjJm7|JkCs4i@rA}Ds-aczi~PA0iGAMObsQQ_Ab5zUUxgl z8A1vQCkca)jsM?|3YLnV_xH=~udA993uNyLI-Ca19l&ma0f#@V1S=AOoE4C2;6JA% z2?IG;(Qv)}kAL0q2namlrV)N=!w}+?F;WOAY%n~D1jx!l_vtMjqlEEAUOumE6!8nh zW^ZeVe^Bi@w{?>2?y~-6AD&HXR8&-4TECV(QWg<88sc`?ZEAu3hDPn$`?|FEb#DMk zMomzqLa{d#78E35p1HTzOOcV0QOrV#(x*kVZ?Gh)Bi#+LGfX5Rg6iMv6*z56U8~ER z>g(%CB+SxPm^TfLjI7;@u*slOt>AD#YsbD|bT^qy2Drio;Vs0|+qnuB$|D3a5y^bb z$O9v=Ch|D>d(M8(Cc5mfh~#K&jk zdl4_(KfF^2n?t@yYWga=yD*_oVzKN24v~%oK1CtM53wgE0%!>P0e}r#NS3t`Ld1my zV|Z8kY$fMm*`S8g(nQXjI-m>?wP%3p_m@HVOgHnYDR!;ib3f>aAqY3@0n8=lUVn}$ z6`5#gtR-N>;@ben(0gf~JOtWQo(8qypR(}*T9;wo*h zgCV^O?g7jOQ7QB!;*J4pmWe#2oFXZJr9eU7OyQ+t;VZ=u#%|CuAJ{({U-uThJNNFj zbzj(XspC2_8{S;*5TV(z?%OWIYj?g5V0|CkV^SugAlh)%gWCN@t3W zgdYOy`Ev8Dw#Mgm1Y9Q95YM-Xeg2yCqM1|vi}1#X`OM7D=Dr=raLAhIj+2v-wN`*031g#)O%OYzDu zSt5PFr*IT2GZNxf7g|dMV;(XITX_9xIc70VQSq43zykC-D{EJ(FED-w5OIbeq=)>h zK=}W?Nthq?iOq@wzKv)aUaf}b0biST3V&ZD#^ecg&ignQXq)nN=eI7(!&xu zKw_bD3NrnOkV7gMGqB=-JV3Bl5oa?8&bk$BcMvBKn@f16=vi2DUXI8;yWCYwJZ0t{ zqjJB;zVQ<9P=vi&|G6imexn;p5zX<)c?m;wuH~ojdUfMUDt<61n4wf?fIdni@BW=Is Gwf_aeowsTL diff --git a/gameobjects.py b/gameobjects.py index a7f7c34..e0aa98e 100644 --- a/gameobjects.py +++ b/gameobjects.py @@ -6,6 +6,10 @@ HUD_HEIGHT = 150 BARRIER_SEED = 20 class GameObject: + """ + Base class for all game objects. + Handles image loading, positioning, drawing, and child objects. + """ x = 0 y = 0 @@ -17,62 +21,70 @@ class GameObject: self.offset = offset def draw(self, surface): + # Draw self and all children recursively surface.blit(self.image, self.rect) - if len(self.children) == 0: + if not self.children: return for child in self.children: child.draw(surface) def set_position(self, x, y): + # Set position and update children positions with offsets self.rect.x = x self.rect.y = y self.x = x self.y = y - if len(self.children) == 0: + if not self.children: return for child in self.children: child.set_position(x + child.offset[0], y + child.offset[1]) def move(self, dx, dy): + # Move object by delta and update children accordingly self.set_position(self.rect.x + dx, self.rect.y + dy) - if len(self.children) == 0: + if not self.children: return for child in self.children: self.set_position(self.rect.x + dx, self.rect.y + dy) def set_size(self, width, height): + # Resize image and update rect self.image = pygame.transform.scale(self.image, (width, height)) self.rect = self.image.get_rect(topleft=(self.x, self.y)) def scale_by(self, scale): - self.image = pygame.transform.scale(self.image, (self.image.get_width() * scale, self.image.get_height() * scale)) + # Scale image by a factor + new_size = (self.image.get_width() * scale, self.image.get_height() * scale) + self.image = pygame.transform.scale(self.image, new_size) self.rect = self.image.get_rect(topleft=(self.x, self.y)) def get_position(self): return (self.x, self.y) def set_children(self, child): + # Add a child GameObject self.children.append(child) def recolor(self, color): + # Apply color tint to image self.image.fill(color, special_flags=pygame.BLEND_MULT) self.image.set_colorkey(None) class Horse(GameObject): + """ + Represents a horse character with vertical movement, animation, and fitness tracking. + Supports acceleration, speed, and stopping. + """ default_vacceleration = 0.2 - vspeed = 0 - vacceleration = 0 - stopped = False - color = () - ribbon_fill = None - ribbon_out = None def __init__(self, image_path, x, y): super().__init__(image_path, x, y) - self.images = [] - self.images.append(pygame.image.load("images/Horse_1.png")) - self.images.append(pygame.image.load("images/Horse_2.png")) - self.images.append(pygame.image.load("images/Horse_3.png")) + # Load animation frames + self.images = [ + pygame.image.load("images/Horse_1.png"), + pygame.image.load("images/Horse_2.png"), + pygame.image.load("images/Horse_3.png") + ] self.animation_speed = 25 self.frame_counter = 0 self.current_frame = 0 @@ -80,7 +92,8 @@ class Horse(GameObject): self.vacceleration = 0 self.stopped = False self.fitness = 0 - self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) + # Assign random color for ribbons + self.color = (random.randint(0,255), random.randint(0,255), random.randint(0,255)) self.ribbon_fill = GameObject("images/Ribbon_fill.png", self.x, self.y, (16, -1)) self.ribbon_fill.recolor(self.color) self.ribbon_out = GameObject("images/Ribbon_out.png", self.x, self.y, (14, -2)) @@ -88,10 +101,11 @@ class Horse(GameObject): self.set_children(self.ribbon_out) def apply_vspeed(self): - pos = self.get_position() - self.set_position(pos[0], pos[1] + self.vspeed) + # Move vertically by current speed + self.set_position(self.x, self.y + self.vspeed) def apply_vacceleration(self): + # Update speed by acceleration self.vspeed += self.vacceleration def set_vspeed(self, speed): @@ -104,23 +118,25 @@ class Horse(GameObject): self.vacceleration = vacceleration def up(self): + # Accelerate upward self.set_vacceleration(-self.default_vacceleration) def down(self): + # Accelerate downward self.set_vacceleration(self.default_vacceleration) def stay(self): + # No vertical acceleration self.set_vacceleration(0) def stop(self): + # Stop all movement self.stopped = True self.set_vacceleration(0) self.set_vspeed(0) - def draw(self, surface): - super().draw(surface) - def update_animation(self): + # Animate horse by cycling frames self.frame_counter += 1 if self.frame_counter >= self.animation_speed: self.frame_counter = 0 @@ -128,21 +144,31 @@ class Horse(GameObject): self.image = self.images[self.current_frame] def count_fitness(self): - if self.stopped == False: + # Increase fitness if moving; penalize if speed zero + if not self.stopped: self.fitness += 1 if self.vspeed == 0: self.fitness -= 0.9 class Background(GameObject): + """ + Background image for the game scene. + """ def __init__(self, image_path, x, y): super().__init__(image_path, x, y) class Barrier(GameObject): + """ + Obstacles that move horizontally and interact with horses. + """ def __init__(self, image_path, x, y): super().__init__(image_path, x, y) - self.scale_by(5) + self.scale_by(5) # Make barrier larger for visibility class UI: + """ + Handles HUD display and horse status markers. + """ iteration_num = 0 horses = [] horizontal_offset = 25 @@ -155,34 +181,38 @@ class UI: self.hud_rect = self.hud_image.get_rect(topleft=(x, y)) def add_horses(self, children): - new_horses = [child for child in children if child not in self.horses] - self.horses.extend(new_horses) + # Add horses to UI tracking list + self.horses.extend([child for child in children if child not in self.horses]) def draw_marks(self, screen): - active_marks = [horse for horse in self.horses if not horse.stopped] - unactive_marks = [horse for horse in self.horses if horse.stopped] - width = 10 - xa = 0 - ya = HEIGHT + HUD_HEIGHT - self.mark_size - for i, horse in enumerate(active_marks): + # Draw colored squares representing active and stopped horses + active = [h for h in self.horses if not h.stopped] + inactive = [h for h in self.horses if h.stopped] + + xa, ya = 0, HEIGHT + HUD_HEIGHT - self.mark_size + for i, horse in enumerate(active): pygame.draw.rect(screen, horse.color, (xa, ya, self.mark_size, self.mark_size)) xa += self.horizontal_offset - if (i + 1) % width == 0: + if (i+1) % 10 == 0: ya += self.vertical_offset xa = 0 - xu = WIDTH - self.mark_size - yu = HEIGHT + HUD_HEIGHT - self.mark_size - for i, horse in enumerate(unactive_marks): + + xu, yu = WIDTH - self.mark_size, HEIGHT + HUD_HEIGHT - self.mark_size + for i, horse in enumerate(inactive): pygame.draw.rect(screen, horse.color, (xu, yu, self.mark_size, self.mark_size)) xu -= self.horizontal_offset - if (i + 1) % width == 0: + if (i+1) % 10 == 0: yu += self.vertical_offset xu = WIDTH - self.mark_size def draw(self, surface): + # Draw HUD image surface.blit(self.hud_image, self.hud_rect) class Spawner: + """ + Spawns barriers at intervals to challenge horses. + """ active = True delay = 500 tick_counter = 0 @@ -192,6 +222,7 @@ class Spawner: self.delay = delay def handle(self): + # Increment tick counter and spawn barrier when delay reached if self.active: self.tick_counter += 1 if self.tick_counter >= self.delay: @@ -199,6 +230,5 @@ class Spawner: self.tick_counter = 0 def spawn(self): - random_y = random.randint(0, HEIGHT - 100) - new_barrier = Barrier(self.barrier_image_path, WIDTH, random_y) - return new_barrier + # Create a new barrier at a random vertical position on the right edge + return Barrier(self.barrier_image_path, WIDTH, random.randint(0, HEIGHT - 100)) diff --git a/main.py b/main.py index df35227..da350e7 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,7 @@ matplotlib.use('Agg') import matplotlib.pyplot as plt import random -POPULATION_SIZE = 50 # SET TO 500 IF YOU HAVE A GOOD PC +POPULATION_SIZE = 50 # Number of horses in population MUTATION_RATE = 0.5 POPULATION_NEW = 0.1 POPULATION_BEST = 0.3 @@ -42,6 +42,7 @@ last_barrier = None def init_game(): global gameobjects, horses, barriers, upper_bound_rect, lower_bound_rect, spawner, last_barrier, BARRIER_SPEED + # Initialize background and game objects for a new iteration #random.seed(BARRIER_SEED) #SET SEED grass = Background("images/Grass.jpg", 0, 0) grass.set_size(WIDTH, HEIGHT) @@ -49,6 +50,7 @@ def init_game(): gameobjects = [grass] barriers = [] + # Reset horses to starting position and state for horse in horses: horse.set_position(50, HEIGHT / 2) horse.stopped = False @@ -64,6 +66,7 @@ def init_game(): gameobjects.extend(horses) gameobjects.extend(barriers) + # Define upper and lower bounds for horse movement upper_bound_rect = pygame.Rect(0, 0, WIDTH, -10) lower_bound_rect = pygame.Rect(0, HEIGHT, WIDTH, 10) @@ -73,6 +76,7 @@ def init_game(): def get_features(horse: Horse): + # Extract normalized features for neural network input features = [last_barrier.rect.topleft[0], last_barrier.rect.topleft[1], last_barrier.rect.bottomright[0], last_barrier.rect.bottomright[1], horse.rect.topleft[0], horse.rect.topleft[1], @@ -92,6 +96,7 @@ genecticAlg = GeneticAlgorithm(POPULATION_SIZE, MUTATION_RATE, POPULATION_BEST, while True: for event in pygame.event.get(): if event.type == pygame.QUIT: + # Save fitness plot on exit plt.plot(running_fitnesses) plt.xlabel("Iteration") plt.ylabel("Current Fitness") @@ -106,6 +111,7 @@ while True: if not horse.stopped: data = get_features(horse) res = genecticAlg.predict(data, i) + # Control horse movement based on neural network output if res == 0: horse.up() elif res == 1: @@ -113,6 +119,7 @@ while True: else: horse.stay() else: + # Move stopped horses left with barriers horse.move(-BARRIER_SPEED, 0) horse.apply_vacceleration() @@ -121,6 +128,7 @@ while True: spawner.handle() if spawner.tick_counter == 0: + # Spawn new barrier periodically new_barrier = spawner.spawn() barriers.append(new_barrier) gameobjects.append(new_barrier) @@ -133,6 +141,7 @@ while True: horse.update_animation() if not horse.stopped: + # Check collisions with barriers and bounds for barrier in barriers: if horse.rect.colliderect(barrier.rect): horse.stop() @@ -146,8 +155,8 @@ while True: current_fitnesses = [horse.fitness for horse in horses] current_fitness = max(current_fitnesses) - if all(horse.stopped for horse in horses): + # All horses stopped: evolve population and start new iteration UI.iteration_num += 1 genecticAlg.learn([x.fitness for x in horses]) @@ -160,6 +169,7 @@ while True: UI.draw(screen) UI.draw_marks(screen) + # Display iteration and fitness info iteration_num_txt = font.render(f"Iteration: {current_iteration}", True, BLACK) current_fitness_txt = font.render( f"Current Fitness: {current_fitness}", True, BLACK)