Defense Script | Ashed Pixel Tower
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()
if not self.wave_in_progress and self.wave_timer > 0: self.wave_timer -= 1 if self.wave_timer <= 0: self.start_wave()
def draw_grid(self): for x in range(0, SCREEN_WIDTH, TILE_SIZE): pygame.draw.line(self.screen, DARK_GRAY, (x, 0), (x, SCREEN_HEIGHT)) for y in range(0, SCREEN_HEIGHT, TILE_SIZE): pygame.draw.line(self.screen, DARK_GRAY, (0, y), (SCREEN_WIDTH, y))
# 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 Ashed Pixel Tower Defense Script
# Update enemies for enemy in self.enemies[:]: reached_end = enemy.update() if reached_end: self.enemies.remove(enemy) self.lives -= 1 if self.lives <= 0: self.game_over() elif not enemy.active: self.enemies.remove(enemy) self.gold += enemy.reward
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)
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
def draw_ui(self): gold_text = self.font.render(f"Gold: self.gold", True, WHITE) lives_text = self.font.render(f"Lives: self.lives", True, WHITE) wave_text = self.font.render(f"Wave: self.wave", True, WHITE) self.screen.blit(gold_text, (10, 10)) self.screen.blit(lives_text, (10, 50)) self.screen.blit(wave_text, (10, 90))
# Update bullets for bullet in self.bullets[:]: bullet.update() if not bullet.active: self.bullets.remove(bullet)
if not self.wave_in_progress and self.wave_timer > 0: next_text = self.font.render(f"Next wave in: self.wave_timer // 60 + 1", True, YELLOW) self.screen.blit(next_text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT - 50)) SCREEN_HEIGHT)) for y in range(0
def draw(self, screen): # Tower base pygame.draw.rect(screen, self.color, (self.x - TILE_SIZE // 2, self.y - TILE_SIZE // 2, TILE_SIZE, TILE_SIZE)) # Range indicator (semi-transparent) range_surface = pygame.Surface((self.range * 2, self.range * 2), pygame.SRCALPHA) pygame.draw.circle(range_surface, (100, 100, 150, 50), (self.range, self.range), self.range) screen.blit(range_surface, (self.x - self.range, self.y - self.range)) class Bullet: def (self, x, y, target): self.x = x self.y = y self.target = target self.speed = BULLET_SPEED self.active = True
class Tower: def (self, x, y): self.x = x self.y = y self.range = TOWER_RANGE self.cooldown = 0 self.color = BLUE
def update(self, enemies): if self.cooldown > 0: self.cooldown -= 1
def draw_path(self): for i in range(len(WAYPOINTS_PX) - 1): pygame.draw.line(self.screen, ASH, WAYPOINTS_PX[i], WAYPOINTS_PX[i + 1], 8)