Compare commits

...

108 Commits
52 ... main

Author SHA1 Message Date
Arsenijs Ļu 9a4052a821 Update updates.html 2024-04-28 19:38:07 +00:00
Arsenijs Ļu 4440adc4e0 Update support.html 2024-04-28 19:37:46 +00:00
Arsenijs Ļu 63f7267286 Update index.html 2024-04-28 19:37:26 +00:00
Arsenijs Ļu 6939b28ae5 Update game.html 2024-04-28 19:37:12 +00:00
Arsenijs Ļu c58c34c286 Update about.html 2024-04-28 19:36:15 +00:00
Artjoms Marians Ņečajevs 56da85c16b Update bootstrap.bundle.min.js 2024-04-28 19:17:59 +00:00
Artjoms Marians Ņečajevs 1bb2ea4015 Delete static 2024-04-28 19:14:45 +00:00
Artjoms Marians Ņečajevs 2182279084 Upload files to "/" 2024-04-28 19:14:30 +00:00
Artjoms Marians Ņečajevs aa44266272 Add trfh 2024-04-28 19:10:59 +00:00
Artjoms Marians Ņečajevs 4b9dbecaa2 Add static 2024-04-28 19:10:40 +00:00
Romans Kosogorovs 1205ea0ab9 Update updates.html 2024-04-28 18:35:00 +00:00
Romans Kosogorovs e09d855ad5 Update about.html 2024-04-28 17:39:21 +00:00
Romans Kosogorovs d31e194aff Update about.html 2024-04-28 17:37:37 +00:00
Romans Kosogorovs ea2dea5ea7 Update index.html 2024-04-28 17:36:05 +00:00
Romans Kosogorovs 807aaa0db4 Update updates.html 2024-04-28 17:33:59 +00:00
Romans Kosogorovs 2d132aa3aa Update game.html 2024-04-28 17:33:00 +00:00
Arsenijs Ļu d080a586d3 Update updates.html 2024-04-28 14:15:10 +00:00
Arsenijs Ļu 9a91b4a436 Update game.html 2024-04-28 14:14:22 +00:00
Arsenijs Ļu 937cfd8953 Update updates.html 2024-04-28 12:46:13 +00:00
Arsenijs Ļu 6fdf4c9628 Update support.html 2024-04-28 12:45:20 +00:00
Arsenijs Ļu 4b93f3438b Update index.html 2024-04-28 12:44:56 +00:00
Arsenijs Ļu b6a61fc85c Update about.html 2024-04-28 12:44:42 +00:00
Arsenijs Ļu e63ac8be9b Update game.html 2024-04-28 12:44:22 +00:00
Arsenijs Ļu 8696d7a57f Update app.py 2024-04-28 12:43:59 +00:00
Arsenijs Ļu d1fa60d0bc Update game.html 2024-04-28 11:53:43 +00:00
Arsenijs Ļu 82865c5b67 Update app.py 2024-04-28 11:43:35 +00:00
Arsenijs Ļu d29ca1219f Update support.html 2024-04-28 11:43:06 +00:00
Arsenijs Ļu a1364def3f Update support.html 2024-04-28 11:42:59 +00:00
Arsenijs Ļu baa99b499a Update game.html 2024-04-28 11:42:28 +00:00
Arsenijs Ļu 4debd94d34 Update index.html 2024-04-28 11:42:05 +00:00
Arsenijs Ļu 79f3216714 Update about.html 2024-04-28 11:41:41 +00:00
Artjoms Marians Ņečajevs 2cfb61501a Update about.html 2024-04-28 09:50:45 +00:00
Artjoms Marians Ņečajevs 4a25a91fa3 Update game.html 2024-04-28 09:50:15 +00:00
Artjoms Marians Ņečajevs 7c3221c804 Update link.html 2024-04-28 09:49:45 +00:00
Romans Kosogorovs 67b2e4bdb9 Update link.html 2024-04-27 22:08:19 +00:00
Arsenijs Ļu 00f776b4dc Update about.html 2024-04-27 21:56:29 +00:00
Arsenijs Ļu 1fb5d38cd0 Update index.html 2024-04-27 21:55:38 +00:00
Arsenijs Ļu 7d5741f56c Update game.html 2024-04-27 21:54:11 +00:00
Artjoms Marians Ņečajevs 68f86c6b07 Update game.html 2024-04-27 21:23:22 +00:00
Arsenijs Ļu 1847a023b6 Update about.html 2024-04-27 21:19:55 +00:00
Arsenijs Ļu 0b0408e178 Update index.html 2024-04-27 20:08:57 +00:00
Arsenijs Ļu 27fa656918 Update game.html 2024-04-27 20:08:40 +00:00
Arsenijs Ļu 49a6f66b49 Update about.html 2024-04-27 20:07:50 +00:00
Arsenijs Ļu 0f0650913b Update app.py 2024-04-27 20:06:40 +00:00
Arsenijs Ļu 585e6b27cc Update link.html 2024-04-27 20:06:08 +00:00
Artjoms Marians Ņečajevs d6ae1f0da7 Update links.html 2024-04-27 20:05:26 +00:00
Artjoms Marians Ņečajevs 22fb370390 Update game.html 2024-04-27 20:04:44 +00:00
Arsenijs Ļu 54c38decd6 Update about.html 2024-04-27 20:04:17 +00:00
Arsenijs Ļu 3ed9230e34 Update about.html 2024-04-27 19:29:59 +00:00
Artjoms Marians Ņečajevs 1bff57986b Update about.html 2024-04-27 19:29:23 +00:00
Arsenijs Ļu 397cdae129 Update app.py 2024-04-27 19:27:00 +00:00
Arsenijs Ļu f346e2fcde Update index.html 2024-04-27 19:26:41 +00:00
Artjoms Marians Ņečajevs de197dc17d Add puiopiuop.py 2024-04-27 19:23:31 +00:00
Artjoms Marians Ņečajevs f0827057e0 Add index.html 2024-04-27 19:19:58 +00:00
Artjoms Marians Ņečajevs 78b383829f Update app.py 2024-04-27 19:18:21 +00:00
Artjoms Marians Ņečajevs a1d4d01df8 Update test.py 2024-04-27 19:18:02 +00:00
Iļja Vaisfelds 5565832cd5 ну я старался в кркркр 2024-03-04 10:08:54 +02:00
Iļja Vaisfelds f34d5748e6 ну я старался в кркркр 2024-03-04 10:04:15 +02:00
Arsenijs Ļu 770715964a Update bla.py
exit from menu
2024-03-03 22:36:07 +00:00
Iļja Vaisfelds deb24245fb Add херня с почти паузой 2024-03-03 21:58:55 +00:00
Iļja Vaisfelds 72f7b9c051 Add просто херня какая то, зато с мемом 2024-03-03 21:58:26 +00:00
Arseshka Lu 012fb30005 Merge remote-tracking branch 'origin/main' 2024-03-03 22:50:20 +02:00
Arseshka Lu b9db4684b8 cursor change 2024-03-03 22:50:06 +02:00
Arsenijs Ļu f1c254f928 Update bla.py 2024-03-03 20:08:04 +00:00
Arseshka Lu 20089ccd0e Music off/on 2024-03-03 22:04:35 +02:00
Artjoms Marians Ņečajevs 4692f38118 Update bla.py 2024-03-03 20:01:36 +00:00
Iļja Vaisfelds 4c4321c88b Update Tanki imbovie 2024-03-03 18:41:33 +00:00
Artjoms Marians Ņečajevs c9dee338f0 Update Tanki s strelboj 2024-03-03 18:29:00 +00:00
Artjoms Marians Ņečajevs 231297adb1 Update bla.py 2024-03-03 18:09:49 +00:00
Arseshka Lu 37bfa8d6b9 Settings 2024-03-03 18:14:13 +02:00
Arseshka Lu bfa231b748 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	bla.py
2024-03-03 18:08:10 +02:00
Arsenijs Ļu 8c4941d7ed Update bla.py 2024-03-03 16:08:08 +00:00
Arseshka Lu 75aae605fc Merge remote-tracking branch 'origin/main'
# Conflicts:
#	bla.py
2024-03-03 18:06:02 +02:00
Arseshka Lu a1f1b2a7da Settings 2024-03-03 18:05:28 +02:00
Artjoms Marians Ņečajevs 182fd57079 Update bla.py 2024-03-03 14:57:07 +00:00
Artjoms Marians Ņečajevs 21de185b33 Update bla.py 2024-03-03 14:55:56 +00:00
Artjoms Marians Ņečajevs 62efc76c55 Delete PUPIS 2024-03-03 14:12:56 +00:00
Artjoms Marians Ņečajevs 018bc41525 Delete Gaame with menu 2024-03-03 14:12:25 +00:00
User 8b0c509e23 Merge remote-tracking branch 'origin/main' 2024-03-03 16:07:59 +02:00
User cdaaf3e989 version 2 2024-03-03 16:07:18 +02:00
User 263063c73d version 2 2024-03-03 16:04:40 +02:00
User 12ca804725 2 version 2024-03-03 16:03:40 +02:00
User 17d27b058e 2 version 2024-03-03 16:03:13 +02:00
Iļja Vaisfelds 1476163e4e Merge remote-tracking branch 'origin/main' 2024-03-03 14:24:39 +02:00
Iļja Vaisfelds be763b7244 poslednaja poka chto 2024-03-03 14:19:15 +02:00
Iļja Vaisfelds d4b99804f1 Add score 2024-03-03 09:41:14 +00:00
Iļja Vaisfelds a055f51ab2 poslednaja poka chto 2024-03-03 11:37:45 +02:00
Arseshka Lu 5f8db58d3a Merge https://gitea.rkg.lv/ivaisfelds/Pygame_Project 2024-03-02 20:04:11 +02:00
Arseshka Lu c1488d729b a 2024-03-02 19:33:38 +02:00
Arsenijs Ļu a724d6a46c Update Gaame with menu
Explosion sound and Explosion Animation with BotTank and with wall
2024-03-02 17:29:05 +00:00
Artjoms Marians Ņečajevs da2edc7634 Update Gaame with menu 2024-03-02 16:37:39 +00:00
Artjoms Marians Ņečajevs a40b5b84a6 Update Gaame with menu 2024-03-02 16:17:13 +00:00
Artjoms Marians Ņečajevs c0d65c7c1a Update Gaame with menu 2024-03-02 15:37:53 +00:00
Iļja Vaisfelds b1572cd218 Merge remote-tracking branch 'origin/main' 2024-03-01 23:30:58 +02:00
Iļja Vaisfelds 59ce1d4a7f со звуком 2024-03-01 23:29:33 +02:00
ILYAV d59c9f88a3 Update main.py 2024-03-01 20:53:33 +00:00
ILYAV ad12f18b3b Update test.py 2024-03-01 20:53:08 +00:00
ILYAV 0e2b74295c Update test.py 2024-03-01 20:45:05 +00:00
ILYAV c5e145cf46 Update main.py 2024-03-01 20:44:47 +00:00
ILYAV e37ca885a4 Update test.py 2024-03-01 12:29:13 +00:00
ILYAV 891072c433 Update main.py 2024-03-01 12:28:51 +00:00
ILYAV 2676a3b69a Add 01.03.24 - test 2024-03-01 12:28:14 +00:00
ILYAV cb282b3ded Add 01.03.24 2024-03-01 12:27:29 +00:00
Pygame_Project cebba35128 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	main.py
#	menu_background.jpg
2024-02-26 13:04:30 +02:00
Pygame_Project 246e6cdf2d hey 2024-02-26 12:50:09 +02:00
Pygame_Project 72a858a17d norm teksturi i ubit bota 2024-02-26 10:52:13 +02:00
Pygame_Project 8876121cdf norm teksturi i ubit bota 2024-02-26 10:34:21 +02:00
Pygame_Project b1541a4102 norm teksturi i ubit bota 2024-02-26 10:31:49 +02:00
88 changed files with 3365 additions and 303 deletions

