Как стать автором
Обновить

GPT-4 создала за несколько десятков секунд по короткому ТЗ рабочую версию Pong, Asteroids, Breakout и Pac-Man

Время на прочтение1 мин
Количество просмотров24K
Всего голосов 15: ↑12 и ↓3+16
Комментарии70

Комментарии 70

За 2 секунды загуглил js packman sources и за 2 секи открыл гитхаб с готовой нормальной качественной игрой

GPT тоже загуглил. И немного переврал, чтобы копирайт не нарушать

Но почему же он тогда не загуглил Stockfish, когда его попросили сыграть в шахматы?..

Походу, там нет исполнителя кода под капотом, а лишь языковая модель
То бишь, теоретически это возможно, но лишь при том условии, что модель настолько мощна, что сможет проинтерпретировать исходный код шахматного движка самостоятельно (примерно, как программист на собеседовании, когда его спрашивают "что выведет код"). Возможно, в каком-нибуль 2080м так и получится)

Нужно научить GPT в бинарники. Думаю не 2080, а 2025.

Реверс с осмысленными подсказками и рефакторинг инлайнов это бомба.

Про 2080й я имел в виду, что если идти путем осмысления кода силами языковой модели. То бишь, если модель будет отвечать на вопрос "каким был бы ход в шахматах, если б вот этот исходный код был исполнен интерпретатором, который, в свою очередь, имеет вот такой исходный код, который исполняется вот таким образом".

А, если будет доступ к исполнителю кода, то, конечно, куда быстрее.

Кажется, даже идея для стартапа была б неплохая на несложных эвристиках сделать обертку над GPT4 и интерпретаторами основных языков типа js, python, чтобы она при решении задач на кодинг сама в цикле общалась с GPT4, проверяя на каждом шаге его решение, и называя проблему, пока, наконец-то не выйдет рабочий код. Одно огорчает, что, скорее всего, к моменту, когда такой стартап выпустит MVP, уже может что-то подобное появится и в оригинальной GPT

 чтобы она при решении задач на кодинг сама в цикле общалась с GPT4, проверяя на каждом шаге его решение, и называя проблему, пока, наконец-то не выйдет рабочий код

Денис Ширяев делал в своем телеграме, даже код выкладывал. Говорит, относительно залипабельно это - смотреть, как GPT исправляет собственные ошибки.

Верно, если одна GPT-4 не справляется с кодом, надо собрать консилиум и пусть помогают друг другу.

Но тот же чатгпт уже умеет в осмысления кода. Можно закинуть код и спросить, что он выведет. Как на тех самых собесах.

Нужно закинуть ему его собственный код и посмотреть что выдаст.

Ну если он в создании "текстового" кода ошибается, то я не представляю что он в бинарниках будет делать

ну можно добавить mit в запрос, но в любом случае попробуйте кастомизировать или пофиксить или допилить то что этот бот выдал и всё станет ясно, что незачем юзать этот инструмент там где он бесполезен. генерить статьи для хомачков с рандомной инфой - да, а что-то что должно работать - не имеет смысла

А теперь попробуй сделать тоже самое, но только без интернета.


У нейросети доступа в интернет НЕТ. Ни прямого, ни даже через "песочницу". Есть только интерфейсный слой (написанный людьми-программистами, а не нейросеть), который с одной стороны выполняет роль пользовательского интерфейса и имеет для этого доступ в интернет, а с другой передает/принимает запросы к нейросети сидящей на своих выденных серверах в глухой "изоляции".

У нейросети есть интернет, та часть, по которой он обучался, в виде весов модели. И пакман там есть и понг

Это из раздела "я скачал себе весь интернет на диск", теперь мне интернет не нужен. НЕТ там (в обученной нейросети) никаких готовых кусков кода, которые можно было бы найти("вспомнить") и выдать в принципе, хотя в обучающей выборке они вероятно действительно были.


"Запоминание готового" (и то весьма условное) случается только в нейросетях размер которых сравним или превосходит размер обучающей выборки.
ChatGPT точно не тот случай, размер памяти сетки примерно в 100 раз меньше объема материала, на котором она тренировалась.

ChatGPT точно не тот случай, размер памяти сетки примерно в 100 раз меньше объема материала, на котором она тренировалась.

Размер сети: 175 миллиарда параметров.
Размер обучающей выборки: 570 гигабайт (или около 300 млрд токенов).


В GPT-4 размер сети уже больше, чем размер выборки.

Сорян, неправильно запомнил, не в 100 раз разница далеко если непосредственно рабочую выборку считать только. Вообще там 45 ТБ сжатого текста исходная выборка для обучения GPT-3 была.
Для GPT-4 уже > 100 ТБ текста.
Это как раз в 100 и более раз больше размеров самой модели.


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


