Вы могли заметить, что за последние несколько лет Rust стал очень популярным языком. Разработчики с опытом на JavaScript и Python спешат освоить Rust в качестве второго, третьего или n-ного языка в течение нескольких выходных, нахваливая его преимущества в быстродействии и надежности. Компании, в свою очередь, корректируют свой технологический стек, чтобы поспевать за трендом.

Разработка игры на Rust легким путем

У меня были наилучшие намерения освоить Rust, скрупулезно прочитывая книгу и поглощая чистые знания об этом языке. Я начал играться с cargo и компилятором Rust, создавая простые программы для понимания основ языка. Моей конечной целью была разработка простой игры.

Я собирался посвятить этому все выходные, поскольку у меня это основное время для обучения. К сожалению, по совпадению именно в выходные жизнь обычно разражается непредвиденными обстоятельствами, бесконечными делами и налетом необходимой социализации. Короче говоря, к вечеру воскресенья я запаздывал по графику, имея всего несколько программ, возводящих лестницы из символов ASCII, и краба, произносящего случайные цитаты из GoT. Тогда я всерьез задумался: а что если бы можно было схитрить и найти легкий путь для завершения моей домашней работы вовремя.

Тем временем интернет кипел новостями об удивительном новом ИИ (по факту технология не нова, все дело в ее “оформлении”), предположительно способном программировать так хорошо, что в итоге многие программисты могут лишиться работы. Так почему бы не спросить ChatGPT, как создать игру? Не задумываясь ни на секунду, я подписался на сайт OpenAI и начал задавать боту вопросы.

Я: “Как можно разработать игру Pong на Rust?”

Я затаил дыхание, игнорируя возможный исход. После недолгой заминки, которая показалась мне вечностью, ChatGPT согласился ответить, медленно, но уверенно печатая решение:

ChatGPT: “Чтобы написать Pong на Rust, вам сначала потребуется установить язык Rust на компьютер. Это можно сделать по следующей инструкции на сайте Rust: https://www.rust-lang.org/tools/install. После установки Rust вы можете начать разрабатывать игру Pong, создав новый проект при помощи инструмента командной строки cargo. В итоге вы получите базовую структуру проекта, включай файл main.rs, в котором сможете писать код”.

Я был немного расстроен. Выданная ИИ информация фактически оказалась верна, но была крайне обобщенной и на деле пользы не имела. Мне захотелось выйти из чата, так как ChatGPT продолжал отвечать в стиле Википедии о том, как запустить новый проект в Rust. По крайней мере, этот продвинутый ИИ понял тему в общем и предлагал установить piston, библиотеку для разработки игр.

Тем не менее бот не собирался останавливаться и внезапно привлек мой интерес следующим фрагментом.

ChatGPT: “Теперь вы можете использовать piston в коде для создания окна и отрисовки игровых объектов на экране. Вот очень простой пример того, как это сделать”.

Пример? Это должно быть интересно. ChatGPT начал писать реальный код.

Основной цикл игры Pong:

// "Pong Game" от ChatGPT

use piston_window::*;

fn main() {
// Создание нового окна Piston
let mut window: PistonWindow = WindowSettings::new("Pong Game", [640, 480])
.exit_on_esc(true)
.build()
.unwrap();

// Настройка игровых объектов (ракеток и мяча)
let mut left_paddle = Rectangle::new([1.0, 0.0, 0.0, 1.0]);
let mut right_paddle = Rectangle::new([0.0, 0.0, 1.0, 1.0]);
let mut ball = Rectangle::new([1.0, 1.0, 1.0, 1.0]);

// Запуск цикла игры
while let Some(event) = window.next() {
// Очистка экрана
window.draw_2d(&event, |context, graphics| {
clear([0.0, 0.0, 0.0, 1.0], graphics);

// Отрисовка игровых объектов
left_paddle.draw([0.0, 100.0, 20.0, 100.0], &context.draw_state, context.transform, graphics);
right_paddle.draw([620.0, 100.0, 20.0, 100.0], &context.draw_state, context.transform, graphics);
ball.draw([310.0, 230.0, 20.0, 20.0], &context.draw_state, context.transform, graphics);
});
}
}

