game
codeunknown
python
a year ago
8.6 kB
4
Indexable
import time import pygame import random import math import pyautogui # Inicjalizacja Pygame pygame.init() # Ustawienia rozmiarow plansz screen_width = pygame.display.Info().current_w screen_height = pygame.display.Info().current_h board_width = screen_height + (screen_width-screen_height)/3*2 # Szerokość planszy gry info_board_width = screen_width - board_width # Szerokość planszy informacyjnej flags = pygame.NOFRAME | pygame.HWSURFACE | pygame.DOUBLEBUF gameplay_screen = pygame.display.set_mode(size=(screen_width, screen_height), flags=flags, depth=32, display=0, vsync=1) pygame.display.set_caption("Simple game in Python") clock = pygame.time.Clock() dt = 0 running = True white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) # Utwórz powierzchnie planszy gry game_board = pygame.Surface((board_width, screen_height)) # Utwórz powierzchnie planszy informacyjnej info_board = pygame.Surface((info_board_width, screen_height)) displayed_board_size = game_board.get_size() class Player(pygame.sprite.Sprite): def __init__(self, x=(screen_width-20)/2, y=(screen_height-20)/2): super().__init__() self.radius = 20 # Promień koła self.image = pygame.Surface((self.radius * 2, self.radius * 2), pygame.SRCALPHA) pygame.draw.circle(self.image, (255, 255, 255), (self.radius, self.radius), self.radius) self.rect = self.image.get_rect() self.rect.center = (x, y) self.health = 100 self.damage = 50 self.speed = 20 self.range = 300 self.cost = 100 self.points = 0 self.bullets = pygame.sprite.Group() # Grupa pocisków self.reload_speed = 20 # Prędkość ładowania self.reloaded = 100 # Inicjalizuj gotowość do strzału na 100% def update(self): player_colour = math.floor((100-self.health)/100*255) pygame.draw.circle(self.image, (player_colour, player_colour, player_colour), (self.radius, self.radius), self.radius) if self.reloaded >= 100: # Wystrzel pocisk bullet = Bullet(self.rect.centerx, self.rect.centery, pyautogui.position(), self.range) self.bullets.add(bullet) self.reloaded = 0 # Aktualizuj czas ładowania self.reloaded += self.reload_speed # Aktualizuj pociski self.bullets.update() #Tworzenie pocisku class Bullet(pygame.sprite.Sprite): def __init__(self, x, y, target, range): super().__init__() self.x = x self.y = y self.range = range self.image = pygame.Surface((5, 5)) self.image.fill(black) self.rect = self.image.get_rect() self.rect.center = (x, y) self.speed = 4 self.dx = target[0] - self.rect.centerx self.dy = target[1] - self.rect.centery def update(self): distance = math.sqrt((self.x - self.rect.centerx) ** 2 + (self.y - self.rect.centery) ** 2) if distance > self.range: self.kill() distance_ = math.sqrt(self.dx ** 2 + self.dy ** 2) if distance_ != 0: self.dx /= distance_ self.dy /= distance_ self.rect.x += self.dx * self.speed self.rect.y += self.dy * self.speed # Tworzenie przeciwników class Enemy(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((20, 20)) self.image.fill(red) self.rect = self.image.get_rect() self.rect.center = (x, y) self.health = 100 self.speed = 3 self.damage = 10 # Grupa przeciwników enemies = pygame.sprite.Group() # Tworzenie przeciwników def create_enemies(): for _ in range(5): x = random.randint(0, displayed_board_size[0]) y = random.randint(0, displayed_board_size[1]) # Krawędzie obszaru left_edge = (0, y) right_edge = (displayed_board_size[0], y) top_edge = (x, 0) bottom_edge = (x, displayed_board_size[1]) # Oblicz odległości od punktu (x, y) do każdej z krawędzi distances = { 'left_edge': math.dist((x, y), left_edge), 'right_edge': math.dist((x, y), right_edge), 'top_edge': math.dist((x, y), top_edge), 'bottom_edge': math.dist((x, y), bottom_edge) } # Znajdź krawędź o najmniejszej odległości closest_edge = min(distances, key=distances.get) if closest_edge == 'left_edge': x_closest = 0 y_closest = y elif closest_edge == 'right_edge': x_closest = board_width y_closest = y elif closest_edge == 'top_edge': x_closest = x y_closest = 0 else: # Jeśli najbliższą krawędzią jest 'bottom_edge' x_closest = x y_closest = screen_height enemy = Enemy(x_closest, y_closest) enemies.add(enemy) def draw_text(surface, text, x, y, font_size, font_color): font = pygame.font.Font(None, font_size) # Tworzenie obiektu czcionki text_obj = font.render(text, True, font_color) # Tworzenie obiektu tekstu text_rect = text_obj.get_rect() text_rect.topleft = (x, y) # Ustawienie pozycji tekstu surface.blit(text_obj, text_rect) # Narysuj tekst na powierzchni player = Player() # Główna pętla gry while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # Pobierz stan klawiszy keys = pygame.key.get_pressed() if keys[pygame.K_ESCAPE]: running = False if keys[pygame.K_w]: player.rect.y -= player.speed * dt * 10 if player.rect.y < 0: player.rect.y = 0 if keys[pygame.K_s]: player.rect.y += player.speed * dt * 10 if player.rect.y > displayed_board_size[1] - 2 * player.radius: player.rect.y = displayed_board_size[1] - 2 * player.radius if keys[pygame.K_a]: player.rect.x -= player.speed * dt * 10 if player.rect.x < 0: player.rect.x = 0 if keys[pygame.K_d]: player.rect.x += player.speed * dt * 10 if player.rect.x > displayed_board_size[0] - 2 * player.radius: player.rect.x = displayed_board_size[0] - 2 * player.radius # fill the screen with a color to wipe away anything from last frame gameplay_screen.fill(white) # Rysuj planszę gry na lewej stronie gameplay_screen.blit(game_board, (0, 0)) # Rysuj planszę informacyjną na prawej stronie gameplay_screen.blit(info_board, (board_width, 0)) game_board.fill(white) info_board.fill(white) # Narysuj linię oddzielającą planszę gry od planszy informacyjnej pygame.draw.line(info_board, black, (0, 0), (0, screen_height), 2) # Ruch przeciwników for enemy in enemies: dx = player.rect.x - enemy.rect.x dy = player.rect.y - enemy.rect.y distance = math.sqrt(dx ** 2 + dy ** 2) if distance != 0: dx /= distance dy /= distance enemy.rect.y += enemy.speed * dy enemy.rect.x += enemy.speed * dx player.bullets.update() player.bullets.draw(game_board) hits = pygame.sprite.groupcollide(player.bullets, enemies, True, False) for bullet, enemy_list in hits.items(): for enemy in enemy_list: enemy.health -= player.damage if enemy.health <= 0: player.points +=10 enemies.remove(enemy) hits = pygame.sprite.spritecollide(player, enemies, True) for enemy in hits: player.health -= enemy.damage enemies.remove(enemy) player.points -= 50 if player.health <= 0: running = False # Tworzenie nowych przeciwników if random.randint(1, 100) < 2: create_enemies() # Aktualizacja player.update() game_board.blit(player.image, player.rect.topleft) player_position_text = f'x = {player.rect.x}, y = {player.rect.y}\npoints: {player.points}' draw_text(info_board, player_position_text, 10, 10, 24, black) # Aktualizacja i rysowanie przeciwników enemies.update() enemies.draw(game_board) pygame.display.update() dt = clock.tick(60) / 1000 draw_text(gameplay_screen, 'u have lost', 100, 100, 48, black) pygame.display.update() time.sleep(5) pygame.quit()
Editor is loading...