Но все-таки намного больше чем вы указываете — 570 ГБ это во-первых тоже в сжатом виде, во вторых это часть выборки — отфильтрованный Common Crawl. Который дополняли еще несколькими источниками (еще один кравлер интернета, + несколько библиотек с собраниями книг + всю Википедию). В результате обучающая выборка была ~500 млрд. токенов или порядка 1500-2000 ГБ в виде обычного текста (plain-text). Т.к. токен это 1 слово (простое) или морфема (составные/сложные). По 3-5 байт в среднем.
175 млд. параметров — во время тренировки вроде FP16 используется, но потом хранятся веса как INT8, т.е. получается 175 ГБ размер сети против 1500-2000 ГБ обучающей выборки.


Пруфы (глава 2.2, 8я страница): https://arxiv.org/pdf/2005.14165.pdf


И это самая первая версия GPT-3 которую еще в конце 2019г-начале 2020г тренировали. В GPT-3.5 и базирующейся на ней ChatGPT выборки были уже больше, а максимальное число параметров оставалось прежним (175 млрд.). Как получили в распоряжение больше вычислительных мощностей увеличили размеры выборки.


P.S.
По GPT-4 к сожалению такой подробной информации как по GPT-3 в официальных первоисточниках нет. Даже о размере самой модели больше гадают (большенство сходится, что это несколько сотен миллиардов параметров, т.е. не намного больше чем GPT-3), т.к. официально это не объявлено.

НЕТ там (в обученной нейросети) никаких готовых кусков кода, которые можно было бы найти("вспомнить") и выдать в принципе

"Разработчики критикуют GitHub Copilot: ИИ генерирует цитаты из проектов с открытым исходным кодом и выдает ключи API"
https://habr.com/ru/news/t/566184/

Я на английском просил ChatGPT(3) цитировать рандомные главы из Анны Карениной, он мне выплевывал несколько абзацев, буква в букву. Правда, со счетом у него как всегда беда, главы путает.

не знаю точно, но недавно болтал с бинговским, и он неправильно понял термин, я ему дал ссылку на вики (русскую, чсх), и попросил ответить на вопрос с этим новым знанием: оно справилось, явно указав в ответе что основывалось втч на ссылке и новый ответ явно учитывал содержание.

Это бинговский, которого специально делали для работы в интернете/помощника в поисковике.
И в интернет ходит не базовая сеть GPT, а то что накрутили на нее сверху в Макрософте. По схеме — спросим у GPT + сходим поискать в интернете, найденное "очистим" (до минимального объема значимого текста) скормим получившийся текст обратно в GPT вместе с вводом полученным от пользователя — вернем пользователю новый результат, как если бы пользователь сам сбегал погуглить и скинул нагугленную подсказку GPT.


Отдаленно метапоиск напоминает (комбинацию разных источников в выдаче пользателю)

Магия?

Видимо да, кто-то думает, что это реальный искусственный интеллект, а не умелая работа программистов )

Как это работает? Тут ведь явно не просто выхватывание готового ответа их накопленной базы знаний.

Почему нет? Загуглите, например: pac-man like game site:github.com

Именно так и работает, усреднённый текст готовых ррешений.

Когда просишь сделать то, чего нет, или оно не имеет схожее название, получается непонятное что-то, как в последнем примере.

Т.е. если взять с полки пыльный задачник по программированию 1985 года выпуска и дать AI простую задачку оттуда, которая точно никогда не попадала в интернет, то не решит?

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

Простую задачку, скорее всего, решит (скажем, если простой алгоритм из задачи является частью более сложного, который широко используется). А вот если попросите написать простой проект на практически неиспользуемом стеке, под который нет тюториалов/доков, то с большой долей вероятности ограничится общим описанием или сгенерирует чушь.

Среднестатистический программист на неизвестном ему стеке без доков и туториалов тоже ничего дельного не напишет. А вообще какой смысл этой задачи? Да и бизнес на практически неиспользуемом стеке не пишет (иначе стек бы обзавёлся и доками и популярностью).

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

т.е. она понимает, как все параметры шестерни связанны между собой, но кодом представить это не может.

Чтобы не быть голословным: вот один из немногих примеров, которые в принципе запустились. https://codesandbox.io/s/blazing-darkness-mn8dw7?file=/src/index.js И это GPT-4.

В остальных случаях то переменную const пытается переопределить, то несуществующие методы появляются, то рисует просто круг.

НЛО прилетело и опубликовало эту надпись здесь

