dx = self.target.x - self.x dy = self.target.y - self.y dist = math.hypot(dx, dy) if dist < self.speed: self.target.health -= 20 self.active = False else: self.x += (dx / dist) * self.speed self.y += (dy / dist) * self.speed
def draw(self): self.screen.fill(BLACK) self.draw_grid() self.draw_path() for tower in self.towers: tower.draw(self.screen) for enemy in self.enemies: enemy.draw(self.screen) for bullet in self.bullets: bullet.draw(self.screen) self.draw_ui() pygame.display.flip()
self.towers = [] self.enemies = [] self.bullets = [] self.gold = 250 self.lives = 10 self.wave = 0 self.wave_in_progress = False self.wave_timer = 0 self.enemies_to_spawn = 0 self.spawn_delay = 30 self.spawn_counter = 0 Ashed Pixel Tower Defense Script
def draw(self, screen): pygame.draw.circle(screen, YELLOW, (int(self.x), int(self.y)), 4) class Enemy: def (self, waypoints, wave): self.waypoints = waypoints[:] self.pos = list(waypoints[0]) self.current_target = 1 self.speed = ENEMY_SPEED self.health = ENEMY_BASE_HEALTH + wave * 5 self.max_health = self.health self.active = True self.reward = ENEMY_BASE_REWARD + wave * 10 self.color = RED
# Find closest enemy in range closest = None min_dist = self.range for enemy in enemies: dist = math.hypot(self.x - enemy.x, self.y - enemy.y) if dist < min_dist: min_dist = dist closest = enemy dx = self
def draw(self, screen): # Draw enemy pygame.draw.circle(screen, self.color, (int(self.pos[0]), int(self.pos[1])), TILE_SIZE // 3) # Health bar bar_width = TILE_SIZE bar_height = 5 health_percent = self.health / self.max_health pygame.draw.rect(screen, RED, (self.pos[0] - bar_width // 2, self.pos[1] - TILE_SIZE // 2, bar_width, bar_height)) pygame.draw.rect(screen, GREEN, (self.pos[0] - bar_width // 2, self.pos[1] - TILE_SIZE // 2, bar_width * health_percent, bar_height)) class Game: def (self): self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("Ashed Pixel Tower Defense") self.clock = pygame.time.Clock() self.font = pygame.font.Font(None, 36)
# Grid for tower placement self.grid = [[False for _ in range(GRID_HEIGHT)] for _ in range(GRID_WIDTH)] # Mark path as non-buildable for (wx, wy) in WAYPOINTS: self.grid[wx][wy] = True dy) if dist <
# Check wave completion if self.wave_in_progress and self.enemies_to_spawn == 0 and len(self.enemies) == 0: self.wave_in_progress = False self.wave_timer = 120 # delay before next wave
def update(self): # Spawn enemies if self.wave_in_progress and self.enemies_to_spawn > 0: self.spawn_counter += 1 if self.spawn_counter >= self.spawn_delay: self.spawn_counter = 0 self.enemies_to_spawn -= 1 self.enemies.append(Enemy(WAYPOINTS_PX, self.wave))
if closest and self.cooldown == 0: self.cooldown = TOWER_COOLDOWN return Bullet(self.x, self.y, closest) return None
if not self.wave_in_progress and self.wave_timer > 0: self.wave_timer -= 1 if self.wave_timer <= 0: self.start_wave()