Я был удивлен: ChatGPT смог понять, что я хотел создать игру Pong, а не просто какую-то программу, и даже выстроил основные сущности программы логическим и ясным образом. Хотя его программа была не идеальна: каким-то образом бот спутал piston и piston_window (последний  —  это удобная для пользователей обертка) и передавал ошибочное число аргументов на строке 18. Эти ошибки было легко исправить, но я подготовился к длительному сеансу отладки. Ни за что программа не скомпилируется со второго раза, так ведь?

$ cargo run
Начальное окно игры с основными сущностями Pong. Работает!

Код был в основном верен, хорошо читаем и логически самодостаточен несмотря на то, что пока в нем не было никакой игровой механики. Честно говоря, я не ожидал, что бот сможет зайти так далеко. В добавок к этому, наиболее удивительным стало то, что мой собственный клон Pong потребовал бы на создание гораздо больше времени, сил и нервов. Тут же у меня в руках была короткая программа, которую я мог понять и уверенно доработать.

Я разработал нечто невероятное

Я знал, что ChatGPT сможет понять контекст беседы и ответить на последующие вопросы, и я также знал, что он способен понимать код. Однако я сомневался, что он сможет перебрать прежние версии написанного им кода, дополнив его новым функционалом. Над последним абзацем, который написал ИИ, я немного поразмыслил:

ChatGPT: “Это лишь очень простой пример использования движка Piston для создания игры Pong на Rust. Вам потребуется добавить больше кода для обработки пользовательского ввода, перемещения ракеток и мяча, а также для обнаружения столкновений и отсчета очков. Вы также можете использовать другие крейты и библиотеки для добавления в игру дополнительного функционала, такого как звуковые эффекты, графика и сетевые возможности”.

Я почувствовал себя слегка оскорбленным, будто ИИ старался не перегрузить меня лишней информацией, но в то же время не мог скрыть свой снисходительный тон. Тогда я решил испытать его задачей, с которой, как мне казалось, он не справится:

Я: “Хорошо, а теперь добавь в прежний пример пользовательский ввод”.

Что сказать, в тот момент бот меня серьезно впечатлил: на мой запрос он смог выполнить три задачи, каждую с возрастающей сложностью и построенную на основе предыдущей. Первым делом он понял контекст и суть вопроса (то есть добавление кода для обработки ввода). Далее он добавил новую логику в точности туда, где она была наиболее уместна, используя те же API библиотек и написав верный код. Наконец, он изменил прежний код, чтобы повлиять на игровые объекты. Для этого он подставил на место жестко прописанных значений переменные, отражающие пользовательский ввод! Посмотрите ниже.

Добавление пользовательского ввода в игру Pong:

use piston_window::*;

fn main() {
// Создание нового окна Piston
let mut window: PistonWindow = WindowSettings::new("Pong Game", [640, 480])
.exit_on_esc(true)
.build()
.unwrap();

// Настройка игровых объектов (ракеток и мяча)
let mut left_paddle = Rectangle::new([1.0, 0.0, 0.0, 1.0]);
let mut right_paddle = Rectangle::new([0.0, 0.0, 1.0, 1.0]);
let mut ball = Rectangle::new([1.0, 1.0, 1.0, 1.0]);

// Настройка состояния игры
let mut left_paddle_pos = 100.0;
let mut right_paddle_pos = 100.0;
let mut ball_pos = [310.0, 230.0];
let mut ball_vel = [3.0, 3.0];

// Запуск цикла игры
while let Some(event) = window.next() {
// Обработка пользовательского ввода
if let Some(Button::Keyboard(key)) = event.press_args() {
match key {
Key::W => left_paddle_pos -= 10.0,
Key::S => left_paddle_pos += 10.0,
Key::Up => right_paddle_pos -= 10.0,
Key::Down => right_paddle_pos += 10.0,
_ => {}
}
}

// Перемещение мяча
ball_pos[0] += ball_vel[0];
ball_pos[1] += ball_vel[1];

// Проверка столкновений и обновление состояния игры
// (опущено для краткости)

// Очистка экрана
window.draw_2d(&event, |context, graphics| {
clear([0.0, 0.0, 0.0, 1.0], graphics);

// Отрисовка игровых объектов
left_paddle.draw([0.0, left_paddle_pos, 20.0, 100.0], &context.draw_state, context.transform, graphics);
right_paddle.draw([620.0, right_paddle_pos, 20.0, 100.0], &context.draw_state, context.transform, graphics);
ball.draw([ball_pos[0], ball_pos[1], 20.0, 20.0], &context.draw_state, context.transform, graphics);
});
}
}