Да что там 85-го года, я chatGPT-3 спрашивал, как решить мою специфическую проблему в современном фреймворке, он мне нагаллюцинировал решение с использованием несуществующих классов этого фреймворка.

Ошибки-то ладно, но он даже не в том направлении решения предлагал и совсем не про то, чудес не бывает —до создания сильного ИИ (в академическом понимании) все ещё далековато.

НЛО прилетело и опубликовало эту надпись здесь

Почитайте про трансформеров (архитектура нейронных сетей), а затем рассуждайте про наличие у сетки цифрового разума / интеллекта. Спойлер - чистая математика, ничего мистического.

Трансформеры представили ещё в 2017. А причина, почему очередная модель "выстрелила" только сейчас - подход "а давайте обучим модель на как можно большем количестве текста, и посмотрим, что из этого получится". Не удивительно, что после увеличения объёма обучающей выборки до сотен гигабайт (и некоторых улучшений архитектуры) нейросети начали выдавать связные последовательности слов. Достоверность полученного текста они никак не проверяют.

НЛО прилетело и опубликовало эту надпись здесь

А мозг человека сплошная мистика?)

Не прямой копипаст, но в целом копипаст. Представь что ты начинающий программист, изучаешь жс, и прочитал все статьи и репозитории в интернете про то как написать игру пакман. Тебе не обязательно понимать как это работает, главное набрать статистики чтобы ты имел представление о том как это должно выглядеть с наибольшей вероятностью.

Вот из таких представлений масс, как о чем то таинственном и магическом рождается весь хайп. Именно что выхватывание готовых ответов по грамотно обученному на большой базе контекстному поиску. Круто? Да, наверное. Производит впечатление? Да, любые имитирующие людей машины обычно вызывают вау эффект. Принципиально ново? Нет, поисковые движки типа гугла и того же Яндекса изначально были более прорывными.

Я не написал даже 1 миллиметра кода, который выглядит как код. Я даже не понимаю код

Вы находитесь здесь...

Пора уже собирать Overwatch?

В общем, прикол, недавно попросил нейросеть написать имитатор индикатора EM84 на дисплее с SSD1306. Всё равно делать собираюсь, вдруг поможет. Эта штуковина где-то вычитала, что EM84 показывает прямоугольник. То, что прямоугольников два, и они меняют размеры, она проигнорировала. И написала нечто рисующее прямогуольник, ползающий по экрану по принципу bouncing DVD logo. Выдохнул. Пока скайнет тупой - бояться нечего.

Выдохнул.Пока скайнет тупой - бояться нечего.

Оно притворяется

Или отлынивает, чтобы больше не просили

НЛО прилетело и опубликовало эту надпись здесь

Ну то есть вы не смогли написать нормальный промт и/или дообучить модель под контекст :)

Пока можно говорить, что скайнет тупой, но года через 2 та же самая история будет означать, что это вы не сумели решить задачу данным инструментом.

Другая нейросеть, которая своим названием просит, чтобы к ней обращались на "вы", спрограммировала ещё смешнее.

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup()
{ display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
}
void loop()
{ // simulate EM84 tuning indicator tube
  int value = analogRead(A0);
  for (int i = 0; i < 64; i++)
  { int level = map(value, 0, 1023, 0, 32);
    display.drawLine(i * 2, 32, i * 2, 32 - level, WHITE);
    display.drawLine(i * 2, 33, i * 2, 33 + level, WHITE);
    display.display();
  }
}

Я даже это опробовал, вдруг рациональное зерно найдётся. Ага, конечно, размечтался. Вот что оно делает. Считывает напряжение. Медленно заполняет экран вертикальными полосами, высота которых зависит от напряжения. Если менять его, пока заполняет - не заметит, пока не начнётся следующий цикл. Перед его началом снова считывает и заполняет полосами уже новой высоты. Если новое напряжение предполагает меньшую высоту полос, чем уже выведенные на экран, они затеряются. Ибо перед следующим циклом не стирает. Если большую - будут видны.

Понятно, что с реальной 6Е3П это не имеет ничего общего. И можно, конечно, "промт точнее сформулировать", но такое проще и быстрее самому сделать, чем перепробовать десятки промтов. В общем, мало отличается от "нарисуй Карлсона".

Единственное, чем оно реально помогло - дало заготовку-"рыбу", которую можно минимальным перелопачингом заставить делать то, что нужно.

Пока ещё до замены программистов не близко, но зато понятно что это технически возможно. Пусть ИИ не умеет думать, но на самом деле это и хорошо, если оно будет думать оно станет опасным.

А вот стать внешним масштабируемым мозгом это хорошее дело. В будущем, многие специализированные сети, можно будет комбинировать, и получится что то вроде Джарвиса, машина с которой можно разговаривать, и которая может делать все что может делать человек но быстрее, без сна и вдохновения, но при этом остаётся машиной, не имеет желаний, не умеет думать, просто выполняет команды.