3
.idea/.gitignore vendored 100644
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.11 (Pygame_Project_FINAL)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
<component name="Black">
<option name="sdkName" value="Python 3.11" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (Pygame_Project_FINAL)" project-jdk-type="Python SDK" />
</project>

View File

@ -5,13 +5,16 @@ import math
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_SIZE = 150
PLAYER_WIDTH = 100
PLAYER_HEIGHT = 150
LOH_WIDTH = 300
LOH_HEIGHT = 250
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
TANK_SPEED = 2
BOT_SPEED = 2
FIRE_DELAY = 500 # Задержка между выстрелами в миллисекундах
FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
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))
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))
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))
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.rect = self.image.get_rect(center=(x, y))
self.angle = -90 # Поворот на 90 градусов против часовой стрелки
self.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
def update(self):
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.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):
angle_rad = math.radians(self.angle + 270)
self.rect.x += TANK_SPEED * math.cos(angle_rad)
self.rect.y += TANK_SPEED * math.sin(angle_rad)
self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def shoot(self):
current_time = pygame.time.get_ticks()
@ -109,7 +126,7 @@ class BotBullet(pygame.sprite.Sprite):
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = tank_image
self.original_image = loh_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = random.randint(0, 360) # Случайный начальный угол поворота
@ -172,10 +189,6 @@ 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 = [
@ -220,15 +233,23 @@ tanks = 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)
tanks.add(player)
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)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
@ -248,6 +269,13 @@ def draw_menu():
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
while menu_active:
@ -293,6 +321,11 @@ while running:
if tank_hit and isinstance(tank_hit, Tank):
tank_hit.kill() # Удаляем игрока, если попал бот
bullet.kill() # Удаляем пулю
if tank_hit and isinstance(tank_hit, Bot):
tank_hit.kill() # Удаляем бота, если попал игрок
bullet.kill() # Удаляем пулю
respawn_bot() # Пересоздаем бота в случайном месте карты
bullet.update()
# Отрисовка фона

View File

@ -1,9 +0,0 @@
EXCEPTION NOTICE
1. As a special exception, the copyright holders of this library give permission for additional uses of the text contained in this release of the library as licenced under the wxWindows Library Licence, applying either version 3.1 of the Licence, or (at your option) any later version of the Licence as published by the copyright holders of version 3.1 of the Licence document.
2. The exception is that you may use, copy, link, modify and distribute under your own terms, binary object code versions of works based on the Library.
3. If you copy code from files distributed under the terms of the GNU General Public Licence or the GNU Library General Public Licence into a copy of this library, as this licence permits, the exception does not apply to the code that you add in this way. To avoid misleading anyone as to the status of such modified files, you must delete this exception notice from such code and/or adjust the licensing conditions notice accordingly.
4. If you write modifications of your own for this library, it is your choice whether to permit this exception to apply to your modifications. If you do not wish that, you must delete the exception notice from such code and/or adjust the licensing conditions notice accordingly.

View File

@ -1,3 +0,0 @@
# Pygame_Project
projekt igra 1, bla bla bla, tanckiki 2d

549
Tanki imbovie 100644
View File

