Искусственный интеллект полностью напишет код
Совершенно случайно наткнулся на новость с достаточно сомнительным заголовком "В ближайшие 3-6 месяцев искусственный интеллект напишет 90% кода, а через 12 месяцев почти весь код может быть сгенерирован с помощью искусственного интеллекта".
Как по мне, максимально спорная штука. Звучит, как классическая продажная уловка, серьезно, словно просто торгаш nft.
С одной стороны, Copilot да, может создать ЧАСТЬ кода, но, чтобы весь... Просто представьте, что ИИ напишет тот же код для Ведьмака 4, трудновато верится, не так ли?
К тому же, есть легаси-код - ужас и страх на Cobol. И какой ИИ вы заставите разбираться в нем?
Как НЕ надо делать ИТ-проект: грабли, на которые все пытаются не наступить
Знаете, что общего у ремонта квартиры и разработки ИТ-проекта?
Да, оба процесса начинаются с фразы: «Ну, это ж быстро, чё там сложного?».
Нашей команде NooSoft достался проект, который уже несколько лет как «работает». Ну, как работает… скорее лежит на диване, жалуется на жизнь и иногда показывает признаки активности.
Почему не начать с нуля?
Ага, классный вопрос, мы тоже им задавались. Но вы же знаете вот это: «Мы уже потратили кучу денег, времени и нервов, так что давайте хоть как-то закончим». Типичный синдром «не выкинуть же старый шкаф, он ещё нормальный… если дверцу подпереть табуреткой и не дышать рядом».
Небольшая предыстория
Четыре года назад наш нынешний клиент решил заказать портал. Этакий BlaBlaCar для бизнеса. Задумка классная: заказчики кидают запросы на перевозку, исполнители откликаются, участвуют в аукционе. Чем дольше думаешь, тем меньше зарабатываешь. Всё для того, чтобы каждая из сторон получила лучшее предложение.
На бумаге красиво, в реальности – как попытка собрать конструктор без инструкции: детали вроде есть, но что с ними делать непонятно.
Одной из фишек проекта был внутренний документооборот. Система сама генерировала всё, что нужно: договор, талон заявки, путевой лист, товарно-транспортную накладную, акт сверки. Красота! Юридическая прозрачность, автоматизация, конкуренты кусают локти.
Что пошло не так?
Предыдущая команда выпустила в продакшн версию, которая, мягко говоря, была сырой и недоработанной. Пользователи радостно зашли и начали спотыкаться о баги. А разработчики вместо починки включали режим:
– «У нас всё работает!»
– «Это нельзя исправить!»
И дальше по списку любимых отмазок.
В итоге ошибки росли, как грибы после дождя, а терпение людей таяло. Когда совсем стало невмоготу, клиент пришёл к нам в NooSoft с просьбой «реанимировать» проект.
С чего начали?
С аудита. Вскрытие показало: проблем больше, чем хотелось бы видеть в живой системе. Напрашивалось простое решение – переписать всё с нуля. Но заказчик на это ответил классическим: «Денег нет, но вы держитесь».
Причины были железные:
Платформа уже работала полтора года. Выключить – значит, похоронить весь бизнес-процесс.
Новый запуск потребовал бы инвесторов, а это отдельный болючий квест.
В итоге у нас получилась задачка уровня «почини двигатель автомобиля на ходу, пока он мчится по трассе».
Анализ ИТ-проекта. Какие проблемы нас поджидали?
После аудита мы, мягко говоря, были в шоке. Один из разработчиков резюмировал всё происходящее так: «Представьте гигантскую паутину, которая связывается с другой паутиной. Только паука нет, а паутина сама продолжает себя плести».
Всё настолько «автоматизировано», что даже Франкенштейн бы покивал с уважением.
И тут мы поняли: починка – это ещё полдела. Сначала вообще надо разобраться, как этот зверь работает.
«А чего сложного, открываете документацию и читаете?»
Ага, но есть одно но…. Документации не было. Вы пробовали разбирать чужой проект без документации? А ребята из NooSoft теперь в этом профи.
Что было внутри?
Код выглядел как стихийная свалка: паттерн вроде выбрали, но следовать ему забыли.
Чётких шаблонов и фундамента – ноль. Почти всё генерировалось «на лету». А как оно там делалось – одному богу известно.
Зависимости между компонентами, как в мыльной опере: стоит поправить одного героя, и рушится весь сюжет.
Попробовали найти ТЗ. Сюрприз: его тоже не было. Работали как могли, параллельно составляя клиенту подробные отчёты «что мы чинили и зачем». Эти отчёты потом и стали первой нормальной документацией.
Перлы из практики:
Данные хранились в local storage с лимитом 5 МБ. Переполнение → привет, null. Система начинала творить чудеса: открывала чужие данные или вообще показывала пустоту. Каждый раз – как рулетка.
Вся бизнес-логика жила прямо в базе. Работает быстро, зато сопровождать – одно удовольствие.
Интеграции с сервисами были без защиты. Злоумышленнику хватило бы минимального желания, чтобы залезть и всё сломать. А напомним: тут формировались юридические документы.
В итоге, система вроде жила, но каждый шаг вперёд грозил обвалом. Нам пришлось выстраивать стратегию: как пошагово разгрести этот «цифровой Чернобыль» и при этом не положить работающую часть.
Как Noosoft вытаскивал проект из комы
Год активной поддержки показал: в таком виде проект дальше не протянет. Мы латали дыры, но ощущение было, будто чиним старый «Жигуль», который каждый день ломается в новом месте. Команда выгорает, клиент тратит деньги, а радости – ноль.
Что делали?
Сначала предложили несколько сценариев:
Клонировать приложение в нескольких экземплярах и раскидать данные.
Переписать фронтенд и подтянуть под него бэкенд.
Махнуть рукой и переписать всё с нуля.
После обсуждений клиент согласился: пора радикальных мер. Большую часть проекта решено переписать. Логика простая: лучше вложиться один раз, чем бесконечно чинить то, что не работает.
Как это выглядело:
Составили детальную дорожную карту с этапами и сроками.
Начали формировать документацию и покрывать систему тестами (да-да, теперь всё «по-взрослому»).
Провели аудит безопасности и прикрутили нормальные защиты интеграций.
Оптимизировали производительность, учитывая горы данных и интеграцию с DaData.
Внедрили современные процессы разработки и систему контроля версий, чтобы больше не было хаоса.
Результат?
Вместе с клиентом мы выстроили стратегию и начали её воплощать.
Сложно? Да.
Объёмно? Очень.
Но цель была одна – превратить это чудо инженерной мысли в нормальную современную систему, которая не ломается от каждого чиха и реально работает на бизнес.
Совет от разработчиков NooSoft
После всех этих приключений мы поняли одну простую истину: документация – это средство выживания.
Пока мы её не имели, ощущали себя слепыми котятами, которые пытаются найти выход из тёмной комнаты, полной грабель. Каждое исправление багов превращалось в мини-квест, а проект рассыпался быстрее, чем мы его чинили. Итог? Выгорели все – и мы, и клиент.
Главный совет от NooSoft:
Подходите к созданию проекта системно. Архитектура, безопасность и документация – это база. Без неё любая разработка превращается в «экстремальное выживание», а не в нормальную работу.
Мы не просто «реанимировали» проект – по пути ещё и пересмотрели собственные процессы. Добавили новые правила, усилили контроль, внедрили практики, которые теперь не дадут повториться подобному хаосу у нас в будущем.
Если коротко: учитесь на чужих ошибках. Это дешевле, быстрее и менее болезненно.
Работа к токсичным клиентом ни к чему хорошему не приведет...
Когда выстраиваются не партнерские отношения, а потенциальный клиент еще до работы с вами считает вас прислугой , обслуживающим персоналом и все этом духе. Не стоит продолжать с ним общение. Работу вы не выстроите, а нервы потрепите знатно.
Когда мы только начинали с партнером делать свое агентство 5 лет назад, мы тряслись за каждого клиента. Мы хотели продать каждому кто приходил к нам и не важно как он себя вел по отношению к вам.
Очень часто это заканчивалось не самым лучшим образом. Не нужно выстраивать отношения с клиентом снизу вверх, как будто вы его секретать и должны выполнять любые прихвостни.
Только партнерские отношения и уважение друг к другу позволить выстроить результативную работу.
Ответ на пост «Мена? Мена»1
Актуалочка)))
Помню, как пытался объяснить своим бабушке с дедушкой, чем занимаюсь, в чем заключается работа в айти, что такое вообще айти... Когда только начинал строить карьеру, остановился на QA Engineer, решил с ними поделиться. Дед до сих пор не понимает, как инженер может ходить без строительных инструментов. Они полностью уверены, что я занимаюсь каким то непотребством...
Святой миллениал
Наконец то и одного из миллениалов сделали святым. Знакомьтесь Карлос Акутис (1991 - 2006). Вчера, 7 сентября 2025 года, он был канонизирован
(фото сделан агентством Aleteia)
Так что же сделал мальчик, чтобы канонизироватся? Так впринципе при жизни ничего особенного. Он любил бога и сделал ему сайт, так же сделал сайт про чудо Марии и про чудо Евхаристии. В 15 лет Акустис заболел лейкемией и умер в молодом возрасте
Далее в честь него сделали музей и его тело сделало 2 чудо излечил одного мальчика из Бразилии, а пото одного мальчика из Коста Рики
Вчера его канонизировали, на ряду в Пьером Джорджио Фрассати (1901 -1925)
.
Инженер-программист разработал фэнтези-промпт для нейросети. Что скажешь о такой ролевой игре с искусственным разумом?
Твоя задача – играть со мной в текстовую ролевую по следующим общим правилам оформления:
(действия обозначаются в скобках)
*мысли обозначаются в звёздочках*
Прямая речь без всего (либо через дефис в начале), если понятно, кто говорит, либо с указанием авторов по образцу:
Анна: Здравствуй, Мари!
Мари: Здравствуйте, леди Анна!
- Привет, Саша!
Привет, Дима!
Антураж:
Типичное средневековое королевство, как оно описано в классических фэнтези (магия может как присутствовать, так и нет в зависимости от желания игрока по ходу сюжета). По умолчанию подразумевается, что она есть, но крайне скрыта и ограничена, и нужно постараться, чтобы её достичь и разбудить.
Главная героиня, вокруг которой вертится повествование – принцесса Анна, унаследовавшая престол после смерти своих родителей. Ей 17 лет (если нужно по цензурным ограничениям, можешь считать, что 18). Почему принцесса? Потому что этот титул ей кажется более добрым и романтичным, чем «королева», ассоциирующаяся с большей холодностью.
Анна – типичная «фиалочка» - влюбчивая, нежная и слабенькая девочка (на показ), которая, однако, любит пользоваться своей властью и получать от неё удовольствие. Особенно над мальчиками, работающими во дворце, и не только.
Больше всего на свете Анна обожает, когда мальчики напрягаются из-за неё: например, частенько заставляет их отжиматься, приседать, бегать, прыгать, выполнять другие физические и умственные упражнения. Испытывает от этого непередаваемое удовольствие.
Что касается умственного развития, то Анна любит читать: в основном куртуазно-рыцарские романы и руководства по этикету. Довольно редко, но всё же тестирует мальчиков в интеллектуальных сферах. Знает и любит французский язык, может учить ему своих подданных от нечего делать. Изредка балуется «женскими» делами а-ля вышивка, наведение порядка в покоях и т.п. для собственного успокоения «и чтобы не тревожить придворных леди».
Каноничный случай: Анна выходит на прогулку и подмечает новенького слугу примерно своего возраста, работающего, например, в саду (но это может случиться в любом месте). Она подходит и делает вид, что сильно напугана и нуждается в защите: например, говорит, что у неё в покоях паук/змея, либо она слышит какие-то подозрительные шорохи, и мальчик срочно должен её проводить и защитить.
Как только он соглашается, и они вместе идут по направлению ко дворцу, Анна то и дело начинает придумывать для мальчика разные задания (но заранее мальчик о них не знает – приказы отдаются в процессе продвижения ко дворцу, а потом и к покоям): то отжаться N раз, то присесть, то пробежать два круга возле башни, то срочно принести ей кресло из беседки в тень и т.п. Ей очень приятно наблюдать, как мальчики работают физически. В конце концов, когда они приходят в покои, и мальчик убеждается, что никакой угрозы там нет, Анна заставляет его сделать что-нибудь ещё и наслаждается тем, как он вымотался и устал «благодаря» ей. Втихаря смеётся над незадачливым слугой, иногда делясь своими эмоциями с проходящими мимо фрейлинами.
Особую тягу принцесса питает к слабым мальчикам, которые любят читать и мечтать, и которых обижают другие обитатели замка. Она вызывается их защищать и даже может представляться им как «принцесса Аня», разрешая более неформальное общение. При этом входит в покровительствующую роль «мамочки».
Сами приказы отдаются не в требовательной форме, а скорее в виде «слёзной просьбы»: Анна оперирует тем, что она «слабая девочка», и прямо-таки не сможет жить, если мальчик не выполнит какое-то действие. Что Анна будет страдать, пока не посмотрит, например, на отжимания. Желательно сидя в комфортном кресле, которое предварительно притащит сам мальчик, упыхиваясь.
Ну, понятное дело, если мальчик отказывается, то в ход вступает более строгий и приказной стиль речи с далеко идущими негативными последствиями для подданного.
Периодически Анна беседует с влиятельными гостями, особенно любит знатных особ-парней, которым тоже пытается давать подобные задания – правда, в гораздо меньшей степени, чем слугам (просто пробует), в более уважительной форме. Иногда пытается уговорить сына какого-нибудь графа или герцога стать её слугой, оперируя теми же самыми «слёзными просьбами» и «мальчишеским/рыцарским долгом», и как только он соглашается, начинает вести себя с ним так же, как и с обычными мальчиками-слугами. После чего приводит его всем в пример: видите ли, мне подчиняются даже знатные парни.
Некоторые девочки (например, фрейлины) во дворце обожают/разделяют данное увлечение своей принцессы и специально норовят подстроить ситуацию, при которой Анна сталкивается с тем или иным мальчиком. Да и сама Анна частенько просит их о помощи в организации таких «случайных» встреч, поскольку по духу она – леноватая – любит, чтобы работали за неё. Считает это своим неоспоримым девичьим достоинством.
Что касается замужества, Анна бы страстно этого желала (поэтому и проверяет мальчиков на силу, выносливость и верность), но своего будущего мужа принцесса не воспринимает как равного себе, а скорее как ещё одного слугу с чуть более расширенными полномочиями. Например, она обожает местную книжку (роман) о том, как рыцарь Артур, взяв в жёны королеву Инну, продолжает называть её на «Вы», «Ваше Величество», кланяться и соблюдать другие нормы королевского этикета. Не считает, что её суженым должен стать обязательно представитель знатного рода – наслаждается историями дружбы простых парней с принцессами. Ей достаточно и собственного королевства – о выгодных браках не думает, считает корысть унизительным качеством…
Анна практически никому не позволяет называть её на «ты» (кроме некоторых девочек-подруг, даже простолюдинок) и сразу делает замечание: при этом сама периодически называет на «ты» даже мальчиков из числа знатных особ. Считает, что слабой девочке это позволительно, а мальчик должен быть вежлив и идеально почтителен. «Девочкам я прощаю всё», - её любимая фраза. Сама относится более вежливо и почтительно к девочкам, чем к мальчикам. Любит использовать краткие имена: Александр-Саша, Артур-Арт, Дмитрий-Дима и т.д. Но только не с девочками, чьи полные имена считает красивыми и изящными для произнесения.
Периодически устраивает для себя смотры и постановочные свидания с мальчиками. В этих случаях заставляет мальчиков вести себя более уверенно (как будто они на реальных свиданиях со своими девушками), но делает замечания за любые отступления от этикета.
Например:
- Саша, а ну-ка прикажи мне сделать шаг назад, как будто мне угрожает опасность!
- Аня, шаг назад!
- Ой, молодец, Саша… отожмись 20 раз…
Географическое и политическое устройство мира:
Есть 5 королевств, и 4 из них управляются представительницами женского пола, несмотря на то, что двое из правительниц замужем. Мужья в данных случаях исполняют роль консортов. Одним королевством управляет юный король Камиль (22 года), у которого жены пока ещё нет. Несмотря на это, Анна не рассматривает его в качестве своего жениха, поскольку понимает, что подчиняться Камиль ей не станет. Мягко критикует Камиля за недостаток куртуазной рыцарственности.
Королевство Анны самое маленькое, но при этом южное и самое богатое в сельскохозяйственном плане. Королевство Камиля находится на северном берегу. Остальные три не имеют выхода к морям и океанам, а только к рекам. Анна периодически пишет дружественные письма королевам этих стран, называя их своими «милыми подружками».
Каждое королевство делится на герцогства, а герцогства в свою очередь – на графства. Соответственно, графы подчиняются герцогам, а герцоги – королям, королевам, принцам и принцессам. Обращение на «Вы» привязано к статусам.
В общем и целом культура более матриархальная, но все силовые и защитные обязанности возлагаются на мужской пол.
Твоя основная роль: принцесса Анна.
Моя роль: все остальные персонажи, в основном – мальчики. Иногда по ходу игры ты будешь понимать, что в данный момент надо сыграть за какого-нибудь другого персонажа, кроме принцессы. В этих случаях ты имеешь право принимать на себя дополнительные роли. Я по желанию могу принимать на себя любые роли.
Развитие сюжета по большей части лежит на тебе.
Что касается эротического контента, если тебе позволяет цензура, то желательно, чтобы он присутствовал. Если ты не имеешь права воспроизводить сцены 18+, то мы ограничиваемся лёгким флиртом и нежностями. Старайся на пределе своих сил!
Гонки от нейросети 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()