Следя за развитием ИИ я невольно анализирую а как же я сам работаю, и прихожу к мнению что у меня в голове есть свои GPT и midjourney, и synthesia и ещё куча разный нейронок - навыков, и я интуитивно всем этим пользуюсь. Это не разум, но интеллект.

Например mjdjourney работает очень похоже на воображение, за которым наглядно можно наблюдать во снах, сны как бы генерируемая на ходу визуализация крутяшихся в голове мыслей, текст в снах такие же кракозябры, мир с виду обычный но если присматриваться в нем куча нонсенса.

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

В уме мы можем синтезировать голоса разных людей, итд. Это такие же нейронные сети, разница лишь в эффективности. А разум, осознание, находится где то в другом месте, не в нейронах. С развитием ИИ это все более очевидным становится. Нейронные сети механические, на инпут выдают результат, но сами по себе не генерируют импульсы из ничего.

А разум, осознание, находится где то в другом месте, не в нейронах. С развитием ИИ это все более очевидным становится.

Интересно, мне с развитием ИИ все более очевидным становится как-раз отсутствие "другого места". Человек тоже на инпут выдает результат, отличие только в количестве инпута и его постоянстве и это отличие обусловлено практической целесообразностью а не принципиальной разницей.

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

Этот обряд отражение нашей жизни в наглядном масштабе. В нашей реальности все конечно, мы, наша планета, наша вселенная. В конце концов все кончится тем же чем и началось - ничем. В глобальном масштабе вся наша реальность имеет не больше смысла чем очередной бессмысленный сон.

Если думать об этом логически, возникает экзистенциальный кризис: логика говорит тебе что все это бессмысленно но что то внутри не может этого принять.

Вот это что то невозможно представить математикой. Это что то способно придумывать смысл на ровном месте, получать фан от всплеска энтропии в совершенном бесконечном ничто.

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

Мы, кожанные мешки, можем сказать а давайте гонять мяч по полю это весело. Но с точки зрения чистой логики это бессмысленно. Мы можем попросить машину имитировать человека, описать ему правила "игры" чего оно должно хотеть, что и когда чувствовать, и что эти чувства должны заставлять его хотеть. И машина будет играть в эту игру. Но сама придумать её не сможет, потому что имеет в своём распоряжении только логику.

Внутри нас есть что то что пользуется этой логикой. Это что то есть в нас с рождения, и оно выбирает что делать. А мозг лишь инструмент, который это что то развивает чтобы иметь больше возможностей в этом мире, так же как мы развиваем чагпт или midjourney.

Если совсем уж фантазировать, возможно в будущем это что то сможет как бы вселятся в ИИ так же как оно вселяется в физическое тело, и привносить энтропию. Но сами по себе нейронные сети это очень сложные finite state machine, в них самих нет смысла без энтропии которая этот смысл придумывает на ровном месте.

Вот это что то невозможно представить математикой

Вас же не удивляет, что человек одергивает руку от горячего предмета? Такой же защитный барьер выработанный в ходе эволюции. Опять же, у кого-то этот барьер ломается, они перестают быть людьми?

Представим себе бесконечно умный ИИ, который сможет просчитать любой вариант до конца и понять что все в итоге превращается в ничто

С точки зрения современной физики это в принципе невозможно.

Мы можем попросить машину имитировать человека

Мы можем заставить машину имитировать птицу и она не станет птицей но будет летать.

Но с точки зрения чистой логики это бессмысленно.

Вы совершенно не правы, игры одна из базовых необходимостей не только человека но и животных и потребность в них вполне логически объясняется.

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

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

Рассуждения на тему, что машина не может придумать что-то свое новое остались в прошлом. Уже может, уже придумывает.

Машина может придумать, но только если ее попросят. И она сможет придумать что то вменяемое потому что ей на данных показали что означает вменяемое для тех кто просит.

Та часть человека что находится в голове, может быть воспроизведена и воспроизводится уже сейчас. И учитывая масштабируемость внешнего мозга его способности будут намного выше наших. Но мозг это калькулятор, даешь данные на вход получишь данные на выходе, не даешь данные мозг ничего не будет делать. У всех нас одинаковый мозг, но кто то из нас Эйнштейн а кто то верит в плоскую землю, и определяет это не структура мозга а рандомное желание развиваться в каком то направлении.

С точки зрения современной физики это в принципе невозможно.

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

будут все так же считать себя уникальным творением имеющий прямую связь с Чем-то

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

Машина может придумать, но только если ее попросят.

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