@ -0,0 +1,549 @@
import pygame
import random
import math
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_WIDTH = 100
PLAYER_HEIGHT = 150
LOH_WIDTH = 200
LOH_HEIGHT = 150
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
TANK_SPEED = 2
BOT_SPEED = 2
FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
score = 0
# Инициализация Pygame
pygame.init()
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
# Загрузка и воспроизведение музыки
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки
shot_sound = pygame.mixer.Sound('shot.wav')
meme_sound = pygame.mixer.Sound("meme_sound.wav")
explosion_sound = pygame.mixer.Sound("explosion_sound.wav")
meme_sound = pygame.mixer.Sound("meme_sound.wav")
stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav")
# Загрузка изображений
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_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))
explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)]
stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)]
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 6:
self.kill()
else:
center = self.rect.center
self.image = explosion_images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Добавление класса для анимации удара о каменную стену
class StoneExplosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = stoneexplosion_images
self.image = self.images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
stoneexplosion_sound.play() # Воспроизведение звука удара о стену
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Определение класса танка
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.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
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)
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):
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def shoot(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами
shot_sound.play() # Воспроизведение звука выстрела
# Коррекция угла вылета пули, чтобы она вылетала из дула танка
offset_angle = -90 # Угол смещения для вылета пули из дула
corrected_angle = self.angle + offset_angle
# Вычисляем координаты дула танка
offset_x = 70 * math.cos(math.radians(corrected_angle))
offset_y = 70 * math.sin(math.radians(corrected_angle))
bullet = PlayerBullet(self.rect.centerx + offset_x, self.rect.centery + offset_y, self.angle + 270)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Проверяем столкновение пули с каменными стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной
explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену
all_sprites.add(explosion) # Добавление анимации удара о стену в группу спрайтов
bullet.kill() # Удаление пули
class PlayerBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса снаряда бота
class BotBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса для бота
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = loh_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = 0 # Угол поворота бота
self.speed = BOT_SPEED # Скорость бота
def update(self):
# Находим координаты игрока
player_x, player_y = player.rect.center
# Вычисляем угол к игроку
dx = player_x - self.rect.centerx
dy = player_y - self.rect.centery
self.angle = math.degrees(math.atan2(dy, dx)) + 90
# Поворачиваем изображение бота
self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
# Двигаем бота в направлении игрока
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)
# Проверяем, не выходит ли бот за границы экрана
self.check_bounds()
def check_bounds(self):
# Проверка выхода за границы экрана
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
if self.rect.top < 0:
self.rect.top = 0
elif self.rect.bottom > SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT
def shoot_random(self):
# Vыстрел в направлении дула
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
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() # Группа для всех стен
# Создание стен
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)
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# Создание игрока
player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player)
tanks.add(player)
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)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Старт"
start_text = font.render("Start", True, WHITE)
start_rect = start_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(start_text, start_rect)
# Рисуем кнопку "Настройки"
settings_text = font.render("Settings", True, WHITE)
settings_rect = settings_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(settings_text, settings_rect)
# Рисуем кнопку "Выйти"
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 100))
screen.blit(quit_text, quit_rect)
pygame.display.flip()
return start_rect, settings_rect, 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)
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
def draw_settings_menu():
settings_background = pygame.transform.scale(pygame.image.load("settings_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
screen.blit(settings_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Выйти" в правом верхнем углу
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(topright=(SCREEN_WIDTH - 20, 20))
screen.blit(quit_text, quit_rect)
pygame.display.flip()
return quit_rect
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
# Главный цикл программы
menu_active = True
settings_active = False # Флаг, показывающий, активно ли меню настроек
while menu_active:
if not settings_active:
start_rect, settings_rect, quit_rect = draw_menu()
else:
quit_rect = draw_settings_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
if not settings_active:
if start_rect.collidepoint(event.pos):
menu_active = False # Нажата кнопка "Старт"
elif settings_rect.collidepoint(event.pos):
settings_active = True # Нажата кнопка "Настройки"
elif quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
else:
if quit_rect.collidepoint(event.pos):
settings_active = False
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
paused = False # Track pause state
while running:
current_time = pygame.time.get_ticks()
# Handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
# Handle left mouse button click
if not paused:
player.shoot()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
if current_time - last_meme_time > meme_delay: # Проверка задержки
meme_sound.play()
last_meme_time = current_time # Обновление времени последнего воспроизведения звука
elif event.key == pygame.K_ESCAPE:
# Toggle pause state when escape key is pressed
paused = not paused
if not paused: # If not paused, update game state
# Update sprites
all_sprites.update()
# Проверка столкновений пуль с танками
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
explosion_sound.play() # Воспроизведение звука взрыва
explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва
all_sprites.add(explosion) # Добавление взрыва в группу спрайтов
bullet.kill() # Удаляем пулю
tank_hit.kill() # Удаляем бота
respawn_bot() # Создаем нового бота
score += 1
elif isinstance(bullet, BotBullet):
# Проверяем столкновение пули бота с стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука взрыва камня
explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня
all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов
bullet.kill() # Удаляем пулю бота
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
screen.blit(stena, (360, 40))
screen.blit(stena, (460, 730))
screen.blit(stena, (460, 830))
screen.blit(stena, (460, 930))
screen.blit(stena, (960, 40))
screen.blit(stena, (960, 140))
screen.blit(stena, (960, 240))
screen.blit(stena, (660, 240))
screen.blit(stena, (960, 440))
screen.blit(stena, (960, 540))
screen.blit(stena, (960, 640))
screen.blit(stena, (960, 740))
screen.blit(stena, (1260, 740))
screen.blit(stena, (1360, 740))
screen.blit(stena, (1460, 740))
screen.blit(stena, (1560, 740))
screen.blit(stena, (1660, 740))
screen.blit(stena, (360, 240))
screen.blit(stena, (360, 340))
screen.blit(stena, (360, 440))
screen.blit(stena, (0, 540))
screen.blit(stena, (60, 540))
screen.blit(stena, (260, 540))
screen.blit(stena, (360, 540))
screen.blit(stena, (460, 540))
screen.blit(stena, (560, 540))
screen.blit(stena, (660, 540))
screen.blit(stena, (760, 540))
screen.blit(stena, (860, 540))
screen.blit(stena, (1160, 240))
screen.blit(stena, (1260, 240))
screen.blit(stena, (1360, 240))
screen.blit(stena, (1460, 240))
screen.blit(stena, (1460, 340))
screen.blit(stena, (1760, 340))
screen.blit(stena, (1860, 340))
screen.blit(stenki, (-150, 0))
screen.blit(stenki, (-150, 200))
screen.blit(stenki, (-150, 400))
screen.blit(stenki, (-150, 600))
screen.blit(stenki, (-150, 800))
screen.blit(stenki, (-150, 1000))
screen.blit(stenki, (0, -150))
screen.blit(stenki, (200, -150))
screen.blit(stenki, (400, -150))
screen.blit(stenki, (600, -150))
screen.blit(stenki, (800, -150))
screen.blit(stenki, (1000, -150))
screen.blit(stenki, (1200, -150))
screen.blit(stenki, (1400, -150))
screen.blit(stenki, (1600, -150))
screen.blit(stenki, (1800, -150))
screen.blit(stenki, (1870, 0))
screen.blit(stenki, (1870, 200))
screen.blit(stenki, (1870, 400))
screen.blit(stenki, (1870, 600))
screen.blit(stenki, (1870, 800))
screen.blit(stenki, (1870, 1000))
screen.blit(stenki, (0, 1030))
screen.blit(stenki, (200, 1030))
screen.blit(stenki, (400, 1030))
screen.blit(stenki, (600, 1030))
screen.blit(stenki, (800, 1030))
screen.blit(stenki, (1000, 1030))
screen.blit(stenki, (1200, 1030))
screen.blit(stenki, (1400, 1030))
screen.blit(stenki, (1600, 1030))
screen.blit(stenki, (1800, 1030))
font = pygame.font.Font(None, 36)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
score_rect = score_text.get_rect(topleft=(10, 10))
pygame.draw.rect(screen, (0, 255, 0), (
score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score
screen.blit(score_text, score_rect.topleft)
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()

View File

@ -1,176 +0,0 @@
import pygame
import sys
import random
import math
# Инициализация Pygame
pygame.init()
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
TANK_SIZE = 30 # Увеличенный размер
ENEMY_SIZE = 20
FPS = 60
BULLET_SPEED = 10
# Определение цветов
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
color = (0, 255, 0)
screen.fill(color)
pygame.display.flip()
# Загрузка изображения танка, смотрящего вправо
tank_image = pygame.image.load("ntank-removebg-preview.png")
# Увеличение размера изображения танка
tank_image = pygame.transform.scale(tank_image, (TANK_SIZE, TANK_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()
self.rect.center = (x, y)
self.angle = 0
self.speed = 5 # Скорость движения танка
def update(self):
keys = pygame.key.get_pressed()
# Вращение танка
if keys[pygame.K_LEFT]:
self.angle += 5
if keys[pygame.K_RIGHT]:
self.angle -= 5
# Движение вперед и назад
if keys[pygame.K_UP]:
self.rect.x += self.speed * math.cos(math.radians(self.angle))
self.rect.y -= self.speed * math.sin(math.radians(self.angle))
if keys[pygame.K_DOWN]:
self.rect.x -= self.speed * math.cos(math.radians(self.angle))
self.rect.y += self.speed * math.sin(math.radians(self.angle))
# Поворот изображения танка
self.image = pygame.transform.rotate(self.original_image, self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.centery, self.angle + 90) # Изменение угла стрельбы
all_sprites.add(bullet)
bullets.add(bullet)
# Определение класса вражеского танка
class EnemyTank(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((ENEMY_SIZE, ENEMY_SIZE))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.center = (random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT))
self.angle = 0 # Установка начального угла для того, чтобы смотреть вперед
# Определение класса снаряда
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y, angle):
super().__init__()
self.image = pygame.Surface((5, 5))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.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 self.rect.bottom < 0 or self.rect.top > SCREEN_HEIGHT or self.rect.right < 0 or self.rect.left > SCREEN_WIDTH:
self.kill()
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# Создание игрока
player = Tank(SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(player)
tanks.add(player)
# Создание вражеских танков
for _ in range(5):
enemy = EnemyTank()
all_sprites.add(enemy)
enemies.add(enemy)
# Основной игровой цикл
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.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
# Обновление всех спрайтов
all_sprites.update()
# Обработка столкновений
hits = pygame.sprite.groupcollide(bullets, enemies, True, True)
for hit in hits:
enemy = EnemyTank()
all_sprites.add(enemy)
enemies.add(enemy)
hits = pygame.sprite.spritecollide(player, enemies, False)
if hits:
running = False
# Отрисовка и обновление экрана
screen.fill(BLACK)
# Отрисовка игрового поля
normal_image = pygame.transform.scale(pygame.image.load("travka_pol.jpeg").convert(), (960, 540))
screen.blit(normal_image, (0, 0))
screen.blit(normal_image, (960, 0))
screen.blit(normal_image, (0, 540))
screen.blit(normal_image, (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))
screen.blit(stena, (360, 40))
screen.blit(stena, (460, 730))
# Добавьте остальные препятствия, если необходимо
# Отрисовка игроков
screen.blit(player.image, player.rect)
# Отрисовка врагов
for enemy in enemies:
screen.blit(enemy.image, enemy.rect)
# Отрисовка снарядов
for bullet in bullets:
screen.blit(bullet.image, bullet.rect)
pygame.display.flip()
# Ограничение кадров в секунду
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()
sys.exit()

182
about.html 100644
View File

@ -0,0 +1,182 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About Tanki 2D</title>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet">
<link rel="icon" href="https://cdn.discordapp.com/attachments/856238529502511144/1234217742689767424/free-icon-tank-942355.png?ex=662fee58&is=662e9cd8&hm=82b93f0803c76e54589ff9766815979b37ed52b2ac7ac88a05cd081040a33492&">
<style>
body {
font-family: 'Montserrat', sans-serif;
margin: 0;
padding: 0;
background-color: #000; /* Черный цвет фона */
color: #fff; /* Белый цвет текста */
}
.wrapper {
margin-top: 80px; /* Отступ для контента под фиксированной шапкой */
overflow-y: auto; /* Включаем вертикальную прокрутку */
}
nav {
position: fixed; /* Фиксированная позиция */
top: 0; /* Расположение шапки вверху */
left: 0; /* Расположение шапки слева */
width: 100%; /* Занимает всю ширину экрана */
background-color: #333;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 999; /* Чтобы шапка была выше других элементов */
}
.logo img {
width: 100px; /* Устанавливаем ширину логотипа */
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
}
nav ul li a {
color: #fff;
text-decoration: none;
padding: 10px 20px;
transition: background-color 0.3s;
}
nav ul li a:hover {
background-color: #555;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px #748623;
background-size: cover;
background-position: center;
margin-top: 80px;
position: relative;
background-color: #222; /* Серый фон */
}
h1 {
color: #748623;
text-align: center; /* Add this line */
}
p {
color: #fff;
font-size: 18px;
line-height: 1.6;
margin-bottom: 20px;
font-weight: bold;
}
.back-button {
background-color: #007bff;
color: #fff;
padding: 10px 20px;
border-radius: 5px;
text-decoration: none;
margin-top: 20px;
display: inline-block;
}
.back-button:hover {
background-color: #0056b3;
}
.images-container {
position: absolute;
top: 100%;
left: 0;
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 20px;
}
.image {
width: 45%;
border-radius: 10px;
box-shadow: 0 0 10px #748623;
}
/* Стили для области оценки */
#ratings {
padding-top: 50px; /* Добавляем отступ сверху, чтобы область оценки была выше */
text-align: center; /* Центрируем содержимое */
}
#ratings input {
width: 50px; /* Устанавливаем ширину поля ввода */
margin: 10px; /* Добавляем отступы между элементами */
}
</style>
</head>
<body>
<nav>
<div class="logo" onclick="location.href='/'">
<img src="https://cdn.discordapp.com/attachments/704651653873139803/1233880220004519986/Screenshot_2024-04-27_233856-removebg-preview.png?ex=662eb400&is=662d6280&hm=518bf12af052c5268492e81d64f8957eea1d6163b3c8fe28c3e8a69758169263&" alt="Tanki Logo">
</div>
<ul>
<li><a href="/about">About</a></li>
<li><a href="/game">Game</a></li>
<li><a href="/support">Support</a></li>
<li><a href="/updates">Updates</a></li>
</ul>
</nav>
<div class="container">
<h1>About Tanki 2D</h1>
</div>
<div class="container">
<p>Welcome to the world of Tanks 2D, an exciting single-player game in which you take command of a formidable tank and set out to conquer enemy territory.</p>
<p>Embark on an epic single-player campaign filled with exciting missions and challenges.</p>
<p>Customize your tank with a wide range of weapons, armor and upgrades to enhance your combat capabilities. Engage in adrenaline-pumping battles against enemy forces and bosses, using strategic tactics and your tank's unique abilities to overcome obstacles and emerge victorious.</p>
<p>With addictive gameplay and stunning graphics, Tanki 2D offers an immersive gaming experience that will keep you hooked for hours. Get ready to go on an epic journey and become the best commander in Tanki 2D!</p>
<div class="images-container">
<img class="image" src="https://cdn.discordapp.com/attachments/856238529502511144/1234087135787618377/image.png?ex=662f74b5&is=662e2335&hm=ce9367095cc02d2236475fe2c7b6f8f958fe3e8b6547d727fce3e76126cfeb8a&" alt="Left Image">
<img class="image" src="https://cdn.discordapp.com/attachments/856238529502511144/1234087242314813500/image.png?ex=662f74ce&is=662e234e&hm=5a7c75a04a0959a718b2a401bf74026a3f204e25639106d886d0dcb4759bfebf&" alt="Right Image">
</div>
</div>
<!-- Область для оценки -->
<div id="ratings" class="container" style="margin-top: 1000px;"> <!-- Установите высоту в px в зависимости от контента выше -->
<h2>Rate Our Website and Game</h2>
<p>Please rate our website and game from 1 to 5 stars:</p>
<div>
<label for="websiteRating">Website:</label>
<input type="number" id="websiteRating" name="websiteRating" min="1" max="5">
</div>
<div>
<label for="gameRating">Game:</label>
<input type="number" id="gameRating" name="gameRating" min="1" max="5">
</div>
<button onclick="submitRatings()">Submit Ratings</button>
</div>
<script>
// Функция для отправки оценок
function submitRatings() {
var websiteRating = document.getElementById("websiteRating").value;
var gameRating = document.getElementById("gameRating").value;
alert("Thank you for your ratings! \nFrom: Arsenij, Artem and Roman. :) \nWebsite: " + websiteRating + " stars\nGame: " + gameRating + " stars");
}
</script>
</body>
</html>

27
app.py 100644
View File

@ -0,0 +1,27 @@
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/index")
@app.route("/")
def index():
return render_template('index.html')
@app.route("/about")
def about():
return render_template('about.html')
@app.route("/game")
def game():
return render_template('game.html')
@app.route("/support")
def support():
return render_template('support.html')
@app.route("/updates")
def updates():
return render_template('updates.html')
if __name__ == "__main__":
app.run(debug=True)

631
bla.py 100644
View File

@ -0,0 +1,631 @@
import pygame
import random
import math
from main import current_time
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_WIDTH = 90
PLAYER_HEIGHT = 135
LOH_WIDTH = 150
LOH_HEIGHT = 100
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
TANK_SPEED = 2
BOT_SPEED = 2
FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
score = 0
# Инициализация Pygame
pygame.init()
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
# Загрузка и воспроизведение музыки
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки
shot_sound = pygame.mixer.Sound('shot.wav')
meme_sound = pygame.mixer.Sound("meme_sound.wav")
explosion_sound = pygame.mixer.Sound("explosion_sound.wav")
stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav")
# Загрузка изображений
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_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))
explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)]
stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)]
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
cursor = pygame.image.load("cursor.png")
pygame.mouse.set_visible(False)
cursor_offset_x = cursor.get_width() // 2
cursor_offset_y = cursor.get_height() // 2
paused_menu_active = False
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 6:
self.kill()
else:
center = self.rect.center
self.image = explosion_images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Добавление класса для анимации удара о каменную стену
class StoneExplosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = stoneexplosion_images
self.image = self.images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
stoneexplosion_sound.play() # Воспроизведение звука удара о стену
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Определение класса танка
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.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
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)
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):
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def shoot(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами
shot_sound.play() # Воспроизведение звука выстрела
# Коррекция угла вылета пули, чтобы она вылетала из дула танка
offset_angle = -90 # Угол смещения для вылета пули из дула
corrected_angle = self.angle + offset_angle
# Вычисляем координаты дула танка
offset_x = 70 * math.cos(math.radians(corrected_angle))
offset_y = 70 * math.sin(math.radians(corrected_angle))
bullet = PlayerBullet(self.rect.centerx + offset_x, self.rect.centery + offset_y, self.angle + 270)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Проверяем столкновение пули с каменными стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной
explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену
all_sprites.add(explosion) # Добавление анимации удара о стену в группу спрайтов
bullet.kill() # Удаление пули
class PlayerBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса снаряда бота
class BotBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса для бота
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = loh_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = 0 # Угол поворота бота
self.speed = BOT_SPEED # Скорость бота
def update(self):
# Находим координаты игрока
player_x, player_y = player.rect.center
# Вычисляем угол к игроку
dx = player_x - self.rect.centerx
dy = player_y - self.rect.centery
self.angle = math.degrees(math.atan2(dy, dx)) + 90
# Поворачиваем изображение бота
self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
# Двигаем бота в направлении игрока
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)
# Проверяем, не выходит ли бот за границы экрана
self.check_bounds()
# Проверяем столкновения с другими ботами
self.check_bot_collisions()
def check_bounds(self):
# Проверка выхода за границы экрана
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
if self.rect.top < 0:
self.rect.top = 0
elif self.rect.bottom > SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT
def check_bot_collisions(self):
# Проверяем столкновения с другими ботами
for bot in tanks:
if bot != self:
# Проверяем расстояние между ботами
distance = math.sqrt(
(self.rect.centerx - bot.rect.centerx) ** 2 + (self.rect.centery - bot.rect.centery) ** 2)
min_distance = 100 # Минимальное допустимое расстояние между ботами
if distance < min_distance:
# Если боты слишком близко, переместим текущий бот подальше от другого бота
dx = self.rect.centerx - bot.rect.centerx
dy = self.rect.centery - bot.rect.centery
self.rect.x += dx / distance * min_distance / 2
self.rect.y += dy / distance * min_distance / 2
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() # Группа для всех стен
# Создание стен
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)
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# Создание игрока
player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player)
tanks.add(player)
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)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Старт"
start_text = font.render("Start", True, WHITE)
start_rect = start_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(start_text, start_rect)
# Рисуем кнопку "Настройки"
settings_text = font.render("Settings", True, WHITE)
settings_rect = settings_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(settings_text, settings_rect)
# Рисуем кнопку "Выйти"
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 100))
screen.blit(quit_text, quit_rect)
x, y = pygame.mouse.get_pos()
screen.blit(cursor, (x - cursor_offset_x, y - cursor_offset_y))
pygame.display.flip()
return start_rect, settings_rect, 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)
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
def draw_settings_menu():
settings_background = pygame.transform.scale(pygame.image.load("settings_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
screen.blit(settings_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Выйти" в правом верхнем углу
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(topright=(SCREEN_WIDTH - 20, 20))
screen.blit(quit_text, quit_rect)
# Рисуем кнопку для управления музыкой
if pygame.mixer.music.get_busy():
music_text = font.render("Music On", True, WHITE)
else:
music_text = font.render("Music Off", True, WHITE)
music_rect = music_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(music_text, music_rect)
x, y = pygame.mouse.get_pos()
screen.blit(cursor, (x - cursor_offset_x, y - cursor_offset_y))
pygame.display.flip()
return quit_rect, music_rect
# Главный цикл программы
menu_active = True
settings_active = False # Флаг, показывающий, активно ли меню настроек
while menu_active:
if not settings_active:
start_rect, settings_rect, quit_rect = draw_menu()
else:
quit_rect, music_rect = draw_settings_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
if not settings_active:
if start_rect.collidepoint(event.pos):
menu_active = False # Нажата кнопка "Старт"
elif settings_rect.collidepoint(event.pos):
settings_active = True # Нажата кнопка "Настройки"
elif quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
else:
if quit_rect.collidepoint(event.pos):
settings_active = False
elif music_rect.collidepoint(event.pos):
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop() # Выключение музыки
else:
pygame.mixer.music.play(-1) # Включение музыки
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
paused = False # Track pause state
while running:
if menu_active: # If in menu, return to menu loop
while menu_active:
start_rect, settings_rect, quit_rect = draw_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Left mouse button
if start_rect.collidepoint(event.pos):
menu_active = False # Start button clicked
elif settings_rect.collidepoint(event.pos):
settings_active = True # Settings button clicked
menu_active = False # Return to menu loop
elif quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
pygame.display.flip() # Update the display
clock.tick(FPS) #
# Handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
# Handle left mouse button click
if not paused:
player.shoot()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
# Handle 'k' key press for meme sound
if current_time - last_meme_time > meme_delay:
meme_sound.play()
last_meme_time = current_time
elif event.key == pygame.K_ESCAPE:
# Toggle pause state when escape key is pressed
paused = not paused
elif event.key == pygame.K_SPACE:
# Return to menu when space key is pressed
menu_active = True
settings_active = False # Reset settings_active when returning to menu
if settings_active: # If in settings, return to settings loop
while settings_active:
quit_rect, music_rect = draw_settings_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Left mouse button
if quit_rect.collidepoint(event.pos):
menu_active = True # Set menu_active to True to return to menu
settings_active = False # Quit button clicked
draw_menu() # Redraw the menu to prevent flickering
elif music_rect.collidepoint(event.pos):
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop() # Turn off music
else:
pygame.mixer.music.play(-1) # Turn on music
pygame.display.flip() # Update the display
clock.tick(FPS) # Limit the frame rate
elif not paused: # If not in menu and not paused, update game state
# Update sprites
all_sprites.update()
# Проверка столкновений пуль с танками
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
explosion_sound.play() # Воспроизведение звука взрыва
explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва
all_sprites.add(explosion) # Добавление взрыва в группу спрайтов
bullet.kill() # Удаляем пулю
tank_hit.kill() # Удаляем бота
respawn_bot() # Создаем нового бота
score += 1
elif isinstance(bullet, BotBullet):
# Проверяем столкновение пули бота с стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука взрыва камня
explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня
all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов
bullet.kill() # Удаляем пулю бота
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
screen.blit(stena, (360, 40))
screen.blit(stena, (460, 730))
screen.blit(stena, (460, 830))
screen.blit(stena, (460, 930))
screen.blit(stena, (960, 40))
screen.blit(stena, (960, 140))
screen.blit(stena, (960, 240))
screen.blit(stena, (660, 240))
screen.blit(stena, (960, 440))
screen.blit(stena, (960, 540))
screen.blit(stena, (960, 640))
screen.blit(stena, (960, 740))
screen.blit(stena, (1260, 740))
screen.blit(stena, (1360, 740))
screen.blit(stena, (1460, 740))
screen.blit(stena, (1560, 740))
screen.blit(stena, (1660, 740))
screen.blit(stena, (360, 240))
screen.blit(stena, (360, 340))
screen.blit(stena, (360, 440))
screen.blit(stena, (0, 540))
screen.blit(stena, (60, 540))
screen.blit(stena, (260, 540))
screen.blit(stena, (360, 540))
screen.blit(stena, (460, 540))
screen.blit(stena, (560, 540))
screen.blit(stena, (660, 540))
screen.blit(stena, (760, 540))
screen.blit(stena, (860, 540))
screen.blit(stena, (1160, 240))
screen.blit(stena, (1260, 240))
screen.blit(stena, (1360, 240))
screen.blit(stena, (1460, 240))
screen.blit(stena, (1460, 340))
screen.blit(stena, (1760, 340))
screen.blit(stena, (1860, 340))
screen.blit(stenki, (-150, 0))
screen.blit(stenki, (-150, 200))
screen.blit(stenki, (-150, 400))
screen.blit(stenki, (-150, 600))
screen.blit(stenki, (-150, 800))
screen.blit(stenki, (-150, 1000))
screen.blit(stenki, (0, -150))
screen.blit(stenki, (200, -150))
screen.blit(stenki, (400, -150))
screen.blit(stenki, (600, -150))
screen.blit(stenki, (800, -150))
screen.blit(stenki, (1000, -150))
screen.blit(stenki, (1200, -150))
screen.blit(stenki, (1400, -150))
screen.blit(stenki, (1600, -150))
screen.blit(stenki, (1800, -150))
screen.blit(stenki, (1870, 0))
screen.blit(stenki, (1870, 200))
screen.blit(stenki, (1870, 400))
screen.blit(stenki, (1870, 600))
screen.blit(stenki, (1870, 800))
screen.blit(stenki, (1870, 1000))
screen.blit(stenki, (0, 1030))
screen.blit(stenki, (200, 1030))
screen.blit(stenki, (400, 1030))
screen.blit(stenki, (600, 1030))
screen.blit(stenki, (800, 1030))
screen.blit(stenki, (1000, 1030))
screen.blit(stenki, (1200, 1030))
screen.blit(stenki, (1400, 1030))
screen.blit(stenki, (1600, 1030))
screen.blit(stenki, (1800, 1030))
font = pygame.font.Font(None, 36)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
score_rect = score_text.get_rect(topleft=(10, 10))
pygame.draw.rect(screen, (0, 255, 0), (
score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score
screen.blit(score_text, score_rect.topleft)
x, y = pygame.mouse.get_pos()
screen.blit(cursor, (x - cursor_offset_x, y - cursor_offset_y))
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()

7
bootstrap.bundle.min.js vendored 100644

File diff suppressed because one or more lines are too long

7
bootstrap.min.css vendored 100644

File diff suppressed because one or more lines are too long

BIN
bullet.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
cursor.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
explosion_1.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
explosion_10.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
explosion_11.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
explosion_12.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
explosion_13.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
explosion_14.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
explosion_15.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
explosion_16.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
explosion_17.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
explosion_18.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
explosion_19.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
explosion_2.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
explosion_20.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
explosion_21.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
explosion_22.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
explosion_23.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
explosion_24.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
explosion_25.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
explosion_26.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
explosion_27.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
explosion_28.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
explosion_29.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
explosion_3.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
explosion_30.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
explosion_31.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
explosion_32.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
explosion_33.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
explosion_34.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
explosion_35.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
explosion_36.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
explosion_37.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
explosion_38.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
explosion_39.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
explosion_4.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
explosion_40.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
explosion_41.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
explosion_42.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
explosion_43.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
explosion_44.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
explosion_45.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
explosion_46.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
explosion_47.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
explosion_5.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
explosion_6.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
explosion_7.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
explosion_8.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
explosion_9.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
explosion_sound.wav 100644

Binary file not shown.

172
game.html 100644
View File

@ -0,0 +1,172 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Game - Tanks 2D</title>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet">
<link rel="icon" href="https://cdn.discordapp.com/attachments/856238529502511144/1234217742689767424/free-icon-tank-942355.png?ex=662fee58&is=662e9cd8&hm=82b93f0803c76e54589ff9766815979b37ed52b2ac7ac88a05cd081040a33492&">
<style>
body {
font-family: 'Montserrat', sans-serif;
margin: 0;
padding: 0;
background-color: #000; /* Черный цвет фона */
color: #fff; /* Белый цвет текста */
}
nav {
position: fixed; /* Фиксированная позиция */
top: 0; /* Расположение шапки вверху */
left: 0; /* Расположение шапки слева */
width: 100%; /* Занимает всю ширину экрана */
background-color: #333;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 999; /* Чтобы шапка была выше других элементов */
}
.logo img {
width: 100px; /* Устанавливаем ширину логотипа */
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
}
nav ul li a {
color: #fff;
text-decoration: none;
padding: 10px 20px;
transition: background-color 0.3s;
}
nav ul li a:hover {
background-color: #555;
}
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
background-color: #222; /* Цвет фона контейнера */
border-radius: 10px;
box-shadow: 0 0 10px #748623; /* Тень контейнера */
text-align: center;
}
h1 {
color: #748623; /* Цвет заголовка */
}
p {
font-size: 18px;
line-height: 1.6;
margin-bottom: 20px;
}
.advertisement {
margin-top: 50px;
}
.advertisement img {
max-width: 100%;
border-radius: 10px;
box-shadow: 0 0 10px rgba(255, 255, 255, 0.1); /* Тень изображения */
}
/* Стили для области оценки */
#ratings {
padding-top: 50px; /* Добавляем отступ сверху, чтобы область оценки была выше */
padding-bottom: 50px; /* Добавляем отступ снизу */
text-align: center; /* Центрируем содержимое */
}
#ratings input {
width: 50px; /* Устанавливаем ширину поля ввода */
margin: 10px; /* Добавляем отступы между элементами */
}
/* Стили для QR-кода */
#qr-code {
width: 150px; /* Задаем ширину */
height: 150px; /* Задаем высоту */
}
</style>
</head>
<body>
<nav>
<div class="logo">
<a href="/"><img src="https://cdn.discordapp.com/attachments/704651653873139803/1233880220004519986/Screenshot_2024-04-27_233856-removebg-preview.png?ex=662eb400&is=662d6280&hm=518bf12af052c5268492e81d64f8957eea1d6163b3c8fe28c3e8a69758169263&" alt="Tanki Logo"></a>
</div>
<ul>
<li><a href="/about">About</a></li>
<li><a href="/game">Game</a></li>
<li><a href="/support">Support</a></li>
<li><a href="/updates">Updates</a></li>
</ul>
</nav>
<div class="container">
<h1>Tanks 2D</h1>
<img src="https://cdn.discordapp.com/attachments/856238529502511144/1234090991045312543/image.png?ex=662f784c&is=662e26cc&hm=065a8314fa2f80d3f78d86beccbd81b4c1471065feba35a0dd0342d43376cfc7&" alt="Tanks 2D Screenshot">
<p>
Tanks 2D is a fast-paced game where you control a tank and fight other tanks in harsh environments.
The game features one unique tank, unique weapons and challenging obstacles.
As you progress, the number of enemies in the location increases each time.
</p>
<h2>Key Features</h2>
<p>
- Fast-paced 2D tank battles<br>
- Unique weapon<br>
- Carefully designed map<br>
- Detailed graphics<br>
- Beautiful special effects of explosions<br>
</p>
<h2>Difficulties during development</h2>
<p>
If you want to see the difficulties on the way of creating Tanks 2D, <a href="https://crimson-coletta-46.tiiny.site" target="_blank"> click here</a>.
</p>
<p><img id="qr-code" src="https://cdn.discordapp.com/attachments/711235658319921268/1234144155463057408/QRCode.png?ex=662fa9cf&is=662e584f&hm=469e1f53dc4872746d91f8bb84db6d2da0b47d7dda6b37745341179a20df19ab&" alt="QR Code"><br>QR Code</p>
</div>
<!-- Область для оценки -->
<div id="ratings" class="container" style="margin-top: 1000px;"> <!-- Установите высоту в px в зависимости от контента выше -->
<h2>Rate Our Website and Game</h2>
<p>Please rate our website and game from 1 to 5 stars:</p>
<div>
<label for="websiteRating">Website:</label>
<input type="number" id="websiteRating" name="websiteRating" min="1" max="5">
</div>
<div>
<label for="gameRating">Game:</label>
<input type="number" id="gameRating" name="gameRating" min="1" max="5">
</div>
<button onclick="submitRatings()">Submit Ratings</button>
</div>
<script>
// Функция для отправки оценок
function submitRatings() {
var websiteRating = document.getElementById("websiteRating").value;
var gameRating = document.getElementById("gameRating").value;
// Здесь можно добавить код для отправки оценок на сервер или их обработки
alert("Thank you for your ratings! \nFrom: Arsenij, Artem and Roman. :) \nWebsite: " + websiteRating + " stars\nGame: " + gameRating + " stars");
}
</script>
</body>
</html>

183
index.html 100644
View File

@ -0,0 +1,183 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome to Tanki 2D!</title>
<link rel="icon" href="https://cdn.discordapp.com/attachments/856238529502511144/1234217742689767424/free-icon-tank-942355.png?ex=662fee58&is=662e9cd8&hm=82b93f0803c76e54589ff9766815979b37ed52b2ac7ac88a05cd081040a33492&"> <!-- Путь к вашему значку -->
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Montserrat', sans-serif;
margin: 0;
padding: 0;
background-color: #000; /* Черный цвет фона */
color: #fff; /* Белый цвет текста */
}
.wrapper {
margin-top: 80px; /* Отступ для контента под фиксированной шапкой */
overflow-y: auto; /* Включаем вертикальную прокрутку */
}
nav {
position: fixed; /* Фиксированная позиция */
top: 0; /* Расположение шапки вверху */
left: 0; /* Расположение шапки слева */
width: 100%; /* Занимает всю ширину экрана */
background-color: #333;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 999; /* Чтобы шапка была выше других элементов */
}
.logo img {
width: 100px; /* Устанавливаем ширину логотипа */
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
}
nav ul li a {
color: #fff;
text-decoration: none;
padding: 10px 20px;
transition: background-color 0.3s;
}
nav ul li a:hover {
background-color: #555;
}
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
background-color: #222; /* Цвет фона контейнера */
border-radius: 10px;
box-shadow: 0 0 10px #748623; /* Тень контейнера */
text-align: center;
}
h1 {
color: #748623; /* Цвет заголовка */
}
p {
font-size: 18px;
line-height: 1.6;
margin-bottom: 20px;
}
.btn {
display: inline-block;
padding: 10px 20px;
background-color: #748623; /* Цвет кнопки */
color: #fff; /* Цвет текста на кнопке */
text-decoration: none;
border-radius: 5px;
transition: background-color 0.3s;
}
.btn:hover {
background-color: #748623; /* Изменение цвета кнопки при наведении */
}
.advertisement {
margin-top: 50px;
}
.advertisement img {
max-width: 100%;
border-radius: 10px;
box-shadow: 0 0 10px rgba(255, 255, 255, 0.1); /* Тень изображения */
}
.footer {
background-color: #888; /* Серый цвет фона нижнего раздела */
padding: 20px;
margin-top: 50px; /* Отступ сверху */
}
.footer h2 {
color: #fff; /* Белый цвет текста */
margin: 0; /* Убираем внешние отступы */
}
/* Стили для области оценки */
#ratings {
margin-top: 50px; /* Добавляем отступ сверху */
text-align: center; /* Центрируем содержимое */
}
#ratings input {
width: 50px; /* Устанавливаем ширину поля ввода */
margin: 10px; /* Добавляем отступы между элементами */
}
</style>
</head>
<body>
<nav>
<div class="logo">
<a href="/"><img src="https://cdn.discordapp.com/attachments/704651653873139803/1233880220004519986/Screenshot_2024-04-27_233856-removebg-preview.png?ex=662eb400&is=662d6280&hm=518bf12af052c5268492e81d64f8957eea1d6163b3c8fe28c3e8a69758169263&" alt="Tanki Logo"></a>
</div>
<ul>
<li><a href="/about">About</a></li>
<li><a href="/game">Game</a></li>
<li><a href="/support">Support</a></li>
<li><a href="/updates">Updates</a></li>
</ul>
</nav>
<div class="wrapper">
<div class="container">
<h1>Welcome to Tanki 2D!</h1>
<p>Experience the thrill of tank battles like never before. Join our community of players and dominate the battlefield!</p>
<p>Get started now:</p>
<a href="/about" class="btn">Learn More</a>
<!-- Advertisement Section -->
<div class="advertisement">
<h2>Check out our latest game: Tanks 2D</h2>
<p>Engage in fast-paced 2D tank battles with stunning graphics and intense gameplay!</p>
<img src="https://cdn.discordapp.com/attachments/856238529502511144/1234090991045312543/image.png?ex=662f784c&is=662e26cc&hm=065a8314fa2f80d3f78d86beccbd81b4c1471065feba35a0dd0342d43376cfc7&" alt="Tanks 2D Advertisement">
</div>
</div>
<!-- Область для оценки -->
<div id="ratings" class="container" style="margin-top: 1000px;"> <!-- Установите высоту в px в зависимости от контента выше -->
<h2>Rate Our Website and Game</h2>
<p>Please rate our website and game from 1 to 5 stars:</p>
<div>
<label for="websiteRating">Website:</label>
<input type="number" id="websiteRating" name="websiteRating" min="1" max="5">
</div>
<div>
<label for="gameRating">Game:</label>
<input type="number" id="gameRating" name="gameRating" min="1" max="5">
</div>
<button onclick="submitRatings()">Submit Ratings</button>
</div>
<script>
// Функция для отправки оценок
function submitRatings() {
var websiteRating = document.getElementById("websiteRating").value;
var gameRating = document.getElementById("gameRating").value;
// Здесь можно добавить код для отправки оценок на сервер или их обработки
alert("Thank you for your ratings! \nFrom: Arsenij, Artem and Roman. :) \nWebsite: " + websiteRating + " stars\nGame: " + gameRating + " stars");
}
</script>
</body>
</html>

