Гонки от нейросети Qwen
Попросил нейросеть написать игру "Гонки" с максимально реалистичными машинками вид сверху, результат насмешил.
Вот код игры для запуска через Pydroid 3 с комментариями от нейросети.
import pygame
import random
import sys
# Инициализация Pygame
pygame.init()
# Автоопределение размера экрана
info = pygame.display.Info()
SCREEN_WIDTH = info.current_w
SCREEN_HEIGHT = info.current_h
# Создание экрана
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Гонка")
# Цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (220, 30, 30)
GREEN = (30, 180, 30)
BLUE = (30, 100, 220)
YELLOW = (255, 220, 0)
GRAY = (100, 100, 100)
DARK_GRAY = (50, 50, 50)
LIGHT_BLUE = (170, 220, 255)
ORANGE = (255, 140, 0)
# Часы для управления FPS
clock = pygame.time.Clock()
FPS = 60
# Функция для рисования машины игрока (реалистичные пропорции)
def draw_player_car(x, y, width, height):
# Основной корпус автомобиля (горизонтальный прямоугольник)
pygame.draw.rect(screen, GREEN, (x, y, width, height))
# Крыша (меньше по размеру)
pygame.draw.rect(screen, LIGHT_BLUE, (x + width//6, y - 8, width * 2//3, 12))
# Капот
pygame.draw.rect(screen, (20, 150, 20), (x, y, width, height//4))
# Фары спереди
pygame.draw.circle(screen, YELLOW, (x + 8, y + height//2), 6)
pygame.draw.circle(screen, YELLOW, (x + width - 8, y + height//2), 6)
# Задние фары
pygame.draw.circle(screen, RED, (x + 8, y + height//4), 5)
pygame.draw.circle(screen, RED, (x + width - 8, y + height//4), 5)
# Колеса
pygame.draw.rect(screen, BLACK, (x + width//6, y - 3, 12, 6))
pygame.draw.rect(screen, BLACK, (x + width - width//6 - 12, y - 3, 12, 6))
pygame.draw.rect(screen, BLACK, (x + width//6, y + height - 3, 12, 6))
pygame.draw.rect(screen, BLACK, (x + width - width//6 - 12, y + height - 3, 12, 6))
# Функция для рисования машины противника
def draw_enemy_car(x, y, width, height):
# Основной корпус автомобиля
pygame.draw.rect(screen, RED, (x, y, width, height))
# Крыша
pygame.draw.rect(screen, (150, 0, 0), (x + width//6, y - 8, width * 2//3, 12))
# Капот
pygame.draw.rect(screen, (180, 20, 20), (x, y, width, height//4))
# Фары спереди
pygame.draw.circle(screen, YELLOW, (x + 8, y + height//2), 6)
pygame.draw.circle(screen, YELLOW, (x + width - 8, y + height//2), 6)
# Задние фары
pygame.draw.circle(screen, ORANGE, (x + 8, y + height//4), 5)
pygame.draw.circle(screen, ORANGE, (x + width - 8, y + height//4), 5)
# Колеса
pygame.draw.rect(screen, BLACK, (x + width//6, y - 3, 12, 6))
pygame.draw.rect(screen, BLACK, (x + width - width//6 - 12, y - 3, 12, 6))
pygame.draw.rect(screen, BLACK, (x + width//6, y + height - 3, 12, 6))
pygame.draw.rect(screen, BLACK, (x + width - width//6 - 12, y + height - 3, 12, 6))
# Класс игрока (машина)
class Player:
def __init__(self):
self.width = SCREEN_WIDTH // 10
self.height = SCREEN_HEIGHT // 12
# Позиционируем машину игрока в середине экрана
self.x = SCREEN_WIDTH // 2 - self.width // 2
self.y = SCREEN_HEIGHT // 2 # Середина экрана
self.speed = SCREEN_WIDTH // 80
self.road_width = SCREEN_WIDTH // 2
self.road_x = SCREEN_WIDTH // 4
def draw(self):
draw_player_car(self.x, self.y, self.width, self.height)
def move_left(self):
# Ограничиваем движение дорогой
if self.x > self.road_x + 5:
self.x -= self.speed
def move_right(self):
# Ограничиваем движение дорогой
if self.x < self.road_x + self.road_width - self.width - 5:
self.x += self.speed
def get_rect(self):
return pygame.Rect(self.x + 5, self.y + 2, self.width - 10, self.height - 4)
# Класс препятствия
class Obstacle:
def __init__(self):
self.width = SCREEN_WIDTH // 10
self.height = SCREEN_HEIGHT // 12
# Спавним только на дороге
road_width = SCREEN_WIDTH // 2
road_x = SCREEN_WIDTH // 4
self.x = random.randint(road_x + 10, road_x + road_width - self.width - 10)
self.y = -self.height
self.speed = SCREEN_HEIGHT // 120 + random.randint(0, 3)
def draw(self):
draw_enemy_car(self.x, self.y, self.width, self.height)
def move(self):
self.y += self.speed
def is_off_screen(self):
return self.y > SCREEN_HEIGHT
def get_rect(self):
return pygame.Rect(self.x + 5, self.y + 2, self.width - 10, self.height - 4)
# Класс дороги
class Road:
def __init__(self):
self.road_width = SCREEN_WIDTH // 2
self.road_x = SCREEN_WIDTH // 4
self.line_width = 10
self.line_height = SCREEN_HEIGHT // 15
self.line_speed = SCREEN_HEIGHT // 80
self.lines = []
# Инициализируем линии разметки
for i in range(25):
self.lines.append([self.road_x + self.road_width // 2 - self.line_width // 2,
i * (self.line_height + SCREEN_HEIGHT // 18)])
def draw(self):
# Рисуем дорогу
pygame.draw.rect(screen, DARK_GRAY, (self.road_x, 0, self.road_width, SCREEN_HEIGHT))
# Рисуем края дороги
pygame.draw.rect(screen, WHITE, (self.road_x - 2, 0, 2, SCREEN_HEIGHT))
pygame.draw.rect(screen, WHITE, (self.road_x + self.road_width, 0, 2, SCREEN_HEIGHT))
# Рисуем разметку
for line in self.lines:
pygame.draw.rect(screen, YELLOW, (line[0], line[1], self.line_width, self.line_height))
def move(self):
# Двигаем линии разметки
for line in self.lines:
line[1] += self.line_speed
# Если линия ушла за экран, возвращаем её наверх
if line[1] > SCREEN_HEIGHT:
line[1] = -self.line_height
# Класс кнопки
class Button:
def __init__(self, x, y, width, height, text, color=GREEN):
self.rect = pygame.Rect(x, y, width, height)
self.text = text
self.color = color
self.font = pygame.font.Font(None, 36)
def draw(self):
pygame.draw.rect(screen, self.color, self.rect)
pygame.draw.rect(screen, BLACK, self.rect, 2)
text_surf = self.font.render(self.text, True, BLACK)
text_rect = text_surf.get_rect(center=self.rect.center)
screen.blit(text_surf, text_rect)
def is_clicked(self, pos):
return self.rect.collidepoint(pos)
# Основная функция игры
def main():
player = Player()
road = Road()
obstacles = []
score = 0
game_over = False
game_started = False
# Таймер для создания препятствий
obstacle_timer = 0
obstacle_frequency = 100 # каждые 100 кадров
font_large = pygame.font.Font(None, 48)
font_medium = pygame.font.Font(None, 36)
font_small = pygame.font.Font(None, 28)
# Кнопки
start_button = Button(SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT//2, 200, 60, "Начать игру")
restart_button = Button(SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT//2 + 50, 200, 60, "Играть снова")
quit_button = Button(SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT//2 + 120, 200, 60, "Выйти")
while True:
mouse_pos = pygame.mouse.get_pos()
mouse_clicked = False
# Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
mouse_clicked = True
# Очистка экрана
screen.fill((80, 180, 80)) # Зеленый фон (трава)
if not game_started:
# Экран приветствия
title_text = font_large.render("ГОНКИ", True, WHITE)
screen.blit(title_text, (SCREEN_WIDTH//2 - title_text.get_width()//2, SCREEN_HEIGHT//4))
instruction_text = font_medium.render("Касайтесь левой/правой части экрана", True, WHITE)
screen.blit(instruction_text, (SCREEN_WIDTH//2 - instruction_text.get_width()//2, SCREEN_HEIGHT//3))
# Демонстрационная машина
draw_player_car(SCREEN_WIDTH//2 - 60, SCREEN_HEIGHT//2.5, 120, 40)
start_button.draw()
quit_button.draw()
if mouse_clicked:
if start_button.is_clicked(mouse_pos):
game_started = True
elif quit_button.is_clicked(mouse_pos):
pygame.quit()
sys.exit()
elif game_over:
# Экран окончания игры
road.draw()
player.draw()
for obstacle in obstacles:
obstacle.draw()
overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT))
overlay.set_alpha(128)
overlay.fill(BLACK)
screen.blit(overlay, (0, 0))
game_over_text = font_large.render("ИГРА ОКОНЧЕНА!", True, RED)
screen.blit(game_over_text, (SCREEN_WIDTH//2 - game_over_text.get_width()//2, SCREEN_HEIGHT//4))
score_text = font_medium.render(f"Ваш счет: {score}", True, WHITE)
screen.blit(score_text, (SCREEN_WIDTH//2 - score_text.get_width()//2, SCREEN_HEIGHT//2.5))
restart_button.draw()
quit_button.draw()
if mouse_clicked:
if restart_button.is_clicked(mouse_pos):
return main() # Перезапуск игры
elif quit_button.is_clicked(mouse_pos):
pygame.quit()
sys.exit()
else:
# Игровой процесс
# Сенсорное управление
if pygame.mouse.get_pressed()[0]: # Левая кнопка мыши (или касание)
mouse_x, mouse_y = pygame.mouse.get_pos()
if mouse_x < SCREEN_WIDTH // 2:
player.move_left()
else:
player.move_right()
# Создание препятствий
obstacle_timer += 1
if obstacle_timer >= obstacle_frequency:
obstacles.append(Obstacle())
obstacle_timer = 0
# Увеличиваем частоту появления препятствий со временем
if obstacle_frequency > 40:
obstacle_frequency -= 0.3
# Движение объектов
road.move()
for obstacle in obstacles[:]:
obstacle.move()
# Удаление препятствий, ушедших за экран
if obstacle.is_off_screen():
obstacles.remove(obstacle)
score += 1
# Проверка столкновений
player_rect = player.get_rect()
for obstacle in obstacles:
if player_rect.colliderect(obstacle.get_rect()):
game_over = True
# Отрисовка игровых объектов
road.draw()
player.draw()
for obstacle in obstacles:
obstacle.draw()
# Отображение счета
score_text = font_medium.render(f"Счет: {score}", True, WHITE)
screen.blit(score_text, (20, 20))
# Отображение инструкции управления
control_text = font_small.render("← Лево / Право →", True, WHITE)
screen.blit(control_text, (SCREEN_WIDTH//2 - control_text.get_width()//2, SCREEN_HEIGHT - 40))
# Индикаторы управления
pygame.draw.rect(screen, (200, 200, 200, 100), (0, SCREEN_HEIGHT - 60, SCREEN_WIDTH//2, 30))
pygame.draw.rect(screen, (200, 200, 200, 100), (SCREEN_WIDTH//2, SCREEN_HEIGHT - 60, SCREEN_WIDTH//2, 30))
pygame.display.flip()
clock.tick(FPS)
# Запуск игры
if __name__ == "__main__":
try:
main()
except Exception as e:
print(f"Ошибка: {e}")
pygame.quit()
Видео
538 постов359 подписчиков
Правила сообщества
Работают общие правила Пикабу