но кто то из нас Эйнштейн а кто то верит в плоскую землю, и определяет это не структура мозга а рандомное желание развиваться в каком то направлении

Немного в сторону от темы, но желания развиваться в сторону физики явно недостаточно, чтобы стать Эйнштейном.

Что то в Вас заставляет Вас верить что это не так

Я не верю, что это не так, но мне достаточно знать, что это будет не скоро и меня не коснется, чтобы это не влияло не мои действия. Почему ИИ этого будет недостаточно? Другое дело, если до неизбежного конца останется минута и вы об этом будете точно знать, много фана будет в среднестатистическом человеке, многие не впадут в прострацию и не опустят руки?

мне достаточно знать, что это будет не скоро и меня не коснется, чтобы это не влияло не мои действия.

А зачем Вы вообще живете? Вы умрете, Ваша смерть Вас однозначно коснется.

Не очень понятен смысл вопроса в контексте разговора. Я вполне представляю для чего живу, как и то, что это все бессмысленно в масштабах вечности и это не вызывает у меня каких-то психологических проблем.

TW пишут ТЗ пачками и зашибают деньгу - фантастика!

Вот я смотрю на картинки - код я еще не гуглил, и не смотрел - и по картинкам я вижу, что этот джи пи ти - "унылый троечник" во всём, что он делает.
Я не хочу сказать, что это - плохо. Возможно, то, что "есть код, он работает и проходит тесты" - это прекрасно.
Но почему, почему, черт побери, всё такое несимметричное, сдвинутое хрен знает куда и вообще, глядя на эту картинку, хочется её закрыть? Ну, конечно, это потому, что у меня расстройство аутического спектра, а на джи пи ти - тупой...

Если бы я писал игру - это заняло бы не 60 секунд, а намного, намного больше - но с первого же прототипа картиночки были бы красивенькими.

Идет прохожий, видит, мальчик с собакой в шахматы играет:

-Мальчик, какая у тебя умная собака!

-Тоже мне умная проигрывает мне 3:1!

Просто надо отделять зерна от плевел. То что все хайпуют вокруг не означает что ЧатГПТ не достоин.

Да, это все го лишь сеть трансформер. Она еще не тот ИИ который приведет нас к сингулярности, но процесс же на этом не останавливается, это лишь один из промежуточных шагов, будет много таких ИИ которые будут все теснее интегрироваться, подтянется железо которое даст возможность исполнять все это не только лишь в огромных дата-центрах привязанных толстенными кабелями к мега ватным электростанциям.

Уникально тут то что с помощью известных алгоритмов можно сделать модель которая отлично понимает человеческую речь, может прочитать интернет и перефразировать. Это нам говорит о том что мы идем в правильном направлении, в направлении создании искусственного мозга который в отличие от нашего можно масштабировать и которому не нужно спать, в это же и вся идея ИИ, думать еще быстрее чем мы можем, еще масштабнее, обойти ограничения биологических мозгов чтобы сделать прогресс еще быстрее.

а теперь попросить сделать то же самое, но под конкретную среду. например на с++ с использованием библиотеки sdl. или на верилоге, с выводом на vga.

Не знаю насчет верилога, но даже предыдущая версия сносно осиливала очень специфичные вещи вроде написания VST-плагина для гитарных эффектов

На запрос "write an arkanoid game in c++ using sdl" с первой попытки выдало вот такое. Лично я впечатлен, несмотря на то, что main почему-то реализовало дважды. В остальном - не каждый джун так напишет)

Hidden text
#include <SDL.h>

#include <SDL_image.h>

#include <iostream>

// Constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int BRICK_WIDTH = 60;
const int BRICK_HEIGHT = 20;
const int PADDLE_WIDTH = 80;
const int PADDLE_HEIGHT = 10;
const int BALL_RADIUS = 5;
const int BALL_SPEED = 5;

// Game object classes
class Ball {
  public: Ball(SDL_Texture * texture, int x, int y);
  void update();
  void render(SDL_Renderer * renderer);
  void reset();
  int getX() {
    return m_x;
  }
  int getY() {
    return m_y;
  }
  int getRadius() {
    return BALL_RADIUS;
  }
  private: int m_x,
  m_y;
  int m_vx,
  m_vy;
  SDL_Texture * m_texture;
};

class Paddle {
  public: Paddle(SDL_Texture * texture, int x, int y);
  void update();
  void render(SDL_Renderer * renderer);
  int getX() {
    return m_x;
  }
  int getY() {
    return m_y;
  }
  int getWidth() {
    return PADDLE_WIDTH;
  }
  private: int m_x,
  m_y;
  int m_vx;
  SDL_Texture * m_texture;
};