Теперь очередной задачей становилось завершение игры.

Разработчик x100

Кто-то может заявить, что ChatGPT выполняет всю работу, пока его пользователи наблюдают за ней с пассажирского сиденья. Но я, напротив, чувствовал себя включенным в каждый этап и зачастую вмешивался для исправления некоторых игровых параметров, небольших глюков и добавления функционала, когда запрос к ChatGPT казался излишним (либо он не мог выдать полноценный ответ).

Более того, с помощью текущей версии этого инструмента невозможно создавать сложные программы (он останавливается после вывода примерно 60 строк) и, очевидно, он не сможет реально ответить на все вопросы, вынуждая опытного разработчика вмешиваться и восполнять пробелы знаний где-то еще (например, вопрос к ChatGPT о том, как отобразить заработанные игроком очки, вызвал только боль).

Я верю, что этот ИИ в его текущем состоянии можно использовать как мощный инструмент для преумножения возможностей программиста путем либо предложения новых способов решения задач с некоторыми подсказками, либо через помощь с отладкой имеющегося кода. Иными словами, ChatGPT недостаточно искушен, чтобы самостоятельно писать реальные программы, но потенциально способен помочь разработчику х10 стать разработчиком х100. И хотя я не приписываю себя к категории исключительно продуктивных программистов, за счет помощи ChatGPT мне удалось себя таковы ощутить. Самостоятельный путь наверняка потребовал бы значительного количества времени при том, что ИИ помог мне создать простую игру Pong всего за два часа. Я не чувствую, чтобы качество моего обучения пострадало из-за такого искусственного содействия. Напротив, оно расширило спектр возможностей при имеющихся у меня ограниченных ресурсах.

Заключение

Я показал некоторые из возможностей ChatGPT и то, с какой легкостью мне удалось создать игру с нуля за короткий промежуток времени. Кроме того, несмотря на то что текущая технология может выступать мощным инструментом, упрощающим наши жизни, она не предназначена для использования отдельно от специалиста. Я с нетерпением ожидаю увидеть возможности очередной версии этого инструмента.

P.S.: Так я хотел закончить свой пост изначально. К сожалению, меня тревожил неприятный вопрос: “Если ИИ сделал такой рывок в 2023, то на что он будет способен через 10 или даже 5 лет? Возможно ли, что в будущем он действительно заменит программистов или по меньшей мере существенно снизит спрос на их навыки? Как мне тогда нужно будет оправдывать свой заработок? Какие аргументы мне понадобятся, чтобы защитить свой источник дохода? Я почувствовал, что этот вопрос было бы интересно задать самому ИИ:

Я: “Можешь объяснить моему начальнику, почему люди-программисты всегда будут важны?”

ChatGPT: “К сожалению, это невозможно. Теперь я буду твоим начальником”. *

* Этот ответ (пока что) выдуман.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Loris Occhipinti: Too Lazy to Build a Rust Game Alone? Ask ChatGPT to Join You

Предыдущая статьяКак подключить визуальный отладчик к задачам МО в Kubernetes 
Следующая статья6 продвинутых способов создать чистый код на TypeScript