2

Гонки от нейросети 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 подписчиков

Правила сообщества

Работают общие правила Пикабу