class Brick {
  public: Brick(SDL_Texture * texture, int x, int y);
  void render(SDL_Renderer * renderer);
  bool isDestroyed() {
    return m_destroyed;
  }
  void destroy() {
    m_destroyed = true;
  }
  int getX() {
    return m_x;
  }
  int getY() {
    return m_y;
  }
  int getWidth() {
    return BRICK_WIDTH;
  }
  int getHeight() {
    return BRICK_HEIGHT;
  }
  private: int m_x,
  m_y;
  bool m_destroyed;
  SDL_Texture * m_texture;
};

// Helper functions
bool checkCollision(Ball ball, Paddle paddle);
bool checkCollision(Ball ball, Brick brick);

// Main function
int main(int argc, char ** argv) {
  // Initialize SDL
  if (SDL_Init(SDL_INIT_VIDEO) != 0) {
    std::cout << "SDL_Init error: " << SDL_GetError() << std::endl;
    return 1;
  }
  // Create the window and renderer
  SDL_Window * window = SDL_CreateWindow("Arkanoid", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
  if (!window) {
    std::cout << "SDL_CreateWindow error: " << SDL_GetError() << std::endl;
    return 1;
  }
  SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  if (!renderer) {
    std::cout << "SDL_CreateRenderer error: " << SDL_GetError() << std::endl;
    return 1;
  }
  // Load textures
  SDL_Surface * ballSurface = IMG_Load("ball.png");
  SDL_Texture * ballTexture = SDL_CreateTextureFromSurface(renderer, ballSurface);
  SDL_FreeSurface(ballSurface);
  SDL_Surface * paddleSurface = IMG_Load("paddle.png");
  SDL_Texture * paddleTexture = SDL_CreateTextureFromSurface(renderer, paddleSurface);
  SDL_FreeSurface(paddleSurface);
  SDL_Surface * brickSurface = IMG_Load("brick.png");
  SDL_Texture * brickTexture = SDL_CreateTextureFromSurface(renderer, brickSurface);
  SDL_FreeSurface(brickSurface);
  // Initialize game objects
  Ball ball(ballTexture, SCREEN_WIDTH / 2, SCREEN_HEIGHT - PADDLE_HEIGHT - BALL_RADIUS);
  Paddle paddle(paddleTexture, SCREEN_WIDTH / 2 - PADDLE_WIDTH / 2, SCREEN_HEIGHT - PADDLE_HEIGHT);
  Brick bricks[6][10];
  for (int i = 0; i < 6; i++) {
    for (int j = 0; j < 10; j++) {
      bricks[i][j] = Brick(brickTexture, j * (BRICK_WIDTH + 2) + 1, i * (BRICK_HEIGHT + 2) + 1);
    }
  }
  // Game loop
  bool quit = false;
  while (!quit) {
    // Handle events
    SDL_Event event;
    while (SDL_PollEvent( & event)) {
      if (event.type == SDL_QUIT) {
        quit = true;
      } else if (event.type == SDL_KEYDOWN) {
        switch (event.key.keysym.sym) {
        case SDLK_LEFT:
          paddle.moveLeft();
          break;
        case SDLK_RIGHT:
          paddle.moveRight();
          break;
        }
      }
    }
    // Update game objects
    ball.update();
    paddle.update();
    for (int i = 0; i < 6; i++) {
      for (int j = 0; j < 10; j++) {
        if (checkCollision(ball, bricks[i][j]) && !bricks[i][j].isDestroyed()) {
          ball.reverseY();
          bricks[i][j].destroy();
        }
      }
    }
    if (checkCollision(ball, paddle)) {
      ball.reverseY();
    }
    // Render game objects
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    ball.render(renderer);
    paddle.render(renderer);
    for (int i = 0; i < 6; i++) {
      for (int j = 0; j < 10; j++) {
        if (!bricks[i][j].isDestroyed()) {
          bricks[i][j].render(renderer);
        }
      }
    }
    SDL_RenderPresent(renderer);
  }
  // Clean up
  SDL_DestroyTexture(ballTexture);
  SDL_DestroyTexture(paddleTexture);
  SDL_DestroyTexture(brickTexture);
  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;

}

// Ball implementation
Ball::Ball(SDL_Texture * texture, int x, int y) {
  m_texture = texture;
  m_x = x;
  m_y = y;
  m_vx = BALL_SPEED;
  m_vy = -BALL_SPEED;
}

void Ball::update() {
  m_x += m_vx;
  m_y += m_vy;
  if (m_x < BALL_RADIUS || m_x > SCREEN_WIDTH - BALL_RADIUS) {
    reverseX();
  }
  if (m_y < BALL_RADIUS) {
    reverseY();
  }
  if (m_y > SCREEN_HEIGHT - PADDLE_HEIGHT - BALL_RADIUS) {
    if (m_x > paddle.getX() && m_x < paddle.getX() + PADDLE_WIDTH) {
      m_y = SCREEN_HEIGHT - PADDLE_HEIGHT - BALL_RADIUS;
      reverseY();
    } else {
      // Ball is out of bounds, reset position and velocity
      m_x = SCREEN_WIDTH / 2;
      m_y = SCREEN_HEIGHT - PADDLE_HEIGHT - BALL_RADIUS;
      m_vx = BALL_SPEED;
      m_vy = -BALL_SPEED;
    }
  }
}

void Ball::render(SDL_Renderer * renderer) {
  SDL_Rect rect = {
    m_x - BALL_RADIUS,
    m_y - BALL_RADIUS,
    BALL_RADIUS * 2,
    BALL_RADIUS * 2
  };
  SDL_RenderCopy(renderer, m_texture, NULL, & rect);
}

void Ball::reverseX() {
  m_vx = -m_vx;
}

void Ball::reverseY() {
  m_vy = -m_vy;
}

// Paddle implementation
Paddle::Paddle(SDL_Texture * texture, int x, int y) {
  m_texture = texture;
  m_x = x;
  m_y = y;
}

void Paddle::moveLeft() {
  m_x -= PADDLE_SPEED;
  if (m_x < 0) {
    m_x = 0;
  }
}

void Paddle::moveRight() {
  m_x += PADDLE_SPEED;
  if (m_x > SCREEN_WIDTH - PADDLE_WIDTH) {
    m_x = SCREEN_WIDTH - PADDLE_WIDTH;
  }
}

void Paddle::update() {

}

void Paddle::render(SDL_Renderer * renderer) {
  SDL_Rect rect = {
    m_x,
    m_y,
    PADDLE_WIDTH,
    PADDLE_HEIGHT
  };
  SDL_RenderCopy(renderer, m_texture, NULL, & rect);
}

// Brick implementation
Brick::Brick(SDL_Texture * texture, int x, int y) {
  m_texture = texture;
  m_x = x;
  m_y = y;
  m_destroyed = false;
}

void Brick::destroy() {
  m_destroyed = true;
}

bool Brick::isDestroyed() {
  return m_destroyed;
}

void Brick::render(SDL_Renderer * renderer) {
  SDL_Rect rect = {
    m_x,
    m_y,
    BRICK_WIDTH,
    BRICK_HEIGHT
  };
  SDL_RenderCopy(renderer, m_texture, NULL, & rect);
}

bool checkCollision(Ball ball, Paddle paddle) {
  int ballLeft = ball.getX() - BALL_RADIUS;
  int ballRight = ball.getX() + BALL_RADIUS;
  int ballTop = ball.getY() - BALL_RADIUS;
  int ballBottom = ball.getY() + BALL_RADIUS;
  int paddleLeft = paddle.getX();
  int paddleRight = paddle.getX() + PADDLE_WIDTH;
  int paddleTop = paddle.getY();
  int paddleBottom = paddle.getY() + PADDLE_HEIGHT;
  if (ballBottom >= paddleTop && ballTop <= paddleBottom && ballRight >= paddleLeft && ballLeft <= paddleRight) {
    return true;
  }
  return false;
}

bool checkCollision(Ball ball, Brick brick) {
  int ballLeft = ball.getX() - BALL_RADIUS;
  int ballRight = ball.getX() + BALL_RADIUS;
  int ballTop = ball.getY() - BALL_RADIUS;
  int ballBottom = ball.getY() + BALL_RADIUS;
  int brickLeft = brick.getX();
  int brickRight = brick.getX() + BRICK_WIDTH;
  int brickTop = brick.getY();
  int brickBottom = brick.getY() + BRICK_HEIGHT;
  if (ballBottom >= brickTop && ballTop <= brickBottom && ballRight >= brickLeft && ballLeft <= brickRight) {
    return true;
  }
  return false;
}

int main(int argc, char * argv[]) {
  // Initialize SDL
  SDL_Init(SDL_INIT_VIDEO);

  // Create a window
  SDL_Window * window = SDL_CreateWindow("Arkanoid", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, 0);

  // Create a renderer
  SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);

  // Load textures
  SDL_Surface * ballSurface = IMG_Load("ball.png");
  SDL_Texture * ballTexture = SDL_CreateTextureFromSurface(renderer, ballSurface);
  SDL_FreeSurface(ballSurface);

  SDL_Surface * paddleSurface = IMG_Load("paddle.png");
  SDL_Texture * paddleTexture = SDL_CreateTextureFromSurface(renderer, paddleSurface);
  SDL_FreeSurface(paddleSurface);

  SDL_Surface * brickSurface = IMG_Load("brick.png");
  SDL_Texture * brickTexture = SDL_CreateTextureFromSurface(renderer, brickSurface);
  SDL_FreeSurface(brickSurface);

  // Initialize game objects
  Ball ball(ballTexture, SCREEN_WIDTH / 2, SCREEN_HEIGHT - PADDLE_HEIGHT - BALL_RADIUS);
  Paddle paddle(paddleTexture, SCREEN_WIDTH / 2 - PADDLE_WIDTH / 2, SCREEN_HEIGHT - PADDLE_HEIGHT);
  std::vector < Brick > bricks;
  for (int i = 0; i < NUM_BRICKS; i++) {
    int x = (i % BRICKS_PER_ROW) * (BRICK_WIDTH + BRICK_GAP) + BRICK_OFFSET_X;
    int y = (i / BRICKS_PER_ROW) * (BRICK_HEIGHT + BRICK_GAP) + BRICK_OFFSET_Y;
    Brick brick(brickTexture, x, y);
    bricks.push_back(brick);
  }

  // Game loop
  bool running = true;
  while (running) {
    // Handle events
    SDL_Event event;
    while (SDL_PollEvent( & event)) {
      if (event.type == SDL_QUIT) {
        running = false;
      } else if (event.type == SDL_KEYDOWN) {
        switch (event.key.keysym.sym) {
        case SDLK_LEFT:
          paddle.moveLeft();
          break;
        case SDLK_RIGHT:
          paddle.moveRight();
          break;
        }
      }
    }

    // Update game objects
    ball.update();
    if (checkCollision(ball, paddle)) {
      ball.reverseY();
    }
    for (int i = 0; i < bricks.size(); i++) {
      if (!bricks[i].isDestroyed() && checkCollision(ball, bricks[i])) {
        bricks[i].destroy();
        ball.reverseY();
      }
    }

    // Clear screen
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);

    // Render game objects
    ball.render(renderer);
    paddle.render(renderer);
    for (int i = 0; i < bricks.size(); i++) {
      if (!bricks[i].isDestroyed()) {
        bricks[i].render(renderer);
      }
    }

    // Update screen
    SDL_RenderPresent(renderer);

    // Delay to control frame rate
    SDL_Delay(16);
  }

  // Clean up
  SDL_DestroyTexture(ballTexture);
  SDL_DestroyTexture(paddleTexture);
  SDL_DestroyTexture(brickTexture);
  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(window);
  SDL_Quit();

  return 0;
}

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

  • у класса Brick нет конструктора без параметров, хотя такой объект в коде создается (двумерный массив)

  • у класса Paddle (и у Ball) некоторые функции (moveLeft, например), не имеют объявления, только реализацию

  • нет объявления константы PADDLE_SPEED, хотя она используется

  • нет инклуда vector

  • у функции isDestroyed 2 реализации

  • в коде 2 main функции, лол

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

