A more complex Chain Reaction game.

import codesters import random stage = codesters.Environment() # Globals level_running = False circle_grow_multiplier = 4 small_circle_size = 20 stage.bgcolor('#999999') class LevelManager(object): def __init__(self): self.levels = [] self.current_level = -1 def add_level(self, level): self.levels.append(level) def next_level(self): self.current_level += 1 self.restart_level() def restart_level(self): if self.current_level < len(self.levels): l = self.levels[self.current_level] l.display_start_button() else: end_text = codesters.Text('Game Over', 0, 0) lm = LevelManager() class Level(object): def __init__(self, num_circles, num_goal): self.num_circles = num_circles self.num_goal = num_goal # Sprite Management self.sprites = [] self.circles = [] # Score Textbox self.score = 0 self.score_text = None self.user_has_clicked = False def display_start_button(self): start_square = codesters.Rectangle(0, -80, 100, 50, 'green') start_square.event_click(self.start_level) self.sprites.append(start_square) button_text = codesters.Text('Start', 0, -80) button_text.set_color('#ffffff') self.sprites.append(button_text) goal_text = codesters.Text('Goal: ' + str(self.num_goal) + ' points') goal_text.set_color('#ffffff') self.sprites.append(goal_text) def start_level(self): self.clean_up() global level_running level_running = True self.score = 0 self.score_text = codesters.Text('0', -230, 205) self.score_text.set_color('#ffffff') self.sprites.append(self.score_text) goal_text = codesters.Text('Goal: ' + str(self.num_goal) + ' points', -180, 230) goal_text.set_color('#ffffff') self.sprites.append(goal_text) self.make_circles() stage.event_click(self.click_circle) self.user_has_clicked = False # Game is now running, waiting for a click def circle_collision(self, sprite, hit_sprite): if hit_sprite.is_big and not sprite.is_big: sprite.set_size(circle_grow_multiplier) sprite.set_x_speed(0) sprite.set_y_speed(0) sprite.is_big = True sprite.event_collision(None) sprite.event_delay(self.remove_sprite, 2) self.score += 1 self.score_text.set_text(str(self.score)) def random_color(self): r = random.randint(128, 255) g = random.randint(128, 255) b = random.randint(128, 255) return r, g, b def click_circle(self): if level_running and not self.user_has_clicked: self.user_has_clicked = True x = stage.click_x() y = stage.click_y() circle_size = small_circle_size * circle_grow_multiplier circle = codesters.Circle(x, y, circle_size) circle.is_big = True self.sprites.append(circle) self.circles.append(circle) circle.event_delay(self.remove_sprite, 2) def remove_sprite(self, sprite): self.sprites.remove(sprite) self.circles.remove(sprite) stage.remove_sprite(sprite) big_sprite = False for s in self.circles: if s.is_big: big_sprite = True if not big_sprite: self.end_level() def next_level(self): self.clean_up() global lm lm.next_level() def restart_level(self): self.clean_up() global lm lm.restart_level() def end_level(self): self.clean_up() if self.score >= self.num_goal: end_text = codesters.Text('You Win!') self.sprites.append(end_text) next_button = codesters.Rectangle(0, -80, 100, 50, 'green') next_button.event_click(self.next_level) self.sprites.append(next_button) button_text = codesters.Text('Continue', 0, -80) button_text.set_color('#ffffff') self.sprites.append(button_text) else: end_text = codesters.Text('Close! Try again.') self.sprites.append(end_text) next_button = codesters.Rectangle(0, -80, 100, 50, 'green') next_button.event_click(self.restart_level) self.sprites.append(next_button) button_text = codesters.Text('Restart', 0, -80) button_text.set_color('#ffffff') self.sprites.append(button_text) def make_circles(self): for i in range(self.num_circles): x = random.randint(-200, 200) y = random.randint(-200, 200) circle = codesters.Circle(x, y, small_circle_size) rgb = self.random_color() circle.set_color(rgb[0], rgb[1], rgb[2]) velx = random.randint(-3, 3) velx = 1 if velx == 0 else velx vely = random.randint(-3, 3) vely = 1 if vely == 0 else vely circle.set_x_speed(velx) circle.set_y_speed(vely) circle.is_big = False circle.event_collision(self.circle_collision) self.sprites.append(circle) self.circles.append(circle) def clean_up(self): global level_running level_running = False for s in self.sprites: stage.remove_sprite(s) self.circles = [] self.sprites = [] stage.event_click(None) for i in range(10): l = Level(10 + i * 2, 3 + i * 2) lm.add_level(l) lm.next_level()
  • Run Code
  • Show Console
  • Codesters How To (opens in a new tab)