Translations/Project X
Konstantin Dronov on AI in Project X, excerpt from Inferno #2 [1]
Some words about AI
Artificial intelligence is an important part of a game, be it a typical action game or nerdy strategy, and its design haven't changed highly since 80's. The cause is that it's very hard to do. For example, make a monster turn a corner, that seems simple. But what's a corner? How to describe it? How to describe an enemy for a monster? Regular way that is called "artificial intelligence" will take too much time to do. You should write an enormous subroutine in which you understand all the actions. I can't even imagine everything needed for this, because humans evolutioned for tens thousands, maybe hundreds thousands years. How you can repeat this in a few days? However, the nature itself suggests the way - from simple to complex. An alternative to artificial intelligence is developed now actively - artificial life (AL). What life, you will ask? Here it is, its approach:
1. Instead of writing a cumbersome routine, we write several little routines, each of them to accomplish just one task. Enumerate them, for example:
- 0 - NOP, no command
- 1 - MOVE, move forward
- 2 - STEP LEFT, one step to the left
- 3 - STEP RIGHT, one step to the right
- 4 - TURN LEFT, turn left 90 degrees
- 5 - TURN RIGHT, turn right 90 degrees
etc.
2. Write a routine, an interpreter, that will interpret codes under a pointer and move the pointer in memory. Interpreting a code is calling a subroutine for that specific code. The routine must contain variables to exchange data between subroutines. This is a programming language, in fact.
3. That's all !!!
Не правда ли просто? Но все гениальное
просто! Что бы задать поведение монстров в PROJECT X мне потребовалось всего 15 таких команд и всего один регистр (один байт памяти !). Конечно поведение мон- стров там очень простое, но даже на этих 15 командах возможно моделирование пове- дения достаточно сложного .
Вот эти команды :
00 RANGE - находиться ли игрок в зоне
видимости. Выдает: 0-да / 1-нет (в игре применялось для проверки монстр в преде- лах экрана или нет)
01 MOVE - двинуться вперед на шаг
02 TURN LEFT - повернуть налево на
определенный угол
03 TURN RIGHT - повернуть направо
04 SEARCH - проверить есть ли впереди
преграда. Выдает : 0-да / 1-нет
05 SEARCH LEFT - то же слева
06 SEARCH RIGHT - то же справа
07 FIRE - стрелять (в игре не использо-
валось)
08 HALT - указывает интерпритатору, что
он должен закончить свою работу на этот раз и передать управление основной прог- рамме
09 VERIFY L - проверить находиться ли
игрок слева или справа от монстра . Вы- дает : 0-да / 1-нет
10 VERIFY F - то же, но спереди или
сзади
11 TYPE - проверяет, если игрок и
монстр на одной линии по ходу движения, где находиться игрок. Выдает : 0-спереди / 1-сзади
12 JUMPIF 0 adress - проверяет содержи-
мое регистра. Если он 0, то перейти на адрес adress
13 JUMPIF 1 adress - то же, но для 1
14 JUMP adress - безусловный переход
Все !!!
Для примера программа в этих кодах :
тот самый adress ┌────────────────── │ 01 SEARCH 02 JUMPIF 1 4 03 TURN LEFT 04 VERIFY L 05 JUMPIF 0 9 06 VERIFY F 07 JUMPIF 0 15 08 JUMP 19 09 TYPE 10 JUMPIF 0 13 11 TURN RIGHT 12 JUMP 19 13 TURN LEFT 14 JUMP 1 15 TYPE 16 JUMPIF 0 19 17 TURN LEFT 18 TURN LEFT 19 MOVE 20 HALT 21 JUMP 1
Это только тестовая программа и на
практике она не применима из-за того, что выход из нее совершиться один раз по HALT в строке 20. Для нормальной работы перед каждым JUMP или JUMPIF нужно пос- тавить HALT .
Вобщем, подумайте какие команды вам
понадобятся и дополните список. Можно даже написать самообучающихся монстров для этого надо лишь добавить возможность записи новых команд самой программой монстра.