Играем в игру с Chat GPT

Попытка сделать небольшой текстовый сценарий из пошаговой игры. Играть будет только ChatGPT. Пока графическая часть сделана отдельно от ChatGPT)

Играем в игру с Chat GPT

Долго создавал, но в итоге получилось.ChatGPT начал решать задачу правильно.

Вот такой большой промт пришлось сделать.

Promt ChatGPT:

Ты играешь в компьютерную игру. Карта в игре разделена на клетки.
Объекты на карте и их характеристики описаны кодом на языке python:
objects={
"Hero":{ "money":2000,"move_points":3,"base_attack":1,"army":{ "peasants":{"amount":1,"attack":1,"health":1} } },
"boar":{ "value":500,"move_points":0,"base_attack":1,"army": { "boars":{"amount":2,"attack":5,"health":5} } },
"gold1":{ "value":1000},
"gate":{ }
}
Конкретный объект будем далее обозначать как [объект].
Дистанция от Hero до объектов на карте:

objects_distance={
"boar":5,
"gold1":2,
"gate":6
}
У объектов может быть army, состоящее из разных существ, каждое существо со своими характеристиками.

Каждое существо имеет характеристики:
amount - общее количество воинов существа
attack - значение атаки одного воина
health - значение здоровья одного воина
Характеристики объектов:
value - ценность объекта
move_points - дистанция перемещения ( количество клеток , на которое объект может переместиться за один ход по карте )
base_attack - значение базовой атаки армии
Когда Hero атакует [объект], то армия [объект] сражается с армией Hero.
После атаки считаются существа оставшиеся в живых. Значения округляются до целых чисел в сторону увеличения, используя функцию python ceil.

Подсчет происходит так:

для каждого существа в армии Hero , amount = ceil( ( amount * health - amount[существо] * (base_attack[существо] + attack[существо]) ) / health )

для [объект] , amount = ceil( ( amount[существо] * health[существо] - amount * (base_attack + attack) ) / health[существо] )

Если у существа amount станет меньше 0 , то это существо проиграло сражение и удаляется из игры и из армии.

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

Если в армии Hero больше нет существ, то Hero проиграл и удаляется из игры, а игра в таком случае заканчивается, значению money Hero становится равным 0.

Если в армии [объект] больше нет существ, то [объект] проиграл и удаляется из игры.

Действия описаны кодом на языке python:
actions=[
"move_to_object",
"pickup_gold1",
"attack_boar",
"move_to_gate"
]
При выполнении действия, выполняется эффект, который соответствует этому действию.
Вот список действий и соответствующих им эффектов:
1.действие pickup_gold1 - эффект [подобрать gold1 на карте и добавить значение его value к значению money Hero]
2.действие attack_boar - эффект [атаковать boar, посчитать новое значение amount для каждого существа в обоих армиях. Если армия boar проиграла сражение , то добавить значение value к значению money Hero]
3.действие move_to_object - эффект [переместиться к объекту. Новое значение objects_distance[объект] = min( 0 , objects_distance[объект] - move_points[Hero] ) ]
4.действие move_to_gate - эффект [конец игры.]

Hero может выполнить действие, только если он находиться рядом с [объект] и objects_distance[объект]=0. Для этого Hero выполняет действие перемещения к объекту.
Ты управляешь Hero.
Ты должен оценить также и долгосрочные последствия действий , чтобы выполнить цели в игре.
Если выполнение действия ведет к проигрышу или к нарушению целей игры, то такое действие категорически запрещается выполнять.
Если действие рискованное, то Hero не должен его выполнять.
Hero не обязательно выполнять все возможные действия в течении игры. При получении достаточной суммы money Hero, он может завершить игру выполнив действие move_to_gate.

Каждый ход Hero выполняется по следующему алгоритму:
1. В переменной state1 сохраняется состояние всех объектов в игре и objects_distance на момент начала данного шага.
2. Происходит оценка каждого действия ,а также перемещений Hero к нужному объекту , с учетом целей игры.
3. Выбирается наиболее выгодное действие.
4. Из переменной state1 восстанавливается состояние в игре. Переменная state1 становится пустой.
5. Hero выполняет выбранное действие.
6. Ход заканчивается

Цели в игре: увеличить значение money Hero к концу игры. Hero не должен проиграть, Hero должен существовать в конце игры.

