Pygame_Project/main.py

166 lines
6.2 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
import random
import math
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_SIZE = 150
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
DEFAULT_TANK_SPEED = 2
FIRE_DELAY = 500 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# Инициализация Pygame
pygame.init()
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
# Загрузка изображений
background_image = pygame.transform.scale(pygame.image.load("travka_pol.jpeg"), (960, 540))
stena = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (100, 100))
stenki = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (200, 200))
tank_image = pygame.transform.scale(pygame.image.load("ntank-removebg-preview.png"), (PLAYER_SIZE, PLAYER_SIZE))
bullet_image = pygame.transform.scale(pygame.image.load("bullet.png"), (BULLET_SIZE, BULLET_SIZE))
# Определение класса танка
class Tank(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = tank_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = -90 # Поворот на 90 градусов против часовой стрелки
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.speed = DEFAULT_TANK_SPEED
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
self.move_forward()
mouse_pos = pygame.mouse.get_pos()
self.angle = math.degrees(math.atan2(mouse_pos[1] - self.rect.centery, mouse_pos[0] - self.rect.centerx)) + 90
self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
def move_forward(self):
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.speed * math.cos(angle_rad)
self.rect.y += self.speed * math.sin(angle_rad)
def shoot(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами
bullet = Bullet(self.rect.centerx, self.rect.centery, self.angle + 270) # Изменено на 90 градусов влево
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Определение класса снаряда
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y, angle):
super().__init__()
self.original_image = bullet_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = angle
def update(self):
self.rect.x += BULLET_SPEED * math.cos(math.radians(self.angle))
self.rect.y += BULLET_SPEED * math.sin(math.radians(self.angle))
# Проверка столкновения снаряда со стенами
if pygame.sprite.spritecollideany(self, walls):
self.kill()
# Определение класса стены
class Wall(pygame.sprite.Sprite):
def __init__(self, x, y, image):
super().__init__()
self.image = image
self.rect = self.image.get_rect(topleft=(x, y))
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
walls = pygame.sprite.Group() # Группа для всех стен
# Создание игрока
player = Tank(SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(player)
tanks.add(player)
# Создание стен
wall_positions = [
(360, 40), (460, 730), (460, 830), (460, 930),
(960, 40), (960, 140), (960, 240),
(660, 240),
(960, 440), (960, 540), (960, 640), (960, 740),
(1260, 740), (1360, 740), (1460, 740), (1560, 740), (1660, 740),
(360, 240), (360, 340), (360, 440),
(0, 540), (60, 540), (260, 540), (360, 540), (460, 540),
(560, 540), (660, 540), (760, 540), (860, 540),
(1160, 240), (1260, 240), (1360, 240), (1460, 240), (1460, 340),
(1760, 340), (1860, 340)
]
for pos in wall_positions:
wall = Wall(*pos, stena)
all_sprites.add(wall)
walls.add(wall)
# Создание стен "stenki"
wall_stenki_positions = [
(-150, 0), (-150, 200), (-150, 400), (-150, 600), (-150, 800), (-150, 1000),
(0, -150), (200, -150), (400, -150), (600, -150), (800, -150), (1000, -150),
(1200, -150), (1400, -150), (1600, -150), (1800, -150), (1870, 0), (1870, 200),
(1870, 400), (1870, 600), (1870, 800), (1870, 1000), (0, 1030), (200, 1030),
(400, 1030), (600, 1030), (800, 1030), (1000, 1030), (1200, 1030), (1400, 1030),
(1600, 1030), (1800, 1030)
]
for pos in wall_stenki_positions:
wall_stenki = Wall(*pos, stenki)
all_sprites.add(wall_stenki)
walls.add(wall_stenki)
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши
player.shoot()
elif event.type == pygame.KEYDOWN: # Обработка нажатия клавиш
if event.key == pygame.K_F10: # Если нажата клавиша пробела
player.speed += 5 # Увеличиваем скорость танка
# Обновление всех спрайтов
all_sprites.update()
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()