BIN
loh.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@ -18,6 +18,9 @@ FIRE_DELAY = 1000 # Задержка между выстрелами в мил
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
#Определение переменных
score = 0
# Инициализация Pygame
pygame.init()
@ -30,8 +33,8 @@ pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки
shot_sound = pygame.mixer.Sound('shot.wav')
meme_sound = pygame.mixer.Sound("meme_sound.wav")
explosion_sound = pygame.mixer.Sound("explosion_sound.wav")
stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav")
# Загрузка изображений
background_image = pygame.transform.scale(pygame.image.load("travka_pol.jpeg"), (960, 540))
@ -40,10 +43,73 @@ stenki = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (200,
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))
explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)]
stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)]
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 6:
self.kill()
else:
center = self.rect.center
self.image = explosion_images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Добавление класса для анимации удара о каменную стену
class StoneExplosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = stoneexplosion_images
self.image = self.images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
stoneexplosion_sound.play() # Воспроизведение звука удара о стену
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Определение класса танка
class Tank(pygame.sprite.Sprite):
def __init__(self, x, y):
@ -96,8 +162,14 @@ class Tank(pygame.sprite.Sprite):
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Проверяем столкновение пули с каменными стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной
explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену
all_sprites.add(explosion) # Добавление анимации удара о стену в группу спрайтов
bullet.kill() # Удаление пули
# Определение класса снаряда игрока
class PlayerBullet(pygame.sprite.Sprite):
def __init__(self, x, y, angle):
super().__init__()
@ -114,6 +186,7 @@ class PlayerBullet(pygame.sprite.Sprite):
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса снаряда бота
class BotBullet(pygame.sprite.Sprite):
def __init__(self, x, y, angle):
@ -131,6 +204,7 @@ class BotBullet(pygame.sprite.Sprite):
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса для бота
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
@ -147,7 +221,7 @@ class Bot(pygame.sprite.Sprite):
self.move_random()
self.rotate_random()
self.check_bounds()
#self.shoot_random()
# self.shoot_random()
def move_random(self):
# Движение вперёд в направлении текущего угла поворота
@ -174,15 +248,14 @@ class Bot(pygame.sprite.Sprite):
elif 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
# 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
class Wall(pygame.sprite.Sprite):
@ -198,7 +271,6 @@ tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
walls = pygame.sprite.Group() # Группа для всех стен
# Создание стен
wall_positions = [
(360, 40), (460, 730), (460, 830), (460, 930),
@ -233,9 +305,6 @@ for pos in wall_stenki_positions:
all_sprites.add(wall_stenki)
walls.add(wall_stenki)
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
@ -246,8 +315,6 @@ player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player)
tanks.add(player)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
@ -260,6 +327,7 @@ bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
# Рисуем текст меню
@ -284,11 +352,10 @@ def respawn_bot():
all_sprites.add(new_bot)
tanks.add(new_bot)
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
# Главный цикл программы
menu_active = True
while menu_active:
@ -302,12 +369,9 @@ while menu_active:
else:
menu_active = False # Нажата кнопка "Старт"
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
paused = False # Флаг для отслеживания состояния паузы
while running:
player_bullets = []
@ -321,69 +385,6 @@ while running:
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши
player.shoot()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
if current_time - last_meme_time > meme_delay: # Проверка задержки
meme_sound.play()
last_meme_time = current_time # Обновление времени последнего воспроизведения звука
elif event.key == pygame.K_ESCAPE: # Пауза по нажатию на Escape
paused = not paused # Инвертируем состояние паузы
if not paused:
# Обновление всех спрайтов только в случае, если игра не на паузе
all_sprites.update()
# Проверка столкновений пуль с танками
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
tank_hit.kill() # Удаляем бота, если попал игрок
bullet.kill() # Удаляем пулю
elif isinstance(bullet, BotBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Tank):
tank_hit.kill() # Удаляем игрока, если попал бот
bullet.kill() # Удаляем пулю
if tank_hit and isinstance(tank_hit, Bot):
tank_hit.kill() # Удаляем бота, если попал игрок
bullet.kill() # Удаляем пулю
respawn_bot() # Пересоздаем бота в случайном месте карты
bullet.update()
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
# Отображение стен
for wall in walls:
screen.blit(wall.image, wall.rect)
pygame.display.flip()
clock.tick(FPS)
else:
# Если игра на паузе, просто ждем события
clock.tick(FPS)
while running:
player_bullets = []
bot_bullets = []
current_time = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши
player.shoot()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
if current_time - last_meme_time > meme_delay: # Проверка задержки
@ -398,19 +399,22 @@ while running:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
tank_hit.kill() # Удаляем бота, если попал игрок
explosion_sound.play() # Воспроизведение звука взрыва
explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва
all_sprites.add(explosion) # Добавление взрыва в группу спрайтов
bullet.kill() # Удаляем пулю
elif isinstance(bullet, BotBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Tank):
tank_hit.kill() # Удаляем игрока, если попал бот
bullet.kill() # Удаляем пулю
if tank_hit and isinstance(tank_hit, Bot):
tank_hit.kill() # Удаляем бота, если попал игрок
bullet.kill() # Удаляем пулю
respawn_bot() # Пересоздаем бота в случайном месте карты
tank_hit.kill() # Удаляем бота
respawn_bot() # Создаем нового бота
score += 1
elif isinstance(bullet, BotBullet):
# Проверяем столкновение пули бота с стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука взрыва камня
explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня
all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов
bullet.kill() # Удаляем пулю бота
bullet.update()
# Отрисовка фона
for i in range(2):
@ -496,10 +500,16 @@ while running:
screen.blit(stenki, (1600, 1030))
screen.blit(stenki, (1800, 1030))
font = pygame.font.Font(None, 36)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
score_rect = score_text.get_rect(topleft=(10, 10))
pygame.draw.rect(screen, (0, 255, 0), (score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score
screen.blit(score_text, score_rect.topleft)
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()
# token: 8f195a885b18a96da6577884cc731f850f33a9e2 переделай код так чтоби игру мозно било приостанавливат кнопкой escape

BIN
meme_sound.wav 100644

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 344 KiB

BIN
music.mp3 100644

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 42 KiB

1
puiopiuop.py 100644
View File

@ -0,0 +1 @@
oipyuiop

515
score 100644
View File

@ -0,0 +1,515 @@
import pygame
import random
import math
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_WIDTH = 100
PLAYER_HEIGHT = 150
LOH_WIDTH = 300
LOH_HEIGHT = 250
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
TANK_SPEED = 2
BOT_SPEED = 2
FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
#Определение переменных
score = 0
# Инициализация Pygame
pygame.init()
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
# Загрузка и воспроизведение музыки
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки
shot_sound = pygame.mixer.Sound('shot.wav')
meme_sound = pygame.mixer.Sound("meme_sound.wav")
explosion_sound = pygame.mixer.Sound("explosion_sound.wav")
stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav")
# Загрузка изображений
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_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))
explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)]
stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)]
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 6:
self.kill()
else:
center = self.rect.center
self.image = explosion_images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Добавление класса для анимации удара о каменную стену
class StoneExplosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = stoneexplosion_images
self.image = self.images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
stoneexplosion_sound.play() # Воспроизведение звука удара о стену
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Определение класса танка
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.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
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)
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):
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def shoot(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами
shot_sound.play() # Воспроизведение звука выстрела
# Коррекция угла вылета пули, чтобы она вылетала из дула танка
offset_angle = -90 # Угол смещения для вылета пули из дула
corrected_angle = self.angle + offset_angle
# Вычисляем координаты дула танка
offset_x = 70 * math.cos(math.radians(corrected_angle))
offset_y = 70 * math.sin(math.radians(corrected_angle))
bullet = PlayerBullet(self.rect.centerx + offset_x, self.rect.centery + offset_y, self.angle + 270)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Проверяем столкновение пули с каменными стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной
explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену
all_sprites.add(explosion) # Добавление анимации удара о стену в группу спрайтов
bullet.kill() # Удаление пули
class PlayerBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса снаряда бота
class BotBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса для бота
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = loh_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = random.randint(0, 360) # Случайный начальный угол поворота
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.rotate_delay = random.randint(100, 500) # Начальная задержка перед поворотом
self.rotate_timer = 0
def update(self):
self.move_random()
self.rotate_random()
self.check_bounds()
# self.shoot_random()
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):
# Проверка выхода за границы экрана
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
if self.rect.top < 0:
self.rect.top = 0
elif 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
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() # Группа для всех стен
# Создание стен
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)
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# Создание игрока
player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player)
tanks.add(player)
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)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
# Рисуем текст меню
font = pygame.font.Font(None, 50)
text = font.render("Start", True, WHITE)
text_rect = text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 50))
screen.blit(text, text_rect)
# Рисуем кнопку "Выйти"
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 50))
screen.blit(quit_text, quit_rect)
pygame.display.flip()
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)
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
# Главный цикл программы
menu_active = True
while menu_active:
quit_rect = draw_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
if quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
else:
menu_active = False # Нажата кнопка "Старт"
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
while running:
player_bullets = []
bot_bullets = []
current_time = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши
player.shoot()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
if current_time - last_meme_time > meme_delay: # Проверка задержки
meme_sound.play()
last_meme_time = current_time # Обновление времени последнего воспроизведения звука
# Обновление всех спрайтов
all_sprites.update()
# Проверка столкновений пуль с танками
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
explosion_sound.play() # Воспроизведение звука взрыва
explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва
all_sprites.add(explosion) # Добавление взрыва в группу спрайтов
bullet.kill() # Удаляем пулю
tank_hit.kill() # Удаляем бота
respawn_bot() # Создаем нового бота
score += 1
elif isinstance(bullet, BotBullet):
# Проверяем столкновение пули бота с стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука взрыва камня
explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня
all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов
bullet.kill() # Удаляем пулю бота
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
screen.blit(stena, (360, 40))
screen.blit(stena, (460, 730))
screen.blit(stena, (460, 830))
screen.blit(stena, (460, 930))
screen.blit(stena, (960, 40))
screen.blit(stena, (960, 140))
screen.blit(stena, (960, 240))
screen.blit(stena, (660, 240))
screen.blit(stena, (960, 440))
screen.blit(stena, (960, 540))
screen.blit(stena, (960, 640))
screen.blit(stena, (960, 740))
screen.blit(stena, (1260, 740))
screen.blit(stena, (1360, 740))
screen.blit(stena, (1460, 740))
screen.blit(stena, (1560, 740))
screen.blit(stena, (1660, 740))
screen.blit(stena, (360, 240))
screen.blit(stena, (360, 340))
screen.blit(stena, (360, 440))
screen.blit(stena, (0, 540))
screen.blit(stena, (60, 540))
screen.blit(stena, (260, 540))
screen.blit(stena, (360, 540))
screen.blit(stena, (460, 540))
screen.blit(stena, (560, 540))
screen.blit(stena, (660, 540))
screen.blit(stena, (760, 540))
screen.blit(stena, (860, 540))
screen.blit(stena, (1160, 240))
screen.blit(stena, (1260, 240))
screen.blit(stena, (1360, 240))
screen.blit(stena, (1460, 240))
screen.blit(stena, (1460, 340))
screen.blit(stena, (1760, 340))
screen.blit(stena, (1860, 340))
screen.blit(stenki, (-150, 0))
screen.blit(stenki, (-150, 200))
screen.blit(stenki, (-150, 400))
screen.blit(stenki, (-150, 600))
screen.blit(stenki, (-150, 800))
screen.blit(stenki, (-150, 1000))
screen.blit(stenki, (0, -150))
screen.blit(stenki, (200, -150))
screen.blit(stenki, (400, -150))
screen.blit(stenki, (600, -150))
screen.blit(stenki, (800, -150))
screen.blit(stenki, (1000, -150))
screen.blit(stenki, (1200, -150))
screen.blit(stenki, (1400, -150))
screen.blit(stenki, (1600, -150))
screen.blit(stenki, (1800, -150))
screen.blit(stenki, (1870, 0))
screen.blit(stenki, (1870, 200))
screen.blit(stenki, (1870, 400))
screen.blit(stenki, (1870, 600))
screen.blit(stenki, (1870, 800))
screen.blit(stenki, (1870, 1000))
screen.blit(stenki, (0, 1030))
screen.blit(stenki, (200, 1030))
screen.blit(stenki, (400, 1030))
screen.blit(stenki, (600, 1030))
screen.blit(stenki, (800, 1030))
screen.blit(stenki, (1000, 1030))
screen.blit(stenki, (1200, 1030))
screen.blit(stenki, (1400, 1030))
screen.blit(stenki, (1600, 1030))
screen.blit(stenki, (1800, 1030))
font = pygame.font.Font(None, 36)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
score_rect = score_text.get_rect(topleft=(10, 10))
pygame.draw.rect(screen, (0, 255, 0), (score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score
screen.blit(score_text, score_rect.topleft)
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
shot.wav 100644

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

155
support.html 100644
View File

@ -0,0 +1,155 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About Tanki</title>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet">
<link rel="icon" href="https://cdn.discordapp.com/attachments/856238529502511144/1234217742689767424/free-icon-tank-942355.png?ex=662fee58&is=662e9cd8&hm=82b93f0803c76e54589ff9766815979b37ed52b2ac7ac88a05cd081040a33492&">
<style>
body {
font-family: 'Montserrat', sans-serif;
margin: 0;
padding: 0;
background-color: #000000; /* Черный цвет фона */
color: #fff; /* Белый цвет текста */
}
nav {
position: fixed; /* Фиксированная позиция */
top: 0; /* Расположение шапки вверху */
left: 0; /* Расположение шапки слева */
width: 100%; /* Занимает всю ширину экрана */
background-color: #333;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 999; /* Чтобы шапка была выше других элементов */
}
.logo img {
width: 100px; /* Устанавливаем ширину логотипа */
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
}
nav ul li a {
color: #fff;
text-decoration: none;
padding: 10px 20px;
transition: background-color 0.3s;
}
nav ul li a:hover {
background-color: #555;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px #748623;
background-color: #222;
background-size: cover;
background-position: center;
margin-top: 80px;
position: relative;
}
h1 {
color: #748623;
text-align: center; /* Центрирование текста */
}
p {
color: #fff;
text-align: center; /* Центрирование текста */
font-size: 18px;
line-height: 1.6;
margin-bottom: 20px;
font-weight: bold;
}
.email {
font-size: 20px;
font-weight: bold;
margin-top: 20px;
text-align: center;
}
/* Стили для области оценки */
#ratings {
padding-top: 50px; /* Добавляем отступ сверху, чтобы область оценки была выше */
text-align: center; /* Центрируем содержимое */
}
#ratings input {
width: 50px; /* Устанавливаем ширину поля ввода */
margin: 10px; /* Добавляем отступы между элементами */
}
</style>
</head>
<body>
<nav>
<div class="logo" onclick="location.href='/'">
<img src="https://cdn.discordapp.com/attachments/704651653873139803/1233880220004519986/Screenshot_2024-04-27_233856-removebg-preview.png?ex=662eb400&is=662d6280&hm=518bf12af052c5268492e81d64f8957eea1d6163b3c8fe28c3e8a69758169263&" alt="Tanki Logo">
</div>
<ul>
<li><a href="/about">About</a></li>
<li><a href="/game">Game</a></li>
<li><a href="/support">Support</a></li>
<li><a href="/updates">Updates</a></li>
</ul>
</nav>
<div class="container">
<h1>Encountered any unexpected problems?</h1>
</div>
<div class="container">
<p>If you have any questions or problems, please contact our support team by email:</p>
<p class="email">supporttanki@gmail.com</p>
<form id="supportForm">
<textarea id="problemDescription" placeholder="Or you can describe your problem here..." rows="4" cols="50"></textarea>
<br>
<button type="submit">Send</button>
</form>
</div>
<!-- Область для оценки -->
<div id="ratings" class="container" style="margin-top: 1000px;"> <!-- Установите высоту в px в зависимости от контента выше -->
<h2>Rate Our Website and Game</h2>
<p>Please rate our website and game from 1 to 5 stars:</p>
<div>
<label for="websiteRating">Website:</label>
<input type="number" id="websiteRating" name="websiteRating" min="1" max="5">
</div>
<div>
<label for="gameRating">Game:</label>
<input type="number" id="gameRating" name="gameRating" min="1" max="5">
</div>
<button onclick="submitRatings()">Submit Ratings</button>
</div>
<script>
// Функция для отправки оценок
function submitRatings() {
var websiteRating = document.getElementById("websiteRating").value;
var gameRating = document.getElementById("gameRating").value;
// Здесь можно добавить код для отправки оценок на сервер или их обработки
alert("Thank you for your ratings! \nFrom: Arsenij, Artem and Roman. :) \nWebsite: " + websiteRating + " stars\nGame: " + gameRating + " stars");
}
</script>
</body>
</html>

