Game/main.py

216 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import pygame
from pygame.locals import K_UP, K_DOWN, QUIT, KEYDOWN, K_r, K_q
import random
pygame.init()
# Ekrāns
SCREEN_WIDTH = 1600
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Canteen Rush")
# Ielādējam bildes
background_img = pygame.image.load('background.jpg').convert()
background_img = pygame.transform.scale(background_img, (SCREEN_WIDTH, SCREEN_HEIGHT))
enemy_img = pygame.image.load('Sprite-0001.png').convert()
enemy_img = pygame.transform.scale(
enemy_img,
(int(enemy_img.get_width() * 0.3), int(enemy_img.get_height() * 0.3)))
enemy_img.set_colorkey((0, 0, 0))
player_img = pygame.image.load('player1.jpg').convert()
player_img = pygame.transform.scale(
player_img,
(int(player_img.get_width() * 0.3), int(player_img.get_height() * 0.3))
)
player_img.set_colorkey((255, 255, 255))
end_img = pygame.image.load('Sprite-0002.png').convert()
end_img = pygame.transform.scale(end_img, (200, 200))
clock = pygame.time.Clock()
count_label = pygame.font.Font(None, 40)
# Līnijas
line_thickness = 4
lane_height = player_img.get_height() + 10
total_height = 4 * line_thickness + 3 * lane_height
start_y = (SCREEN_HEIGHT - total_height) // 2
lane_centers = [start_y + line_thickness + i * (lane_height + line_thickness) + lane_height // 2 for i in range(3)]
class Player(pygame.sprite.Sprite):
def __init__(self, image, lane_centers):
super().__init__()
self.image = image
self.lane_centers = lane_centers
self.current_lane = 1
self.rect = self.image.get_rect(center=(SCREEN_WIDTH // 6, self.lane_centers[self.current_lane]))
def move_up(self):
if self.current_lane > 0:
self.current_lane -= 1
self.rect.centery = self.lane_centers[self.current_lane]
def move_down(self):
if self.current_lane < len(self.lane_centers) - 1:
self.current_lane += 1
self.rect.centery = self.lane_centers[self.current_lane]
def reset(self):
self.current_lane = 1
self.rect.centery = self.lane_centers[self.current_lane]
class Enemy(pygame.sprite.Sprite):
def __init__(self, image, lane_centers, speed, lane=None):
super().__init__()
self.image = image
self.lane_centers = lane_centers
self.current_lane = random.randint(0, 2) if lane is None else lane
self.speed = speed
self.rect = self.image.get_rect(center=(SCREEN_WIDTH + 100, self.lane_centers[self.current_lane]))
self.passed = False
def update(self):
self.rect.x -= self.speed
if self.rect.right < 0:
self.kill()
def draw_end_screen(screen, final_score, high_score):
overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA)
overlay.fill((0, 0, 0, 180))
screen.blit(overlay, (0, 0))
font_big = pygame.font.Font(None, 120)
font_med = pygame.font.Font(None, 60)
font_small = pygame.font.Font(None, 40)
title = font_big.render("GAME OVER!", True, (220, 50, 50))
screen.blit(title, title.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 160)))
screen.blit(end_img, (700, 190))
score_text = font_med.render(f"Score: {final_score}", True, (255, 255, 255))
screen.blit(score_text, score_text.get_rect(center=(1470, 30)))
hs_text = font_med.render(f"Best: {high_score}", True, (255, 215, 0))
screen.blit(hs_text, hs_text.get_rect(center=(1470, 100)))
restart_text = font_small.render("Uzspiediet R lai sāktu no jauna", True, (100, 255, 100))
quit_text = font_small.render("Uzspiediet Q lai izietu", True, (255, 100, 100))
screen.blit(restart_text, restart_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 130)))
screen.blit(quit_text, quit_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 170)))
def reset_game(player, enemies):
player.reset()
enemies.empty()
pygame.time.set_timer(SPAWN_FIRST, 1500)
return 0, 10, 5, False, False, []
# Таймеры
SPAWN_FIRST = pygame.USEREVENT + 1
SPAWN_SECOND = pygame.USEREVENT + 2
SPAWN_THIRD = pygame.USEREVENT + 3
SECOND_DELAY = 700
THIRD_DELAY = 1800
SUB_SPAWN_DELAY = 400
player = Player(player_img, lane_centers)
enemies = pygame.sprite.Group()
count = 0
enemies_speed = 10
count_fix = 5
spawn_after_20 = False
spawn_after_40 = False
game_over = False
high_score = 0
spawn_queue = []
last_sub_spawn_time = 0
pygame.time.set_timer(SPAWN_FIRST, 1500)
running = True
while running:
current_time = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == KEYDOWN:
if game_over:
if event.key == K_r:
game_over = False
count, enemies_speed, count_fix, spawn_after_20, spawn_after_40, spawn_queue = reset_game(player, enemies)
elif event.key == K_q:
running = False
else:
if event.key == K_UP: player.move_up()
elif event.key == K_DOWN: player.move_down()
elif event.type == SPAWN_FIRST and not spawn_after_20 and not spawn_after_40 and not game_over:
enemies.add(Enemy(enemy_img, lane_centers, speed=enemies_speed))
elif event.type == SPAWN_SECOND and spawn_after_20 and not spawn_after_40 and not game_over:
for l in random.sample(range(3), 2):
enemies.add(Enemy(enemy_img, lane_centers, speed=enemies_speed, lane=l))
pygame.time.set_timer(SPAWN_SECOND, SECOND_DELAY)
elif event.type == SPAWN_THIRD and spawn_after_40 and not game_over:
lanes = [0, 1, 2]
random.shuffle(lanes)
spawn_queue = lanes
current_delay = 1300 if enemies_speed >= 35 else THIRD_DELAY
pygame.time.set_timer(SPAWN_THIRD, current_delay)
# Логика очереди (после 40 очков)
if not game_over and spawn_after_40 and spawn_queue:
if current_time - last_sub_spawn_time > SUB_SPAWN_DELAY:
lane_idx = spawn_queue.pop(0)
spd = random.randint(30, 35) if enemies_speed >= 35 else enemies_speed
enemies.add(Enemy(enemy_img, lane_centers, speed=spd, lane=lane_idx))
last_sub_spawn_time = current_time
if not game_over:
enemies.update()
if pygame.sprite.spritecollideany(player, enemies):
game_over = True
high_score = max(high_score, count)
pygame.time.set_timer(SPAWN_FIRST, 0)
pygame.time.set_timer(SPAWN_SECOND, 0)
pygame.time.set_timer(SPAWN_THIRD, 0)
for enemy in enemies:
if not enemy.passed and enemy.rect.right < player.rect.left:
enemy.passed = True
count += 1
if count % 5 == 0 and enemies_speed < 35:
enemies_speed += 1
if count >= 20 and count < 40 and not spawn_after_20:
spawn_after_20 = True
pygame.time.set_timer(SPAWN_FIRST, 0)
pygame.time.set_timer(SPAWN_SECOND, SECOND_DELAY)
# ПЕРЕХОД НА 40 ОЧКОВ
if count >= 40 and not spawn_after_40:
spawn_after_40 = True
spawn_after_20 = False
pygame.time.set_timer(SPAWN_SECOND, 0)
# Ждем 2000мс (2 секунды), пока пролетят старые двойные враги
pygame.time.set_timer(SPAWN_THIRD, 2000)
# Drawing
screen.blit(background_img, (0, 0))
for i in range(4):
y = start_y + i * (lane_height + line_thickness)
pygame.draw.rect(screen, (0, 0, 0), pygame.Rect(0, y, SCREEN_WIDTH, line_thickness))
screen.blit(player.image, player.rect)
enemies.draw(screen)
screen.blit(count_label.render(f"Score: {count}", True, (0, 0, 0)), (10, 10))
spd_txt = f"{enemies_speed}" if enemies_speed < 35 else "30-35"
screen.blit(count_label.render(f"Speed: {spd_txt}", True, (0, 0, 0)), (600, 10))
if game_over: draw_end_screen(screen, count, high_score)
pygame.display.flip()
clock.tick(60)
pygame.quit()