Update test.py

main
ILYAV 2024-03-01 12:29:13 +00:00
parent 891072c433
commit e37ca885a4
1 changed files with 80 additions and 37 deletions

117
test.py
View File

@ -5,13 +5,16 @@ import math
# Определение констант # Определение констант
SCREEN_WIDTH = 1920 SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080 SCREEN_HEIGHT = 1080
PLAYER_SIZE = 150 PLAYER_WIDTH = 100
PLAYER_HEIGHT = 150
LOH_WIDTH = 300
LOH_HEIGHT = 250
BULLET_SIZE = 20 BULLET_SIZE = 20
FPS = 60 FPS = 60
BULLET_SPEED = 6 BULLET_SPEED = 6
TANK_SPEED = 2 TANK_SPEED = 2
BOT_SPEED = 2 BOT_SPEED = 2
FIRE_DELAY = 500 # Задержка между выстрелами в миллисекундах FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255) WHITE = (255, 255, 255)
BLACK = (0, 0, 0) BLACK = (0, 0, 0)
@ -26,8 +29,10 @@ pygame.display.set_caption("Танчики")
background_image = pygame.transform.scale(pygame.image.load("travka_pol.jpeg"), (960, 540)) 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)) stena = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (100, 100))
stenki = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (200, 200)) 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)) tank_image = pygame.transform.scale(pygame.image.load("ntank-removebg-preview.png"), (PLAYER_WIDTH, PLAYER_HEIGHT))
loh_image = pygame.transform.scale(pygame.image.load("loh.png"), (LOH_WIDTH, LOH_HEIGHT))
bullet_image = pygame.transform.scale(pygame.image.load("bullet.png"), (BULLET_SIZE, BULLET_SIZE)) bullet_image = pygame.transform.scale(pygame.image.load("bullet.png"), (BULLET_SIZE, BULLET_SIZE))
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT)) menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
@ -39,7 +44,10 @@ class Tank(pygame.sprite.Sprite):
self.image = self.original_image self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y)) self.rect = self.image.get_rect(center=(x, y))
self.angle = -90 # Поворот на 90 градусов против часовой стрелки self.angle = -90 # Поворот на 90 градусов против часовой стрелки
self.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
def update(self): def update(self):
keys = pygame.key.get_pressed() keys = pygame.key.get_pressed()
@ -50,10 +58,19 @@ class Tank(pygame.sprite.Sprite):
self.image = pygame.transform.rotate(self.original_image, -self.angle) self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center) self.rect = self.image.get_rect(center=self.rect.center)
if keys[pygame.K_x]:
if not self.boosted:
self.TANK_SPEED *= self.boost_multiplier
self.boosted = True
else:
if self.boosted:
self.TANK_SPEED /= self.boost_multiplier
self.boosted = False
def move_forward(self): def move_forward(self):
angle_rad = math.radians(self.angle + 270) angle_rad = math.radians(self.angle + 270)
self.rect.x += TANK_SPEED * math.cos(angle_rad) self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += TANK_SPEED * math.sin(angle_rad) self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def shoot(self): def shoot(self):
current_time = pygame.time.get_ticks() current_time = pygame.time.get_ticks()
@ -85,8 +102,10 @@ class PlayerBullet(pygame.sprite.Sprite):
self.rect.y += BULLET_SPEED * math.sin(math.radians(self.angle)) self.rect.y += BULLET_SPEED * math.sin(math.radians(self.angle))
if not screen.get_rect().colliderect(self.rect): if not screen.get_rect().colliderect(self.rect):
self.kill() self.kill()
if pygame.sprite.spritecollideany(self, walls): bot_hit = pygame.sprite.spritecollideany(self, tanks)
self.kill() # Удаляем снаряд, если он столкнулся со стеной if bot_hit and isinstance(bot_hit, Bot): # Проверяем столкновение только с ботами
bot_hit.kill() # Удаляем бота
self.kill() # Удаляем пулю
# Определение класса снаряда бота # Определение класса снаряда бота
class BotBullet(pygame.sprite.Sprite): class BotBullet(pygame.sprite.Sprite):
@ -109,7 +128,7 @@ class BotBullet(pygame.sprite.Sprite):
class Bot(pygame.sprite.Sprite): class Bot(pygame.sprite.Sprite):
def __init__(self, x, y): def __init__(self, x, y):
super().__init__() super().__init__()
self.original_image = tank_image self.original_image = loh_image
self.image = self.original_image self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y)) self.rect = self.image.get_rect(center=(x, y))
self.angle = random.randint(0, 360) # Случайный начальный угол поворота self.angle = random.randint(0, 360) # Случайный начальный угол поворота
@ -118,24 +137,34 @@ class Bot(pygame.sprite.Sprite):
self.rotate_timer = 0 self.rotate_timer = 0
def update(self): def update(self):
self.move_random() self.move_towards_player()
self.rotate_random() self.avoid_bullets()
self.check_bounds() self.check_bounds()
#self.shoot_random() self.shoot_random()
def move_towards_player(self):
player_x, player_y = player.rect.center
bot_x, bot_y = self.rect.center
angle_to_player = math.atan2(player_y - bot_y, player_x - bot_x)
self.rect.x += BOT_SPEED * math.cos(angle_to_player)
self.rect.y += BOT_SPEED * math.sin(angle_to_player)
def avoid_bullets(self):
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
if self.rect.colliderect(bullet.rect):
self.rect.x += BOT_SPEED * math.cos(math.radians(self.angle + 180))
self.rect.y += BOT_SPEED * math.sin(math.radians(self.angle + 180))
def shoot_random(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > random.randint(1000, 5000):
bullet = BotBullet(self.rect.centerx, self.rect.centery, self.angle + 90)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time
def move_random(self):
# Движение вперёд в направлении текущего угла поворота
angle_rad = math.radians(self.angle + 270)
self.rect.x += BOT_SPEED * math.cos(angle_rad)
self.rect.y += BOT_SPEED * math.sin(angle_rad)
def rotate_random(self):
# Случайный поворот бота
self.rotate_timer += 1
if self.rotate_timer >= self.rotate_delay:
self.angle += random.randint(-10, 10) # Случайный поворот
self.rotate_delay = random.randint(100, 500) # Новая случайная задержка перед поворотом
self.rotate_timer = 0
def check_bounds(self): def check_bounds(self):
# Проверка выхода за границы экрана # Проверка выхода за границы экрана
@ -148,14 +177,7 @@ class Bot(pygame.sprite.Sprite):
elif self.rect.bottom > SCREEN_HEIGHT: elif self.rect.bottom > SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT self.rect.bottom = SCREEN_HEIGHT
#def shoot_random(self):
# Выстрел в направлении дула
#current_time = pygame.time.get_ticks()
#if current_time - self.last_fire_time > random.randint(1000, 5000):
#bullet = BotBullet(self.rect.centerx, self.rect.centery, self.angle + 90) # Стрельба в направлении дула
#all_sprites.add(bullet)
#bullets.add(bullet)
#self.last_fire_time = current_time
@ -172,10 +194,6 @@ tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group() bullets = pygame.sprite.Group()
walls = pygame.sprite.Group() # Группа для всех стен walls = pygame.sprite.Group() # Группа для всех стен
# Создание игрока
player = Tank(SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(player)
tanks.add(player)
# Создание стен # Создание стен
wall_positions = [ wall_positions = [
@ -220,15 +238,23 @@ tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group() bullets = pygame.sprite.Group()
# Создание игрока # Создание игрока
player = Tank(SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player) all_sprites.add(player)
tanks.add(player) tanks.add(player)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot) all_sprites.add(bot)
tanks.add(bot) tanks.add(bot)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu(): def draw_menu():
screen.blit(menu_background, (0, 0)) screen.blit(menu_background, (0, 0))
@ -248,6 +274,13 @@ def draw_menu():
return quit_rect # Возвращаем прямоугольник для кнопки "Выйти" return quit_rect # Возвращаем прямоугольник для кнопки "Выйти"
def respawn_bot():
# Создание нового экземпляра бота
new_bot = Bot(random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT))
all_sprites.add(new_bot)
tanks.add(new_bot)
# Главный цикл программы # Главный цикл программы
menu_active = True menu_active = True
while menu_active: while menu_active:
@ -267,17 +300,22 @@ while menu_active:
clock = pygame.time.Clock() clock = pygame.time.Clock()
running = True running = True
player_kills = 0
while running: while running:
player_bullets = [] player_bullets = []
bot_bullets = [] bot_bullets = []
player_pos = (player.rect.centerx, player.rect.centery)
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
running = False running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши
player.shoot() player.shoot()
player_kills += 1
if player_kills % 5 == 0: # Каждые 5 убийств игрока
player.shoot() # Дополнительный выстрел
# Обновление всех спрайтов # Обновление всех спрайтов
all_sprites.update() all_sprites.update()
@ -293,6 +331,11 @@ while running:
if tank_hit and isinstance(tank_hit, Tank): if tank_hit and isinstance(tank_hit, Tank):
tank_hit.kill() # Удаляем игрока, если попал бот tank_hit.kill() # Удаляем игрока, если попал бот
bullet.kill() # Удаляем пулю bullet.kill() # Удаляем пулю
if tank_hit and isinstance(tank_hit, Bot):
tank_hit.kill() # Удаляем бота, если попал игрок
bullet.kill() # Удаляем пулю
respawn_bot() # Пересоздаем бота в случайном месте карты
bullet.update() bullet.update()
# Отрисовка фона # Отрисовка фона