BIN
theme.mp3 100644

Binary file not shown.

0
trfh 100644
View File

192
updates.html 100644
View File

@ -0,0 +1,192 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Game Updates</title>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet">
<link rel="icon" href="https://cdn.discordapp.com/attachments/856238529502511144/1234217742689767424/free-icon-tank-942355.png?ex=662fee58&is=662e9cd8&hm=82b93f0803c76e54589ff9766815979b37ed52b2ac7ac88a05cd081040a33492&">
<style>
body {
font-family: 'Montserrat', sans-serif;
margin: 0;
padding: 0;
background-color: #000; /* Black background color */
color: #fff; /* White text color */
}
nav {
position: fixed; /* Fixed position */
top: 0; /* Position at the top */
left: 0; /* Position at the left */
width: 100%; /* Takes the full width */
background-color: #333;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 999; /* Ensures the navbar is above other elements */
}
.logo img {
width: 100px; /* Set the width of the logo */
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
}
nav ul li a {
color: #fff;
text-decoration: none;
padding: 10px 20px;
transition: background-color 0.3s;
}
nav ul li a:hover {
background-color: #555;
}
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
background-color: #222; /* Background color of the container */
border-radius: 10px;
box-shadow: 0 0 10px #748623; /* Shadow around the container */
text-align: center;
}
h1 {
color: #748623; /* Header color */
}
p {
font-size: 18px;
line-height: 1.6;
margin-bottom: 20px;
}
/* Styles for updates */
.update {
margin-bottom: 30px; /* Space between updates */
}
.update h2 {
color: #f0c911; /* Update header color */
margin-bottom: 10px; /* Space below the update header */
}
.update p {
color: #fff; /* Text color for updates */
line-height: 1.6; /* Line spacing */
}
.note {
border: 1px solid gray; /* Gray border */
padding: 10px;
border-radius: 10px;
background-color: #333; /* Background color */
color: #f0c911; /* Text color */
font-weight: bold; /* Bold font */
margin-top: 20px; /* Space at the top */
}
/* Styles for the rating area */
#ratings {
margin-top: 50px; /* Space at the top */
text-align: center; /* Center-align content */
}
#ratings input {
width: 50px; /* Width of input fields */
margin: 10px; /* Space between elements */
}
/* Styles for scroll link */
#scrollToRatings {
display: block;
text-align: center;
margin-top: 30px;
}
#scrollToRatings a {
color: #fff;
text-decoration: none;
font-size: 18px;
}
#scrollToRatings a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<nav>
<div class="logo" onclick="location.href='/'">
<img src="https://cdn.discordapp.com/attachments/704651653873139803/1233880220004519986/Screenshot_2024-04-27_233856-removebg-preview.png?ex=662eb400&is=662d6280&hm=518bf12af052c5268492e81d64f8957eea1d6163b3c8fe28c3e8a69758169263&" alt="Tanki Logo">
</div>
<ul>
<li><a href="/about">About</a></li>
<li><a href="/game">Game</a></li>
<li><a href="/support">Support</a></li>
<li><a href="/updates">Updates</a></li>
</ul>
</nav>
<div class="container">
<h1>Game Updates</h1>
<div class="update">
<h2>Update 1.0</h2>
<p>In this update, graphics, game performance, and customization options have been improved. Bugs have also been fixed as reported by players. Get ready for intense battles in new, exciting conditions!</p>
</div>
<div class="update">
<h2>Update 1.1</h2>
<p>In this update, we improved the walls to prevent players from driving through them. Enjoy smoother gameplay and greater stability!</p>
</div>
<div class="update">
<h2>Update 1.2</h2>
<p>In this update, we almost doubled the game map and made it more detailed. Now we are on Steam as a free game! Enjoy smoother gameplay and greater stability!</p>
</div>
<!-- Added text in a gray box -->
<div class="note">
If you want updates to appear more often, support the developers!!!
<br><br> <!-- Double line break to create space -->
ROMANS KOSOGOROVS
<br>
LV39HABA0551051381379
</div>
</div>
<!-- Area for ratings -->
<div id="ratings" class="container" style="margin-top: 1000px;">
<h2>Rate Our Website and Game</h2>
<p>Please rate our website from 1 to 5 stars:</p>
<div>
<label for="websiteRating">Website:</label>
<input type="number" id="websiteRating" name="websiteRating" min="1" max="5">
</div>
<div>
<label for="gameRating">Game:</label>
<input type="number" id="gameRating" name="gameRating" min="1" max="5">
</div>
<button onclick="submitRatings()">Submit Ratings</button>
</div>
<script>
function submitRatings() {
var websiteRating = document.getElementById("websiteRating").value;
var gameRating = document.getElementById("gameRating").value;
alert("Thank you for your ratings!\nWebsite: " + websiteRating + " stars\nGame: " + gameRating + " stars");
}
</script>
</body>
</html>

