import pygame
import random
import sys
# Initialize pygame
pygame.init()
# Screen dimensions
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Temple Run 2 Clone")
# Colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BROWN = (139, 69, 19)
# Player
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((30, 50))
self.image.fill(BLUE)
self.rect = self.image.get_rect()
self.rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT - 100)
self.speed = 5
self.lane = 1 # 0: left, 1: middle, 2: right
self.jumping = False
self.jump_count = 10
self.score = 0
def update(self):
# Lane positions
lane_positions = [SCREEN_WIDTH // 4, SCREEN_WIDTH // 2, 3 * SCREEN_WIDTH // 4]
target_x = lane_positions[self.lane]
# Smooth lane transition
if self.rect.centerx < target_x:
self.rect.x += self.speed
elif self.rect.centerx > target_x:
self.rect.x -= self.speed
# Jumping mechanic
if self.jumping:
if self.jump_count >= -10:
neg = 1
if self.jump_count < 0:
neg = -1
self.rect.y -= (self.jump_count ** 2) * 0.5 * neg
self.jump_count -= 1
else:
self.jumping = False
self.jump_count = 10
self.rect.y = SCREEN_HEIGHT - 100
def jump(self):
if not self.jumping:
self.jumping = True
def move_left(self):
if self.lane > 0:
self.lane -= 1
def move_right(self):
if self.lane < 2:
self.lane += 1
# Obstacle
class Obstacle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((random.randint(30, 80), random.randint(30, 60)))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.choice([SCREEN_WIDTH // 4, SCREEN_WIDTH // 2, 3 * SCREEN_WIDTH // 4])
self.rect.y = -100
self.speed = random.randint(5, 10)
def update(self):
self.rect.y += self.speed
if self.rect.top > SCREEN_HEIGHT:
self.kill()
# Coin
class Coin(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((20, 20))
self.image.fill((255, 215, 0)) # Gold color
pygame.draw.circle(self.image, (255, 255, 0), (10, 10), 10)
self.rect = self.image.get_rect()
self.rect.x = random.choice([SCREEN_WIDTH // 4, SCREEN_WIDTH // 2, 3 * SCREEN_WIDTH // 4])
self.rect.y = -50
self.speed = random.randint(3, 7)
def update(self):
self.rect.y += self.speed
if self.rect.top > SCREEN_HEIGHT:
self.kill()
# Game setup
player = Player()
all_sprites = pygame.sprite.Group(player)
obstacles = pygame.sprite.Group()
coins = pygame.sprite.Group()
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 36)
# Game variables
obstacle_timer = 0
coin_timer = 0
game_over = False
score = 0
# Game loop
running = True
while running:
# Event handling
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.move_left()
if event.key == pygame.K_RIGHT:
player.move_right()
if event.key == pygame.K_UP or event.key == pygame.K_SPACE:
player.jump()
if game_over and event.key == pygame.K_r:
# Reset game
player = Player()
all_sprites = pygame.sprite.Group(player)
obstacles = pygame.sprite.Group()
coins = pygame.sprite.Group()
score = 0
game_over = False
if not game_over:
# Spawn obstacles
obstacle_timer += 1
if obstacle_timer > 60: # Every second
new_obstacle = Obstacle()
obstacles.add(new_obstacle)
all_sprites.add(new_obstacle)
obstacle_timer = 0
# Spawn coins
coin_timer += 1
if coin_timer > 30: # Every half second
if random.random() < 0.3: # 30% chance to spawn a coin
new_coin = Coin()
coins.add(new_coin)
all_sprites.add(new_coin)
coin_timer = 0
# Update
all_sprites.update()
# Collision detection with obstacles
if pygame.sprite.spritecollide(player, obstacles, False):
game_over = True
# Coin collection
coins_collected = pygame.sprite.spritecollide(player, coins, True)
for coin in coins_collected:
score += 10
# Drawing
screen.fill(BLACK)
# Draw path (three lanes)
pygame.draw.rect(screen, BROWN, (0, SCREEN_HEIGHT - 50, SCREEN_WIDTH, 50))
pygame.draw.line(screen, WHITE, (SCREEN_WIDTH // 3, SCREEN_HEIGHT - 50), (SCREEN_WIDTH // 3, SCREEN_HEIGHT), 2)
pygame.draw.line(screen, WHITE, (2 * SCREEN_WIDTH // 3, SCREEN_HEIGHT - 50), (2 * SCREEN_WIDTH // 3, SCREEN_HEIGHT), 2)
all_sprites.draw(screen)
# Display score
score_text = font.render(f"Score: {score}", True, WHITE)
screen.blit(score_text, (10, 10))
if game_over:
game_over_text = font.render("GAME OVER! Press R to restart", True, RED)
screen.blit(game_over_text, (SCREEN_WIDTH // 2 - 180, SCREEN_HEIGHT // 2))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()