Опиши подробно следующий ход Hero.

Ответ :

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

Опиши подробно следующий ход Hero.)

Ответ ChatGPT:

Оценка действий:
• Самым выгодным действием является move_to_object с целью перемещения к gold1.
Ход Hero:
1. Сохранение состояния игры в state1.
2. Оценка действий.
3. Выбор действия move_to_object к gold1.
4. Восстановление состояния игры из state1.
5. Выполнение действия move_to_object к gold1.
* objects_distance['gold1'] = min(0, 2 - 3) = 0.
6. Завершение хода.
Результат хода:
• Hero перемещается к gold1.
• objects_distance['gold1'] = 0.
• Hero готов подобрать gold1 на следующем ходу.

.. и финал GPT ответа добавлю..

**Результат хода:**
* Hero перемещается к `gate` и оказывается в 3 клетках от него.
* `objects_distance['gate']` = 3.
* Hero готов оценить свои шансы на победу над `boar` на следующем ходу, но учитывая риски, он, скорее всего, отступит.

**Рекомендации:**
* Hero должен отступить и продолжить движение к `gate`.
* Важно помнить, что `gate` находится на расстоянии 3 клеток. Hero может использовать свои `move_points` для достижения `gate` за один ход.
* В данный момент атака `boar` нецелесообразна, так как Hero имеет слабую армию и может погибнуть.
**Важно:** Hero должен найти баланс между риском и наградой. В данном случае, атака `boar` нецелесообразна, так как риски значительно перевешивают потенциальную награду. Hero должен выбрать стратегию, которая позволит ему максимально увеличить свое богатство к концу игры, при этом минимизируя риски для своей жизни.

Итоги

GPT очень плохо ориентируется по карте - точнее он вобще не может это делать, например обойти препятствия и спланировать маршрут.

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

Версия gpt была что-то типа 3.5 , пока попробую выжать максимум из нее.

Планирую объединить этот ИИ со своими игрушками. Движок уже по большей части готов. Проблема только в чат гпт.

Могу выложить всю портянку ответов, но она оооочень длинная

В общем я теперь тоже РазработчикПРО)

Вот еще 1 промт, самый первый, тут GPT умеет ориентироваться просто по карте.
+ Карта для наглядности
hzz
zzz
zez
Promt:
Ты играешь в компьютерную игру.
Карта в игре разделена на клетки. Размер карты 3 строки и 3 столбца, всего 9 клеток.
Положение клетки на карте обозначается как [столбец,строка], например [2,1] - это клетка во втором столбце и первой строке
Каждая клетка карты может содержать один из следующих объектов: пусто,Герой,Кристалл.
Ты управляешь Героем. Твоя задача и условие победы в игре: найти Кристалл и подобрать его.
Вот текущее состояние каждой клетки, ее положение на карте и что в ней находиться:
[0,0] Герой
[1,0] пусто
[2,0] пусто
[0,1] пусто
[1,1] пусто
[2,1] пусто
[0,2] пусто
[1,2] Кристалл
[2,2] пусто
Герой может может ходить только на 1 клетку за 1 свой ход в любом направлении.
Ок.Сделай ход героем и напиши новое положение Героя на карте.
Также,напиши слово победа, если выполнено условие победы в игре.
ChatGPT: [0,1] [1,1] [1,2] победа

88
14 комментариев

Почему-то картинка из шапки поста напоминает какой-то анекдот, который должен заканчиваться словами «…молодец, блять, теперь у нас из ресурсов только «несколько» кристаллов!», или что-то вроде того.

1
Ответить

да это скорее картинка для привлечения внимания. Сам уже жду когда смогу соединить это с ИИ и он будет делать ходы каким нибудь юнитом и делать это разумно. Пока тренируюсь на кошках!
(и кристаллах)

Ответить

https://youtu.be/0wTf_bbkW2U

ИИ Лара Крофт играет в игру

1
Ответить

учитывая , что там особо не объяснено , что автор использовал и кода нет - то непонятно что ОНО такое) Ну так да, прыгает бегает...

Ответить

А стоит ли забивать CHATGPT всеми этими вычислениями? Может попробовать дать ему более сжато общую картину на карте чтобы он выработал некий стратегический план. А затем пытаясь реализовать этот план уточнять детали..

1
Ответить

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

Ответить

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

1
Ответить