View File

@ -0,0 +1,578 @@
import pygame
import random
import math
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_WIDTH = 90
PLAYER_HEIGHT = 135
LOH_WIDTH = 150
LOH_HEIGHT = 100
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
TANK_SPEED = 2
BOT_SPEED = 2
FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
score = 0
# Инициализация Pygame
pygame.init()
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
# Загрузка и воспроизведение музыки
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки
shot_sound = pygame.mixer.Sound('shot.wav')
meme_sound = pygame.mixer.Sound("meme_sound.wav")
explosion_sound = pygame.mixer.Sound("explosion_sound.wav")
stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav")
# Загрузка изображений
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_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))
explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)]
stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)]
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
current_time = pygame.time.get_ticks()
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 6:
self.kill()
else:
center = self.rect.center
self.image = explosion_images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Добавление класса для анимации удара о каменную стену
class StoneExplosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = stoneexplosion_images
self.image = self.images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
stoneexplosion_sound.play() # Воспроизведение звука удара о стену
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Определение класса танка
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.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
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)
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):
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def shoot(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами
shot_sound.play() # Воспроизведение звука выстрела
# Коррекция угла вылета пули, чтобы она вылетала из дула танка
offset_angle = -90 # Угол смещения для вылета пули из дула
corrected_angle = self.angle + offset_angle
# Вычисляем координаты дула танка
offset_x = 70 * math.cos(math.radians(corrected_angle))
offset_y = 70 * math.sin(math.radians(corrected_angle))
bullet = PlayerBullet(self.rect.centerx + offset_x, self.rect.centery + offset_y, self.angle + 270)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Проверяем столкновение пули с каменными стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной
explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену
all_sprites.add(explosion) # Добавление анимации удара о стену в группу спрайтов
bullet.kill() # Удаление пули
class PlayerBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса снаряда бота
class BotBullet(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 not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса для бота
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = loh_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = 0 # Угол поворота бота
self.speed = BOT_SPEED # Скорость бота
def update(self):
# Находим координаты игрока
player_x, player_y = player.rect.center
# Вычисляем угол к игроку
dx = player_x - self.rect.centerx
dy = player_y - self.rect.centery
self.angle = math.degrees(math.atan2(dy, dx)) + 90
# Поворачиваем изображение бота
self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
# Двигаем бота в направлении игрока
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)
# Проверяем, не выходит ли бот за границы экрана
self.check_bounds()
# Проверяем столкновения с другими ботами
self.check_bot_collisions()
def check_bounds(self):
# Проверка выхода за границы экрана
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
if self.rect.top < 0:
self.rect.top = 0
elif self.rect.bottom > SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT
def check_bot_collisions(self):
# Проверяем столкновения с другими ботами
for bot in tanks:
if bot != self:
# Проверяем расстояние между ботами
distance = math.sqrt(
(self.rect.centerx - bot.rect.centerx) ** 2 + (self.rect.centery - bot.rect.centery) ** 2)
min_distance = 100 # Минимальное допустимое расстояние между ботами
if distance < min_distance:
# Если боты слишком близко, переместим текущий бот подальше от другого бота
dx = self.rect.centerx - bot.rect.centerx
dy = self.rect.centery - bot.rect.centery
self.rect.x += dx / distance * min_distance / 2
self.rect.y += dy / distance * min_distance / 2
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() # Группа для всех стен
# Создание стен
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)
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# Создание игрока
player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player)
tanks.add(player)
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)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Старт"
start_text = font.render("Start", True, WHITE)
start_rect = start_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(start_text, start_rect)
# Рисуем кнопку "Настройки"
settings_text = font.render("Settings", True, WHITE)
settings_rect = settings_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(settings_text, settings_rect)
# Рисуем кнопку "Выйти"
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 100))
screen.blit(quit_text, quit_rect)
pygame.display.flip()
return start_rect, settings_rect, 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)
def draw_settings_menu():
settings_background = pygame.transform.scale(pygame.image.load("settings_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
screen.blit(settings_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Выйти" в правом верхнем углу
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(topright=(SCREEN_WIDTH - 20, 20))
screen.blit(quit_text, quit_rect)
# Рисуем кнопку для управления музыкой
if pygame.mixer.music.get_busy():
music_text = font.render("Music On", True, WHITE)
else:
music_text = font.render("Music Off", True, WHITE)
music_rect = music_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(music_text, music_rect)
pygame.display.flip()
return quit_rect, music_rect
# Главный цикл программы
menu_active = True
settings_active = False # Флаг, показывающий, активно ли меню настроек
while menu_active:
if not settings_active:
start_rect, settings_rect, quit_rect = draw_menu()
else:
quit_rect, music_rect = draw_settings_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
if not settings_active:
if start_rect.collidepoint(event.pos):
menu_active = False # Нажата кнопка "Старт"
elif settings_rect.collidepoint(event.pos):
settings_active = True # Нажата кнопка "Настройки"
elif quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
else:
if quit_rect.collidepoint(event.pos):
settings_active = False
elif music_rect.collidepoint(event.pos):
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop() # Выключение музыки
else:
pygame.mixer.music.play(-1) # Включение музыки
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
paused = False # Track pause state
while running:
# Handle events
current_time = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
# Handle left mouse button click
if not paused:
player.shoot()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
if current_time - last_meme_time > meme_delay: # Проверка задержки
meme_sound.play()
last_meme_time = current_time # Обновление времени последнего воспроизведения звука
elif event.key == pygame.K_ESCAPE:
if not menu_active: # Если меню неактивно, то активируем его
menu_active = True
settings_active = False # При этом настройки неактивны
else: # Если меню уже активно, то деактивируем его
menu_active = False
settings_active = False
all_sprites.update()
if not paused: # If not paused, update game state
# Update sprites
all_sprites.update()
# Проверка столкновений пуль с танками
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
explosion_sound.play() # Воспроизведение звука взрыва
explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва
all_sprites.add(explosion) # Добавление взрыва в группу спрайтов
bullet.kill() # Удаляем пулю
tank_hit.kill() # Удаляем бота
respawn_bot() # Создаем нового бота
score += 1
elif isinstance(bullet, BotBullet):
# Проверяем столкновение пули бота с стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука взрыва камня
explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня
all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов
bullet.kill() # Удаляем пулю бота
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
screen.blit(stena, (360, 40))
screen.blit(stena, (460, 730))
screen.blit(stena, (460, 830))
screen.blit(stena, (460, 930))
screen.blit(stena, (960, 40))
screen.blit(stena, (960, 140))
screen.blit(stena, (960, 240))
screen.blit(stena, (660, 240))
screen.blit(stena, (960, 440))
screen.blit(stena, (960, 540))
screen.blit(stena, (960, 640))
screen.blit(stena, (960, 740))
screen.blit(stena, (1260, 740))
screen.blit(stena, (1360, 740))
screen.blit(stena, (1460, 740))
screen.blit(stena, (1560, 740))
screen.blit(stena, (1660, 740))
screen.blit(stena, (360, 240))
screen.blit(stena, (360, 340))
screen.blit(stena, (360, 440))
screen.blit(stena, (0, 540))
screen.blit(stena, (60, 540))
screen.blit(stena, (260, 540))
screen.blit(stena, (360, 540))
screen.blit(stena, (460, 540))
screen.blit(stena, (560, 540))
screen.blit(stena, (660, 540))
screen.blit(stena, (760, 540))
screen.blit(stena, (860, 540))
screen.blit(stena, (1160, 240))
screen.blit(stena, (1260, 240))
screen.blit(stena, (1360, 240))
screen.blit(stena, (1460, 240))
screen.blit(stena, (1460, 340))
screen.blit(stena, (1760, 340))
screen.blit(stena, (1860, 340))
screen.blit(stenki, (-150, 0))
screen.blit(stenki, (-150, 200))
screen.blit(stenki, (-150, 400))
screen.blit(stenki, (-150, 600))
screen.blit(stenki, (-150, 800))
screen.blit(stenki, (-150, 1000))
screen.blit(stenki, (0, -150))
screen.blit(stenki, (200, -150))
screen.blit(stenki, (400, -150))
screen.blit(stenki, (600, -150))
screen.blit(stenki, (800, -150))
screen.blit(stenki, (1000, -150))
screen.blit(stenki, (1200, -150))
screen.blit(stenki, (1400, -150))
screen.blit(stenki, (1600, -150))
screen.blit(stenki, (1800, -150))
screen.blit(stenki, (1870, 0))
screen.blit(stenki, (1870, 200))
screen.blit(stenki, (1870, 400))
screen.blit(stenki, (1870, 600))
screen.blit(stenki, (1870, 800))
screen.blit(stenki, (1870, 1000))
screen.blit(stenki, (0, 1030))
screen.blit(stenki, (200, 1030))
screen.blit(stenki, (400, 1030))
screen.blit(stenki, (600, 1030))
screen.blit(stenki, (800, 1030))
screen.blit(stenki, (1000, 1030))
screen.blit(stenki, (1200, 1030))
screen.blit(stenki, (1400, 1030))
screen.blit(stenki, (1600, 1030))
screen.blit(stenki, (1800, 1030))
font = pygame.font.Font(None, 36)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
score_rect = score_text.get_rect(topleft=(10, 10))
pygame.draw.rect(screen, (0, 255, 0), (
score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score
screen.blit(score_text, score_rect.topleft)
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()