import pygame import random import sys pygame.init() WIDTH, HEIGHT = 600, 800 screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() font = pygame.font.SysFont(None, 40) lanes = [150, 300, 450] # Load images def load_img(name, size=None): try: img = pygame.image.load(name).convert_alpha() return pygame.transform.scale(img, size) if size else img except: print(f"Error loading image: {name}") pygame.quit() sys.exit() bg_img = load_img("background.png", (WIDTH, HEIGHT)) car_img = load_img("car.png", (60, 100)) obstacle_img = load_img("obstacle.png", (60, 100)) coin_img = load_img("coin.png", (40, 40)) shield_img = load_img("powerup_shield.png", (40, 40)) magnet_img = load_img("powerup_magnet.png", (40, 40)) double_img = load_img("powerup_double.png", (40, 40)) car_lane = 1 car_rect = car_img.get_rect(center=(lanes[car_lane], HEIGHT - 120)) speed = 6 spawn_timer = 0 bg_y = 0 obstacles = [] coins = [] powerups = [] score = 0 distance = 0 coins_collected = 0 high_score = 0 double_score = False magnet = False shield = False powerup_timer = 0 turbo = False currency = 0 shop_items = {"Turbo Boost": 10, "Shield": 15, "Double Score": 20} purchased_items = [] challenges = {"Reach 500 Distance": False, "Collect 20 Coins": False, "Avoid 10 Obstacles": False} obstacles_avoided = 0 def reset_game(): global obstacles, coins, powerups, car_lane, car_rect global score, coins_collected, distance, double_score, magnet, shield global powerup_timer, speed, bg_y, turbo, obstacles_avoided car_lane = 1 car_rect.centerx = lanes[car_lane] obstacles.clear() coins.clear() powerups.clear() score = 0 coins_collected = 0 distance = 0 double_score = False magnet = False shield = False turbo = False powerup_timer = 0 speed = 6 bg_y = 0 obstacles_avoided = 0 def draw_text(text, x, y, color=(255, 255, 255)): img = font.render(text, True, color) screen.blit(img, (x, y)) def spawn_objects(): lane = random.randint(0, 2) roll = random.random() if roll < 0.4: obstacles.append(obstacle_img.get_rect(center=(lanes[lane], -100))) elif roll < 0.7: coins.append(coin_img.get_rect(center=(lanes[lane], -100))) else: ptype = random.choice(["shield", "magnet", "double"]) img = {"shield": shield_img, "magnet": magnet_img, "double": double_img}[ptype] powerups.append((ptype, img, img.get_rect(center=(lanes[lane], -100)))) def update_objects(): global score, coins_collected, double_score, magnet, shield, powerup_timer for obs in obstacles: obs.y += speed for coin in coins: coin.y += speed for i in range(len(powerups)): powerups[i] = (powerups[i][0], powerups[i][1], powerups[i][2].move(0, speed)) obstacles[:] = [o for o in obstacles if o.top < HEIGHT] coins[:] = [c for c in coins if c.top < HEIGHT] powerups[:] = [p for p in powerups if p[2].top < HEIGHT] for coin in coins[:]: if car_rect.colliderect(coin) or (magnet and abs(coin.centerx - car_rect.centerx) < 80 and abs(coin.centery - car_rect.centery) < 100): coins.remove(coin) coins_collected += 1 score += 2 if double_score else 1 for p in powerups[:]: if car_rect.colliderect(p[2]): powerups.remove(p) if p[0] == "shield": shield = True elif p[0] == "magnet": magnet = True powerup_timer = pygame.time.get_ticks() elif p[0] == "double": double_score = True powerup_timer = pygame.time.get_ticks() def check_collision(): global shield, obstacles_avoided for obs in obstacles[:]: if car_rect.colliderect(obs): if shield: shield = False obstacles.remove(obs) else: return True elif obs.top > HEIGHT: obstacles_avoided += 1 return False def draw_background(): global bg_y screen.blit(bg_img, (0, bg_y)) screen.blit(bg_img, (0, bg_y - HEIGHT)) bg_y += speed if bg_y >= HEIGHT: bg_y = 0 def check_challenges(): if distance >= 500: challenges["Reach 500 Distance"] = True if coins_collected >= 20: challenges["Collect 20 Coins"] = True if obstacles_avoided >= 10: challenges["Avoid 10 Obstacles"] = True def draw_shop(): y = 600 draw_text("--- Shop ---", 10, y) y += 40 for item, cost in shop_items.items(): status = "(Bought)" if item in purchased_items else f"- {cost} coins" draw_text(f"{item}: {status}", 10, y) y += 40 def game_loop(): global car_lane, car_rect, spawn_timer, score, high_score global double_score, magnet, powerup_timer, turbo, distance, currency running = True game_over = False last_tick = pygame.time.get_ticks() while running: screen.fill((0, 0, 0)) draw_background() now = pygame.time.get_ticks() if now - last_tick >= 100: distance += 1 last_tick = now for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if not game_over and event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT and car_lane > 0: car_lane -= 1 if event.key == pygame.K_RIGHT and car_lane < 2: car_lane += 1 car_rect.centerx = lanes[car_lane] if event.key == pygame.K_UP: turbo = True powerup_timer = pygame.time.get_ticks() if event.key == pygame.K_1 and currency >= shop_items["Turbo Boost"] and "Turbo Boost" not in purchased_items: currency -= shop_items["Turbo Boost"] purchased_items.append("Turbo Boost") turbo = True if event.key == pygame.K_2 and currency >= shop_items["Shield"] and "Shield" not in purchased_items: currency -= shop_items["Shield"] purchased_items.append("Shield") shield = True if event.key == pygame.K_3 and currency >= shop_items["Double Score"] and "Double Score" not in purchased_items: currency -= shop_items["Double Score"] purchased_items.append("Double Score") double_score = True if game_over and event.type == pygame.KEYDOWN: reset_game() game_over = False if not game_over: spawn_timer += 1 if spawn_timer >= 30: spawn_objects() spawn_timer = 0 update_objects() if (double_score or magnet or turbo) and pygame.time.get_ticks() - powerup_timer > 5000: double_score = False magnet = False turbo = False speed = 10 if turbo else 6 if check_collision(): game_over = True score += distance // 10 high_score = max(score, high_score) currency += coins_collected check_challenges() screen.blit(car_img, car_rect) for obs in obstacles: screen.blit(obstacle_img, obs) for coin in coins: screen.blit(coin_img, coin) for p in powerups: screen.blit(p[1], p[2]) draw_text(f"Score: {score}", 10, 10) draw_text(f"High: {high_score}", 10, 50) draw_text(f"Distance: {distance}", 10, 90) draw_text(f"Coins: {coins_collected}", 10, 130) draw_text(f"Currency: {currency}", 10, 170) draw_text(f"Challenges:", 10, 210) y = 250 for ch, complete in challenges.items(): draw_text(f"{ch} - {'Done' if complete else 'Pending'}", 10, y) y += 30 #if shield: #draw_text("Shield ON", 400, 10) if magnet: draw_text("Magnet ON", 400, 50) if double_score: draw_text("Double Score ON", 400, 90) if turbo: draw_text("Turbo ON", 400, 130) draw_shop() else: draw_text("Game Over! Press any key", 100, HEIGHT // 2) pygame.display.flip() clock.tick(60) game_loop()