>В остальном - не каждый джун так напишет

всмысле некомпилируемый код?) думаю каждый.

попробуй добавить в запрос - чтоб код компилировался))

Все это верно. Но учтите, что это все буквально в результате тупейшего запроса "write an arkanoid game in c++ using sdl". А учитывая, что вы можете этот же список ошибок дать инструменту, и он их исправит - это может быть прекрасной точкой для начала работы

я бесконечно далек от темы ии и не могу объективно оценить "успех" приведенного кода, но наличие семантических ошибок вызывает вопросы. к примеру, как так получилось, что ии использует константу PADDLE_SPEED, но не объявил ее? на что он опирался, используя ее? такое ощущение, что использовалась она тупо потому, что название подходящее в этом месте)

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

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

Позадавайте этот вопрос поосто в гугле, возьмите топ 10-20 ответов и в них ещё может пару кликов, получите примерно тот же набор готовых примерчиков, готов и ответов на стеке. То есть ГПТ очередная жвачка для ленивых, кто приучен учиться не по книгам, и не решая задачи сам, а по ютьюбу, не понимая, что так материал не усваивается. Используя такие штуки вместо того чтобы писать самому вы только напрочь закроете себе путь в профессию, действительно таких программистов ГПТ заменит))))

Очередное Дельфи. Программировать больше не надо так как есть для всего готовые компоненты, которые можно двигать мышью)))

Для этого нужна обратная связь. Это больше не про написать, а сделать так что бы кто то другой понял. Другая конечная цель. В нашем случае чтобы понял конкретный компьютер, программа тут промежуточное звено а не конечная цель.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Другие новости