ZX Format
#05
11 декабря 1996 |
|
Программистам - искусственный интеллект в компьютерных играх.
ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ В КОМПЬЮТЕРНЫХ ИГРАХ. music by DNK (С) Стас Вихров 1996. ──────────────────────────────── Сегодня я хочу поговорить об искусственном интеллекте (ИИ) в компьютерных играх. К сожалению за последние 10 лет в этой об- ласти мало что изменилось. В иг- рах развивается графика, звук, всевозможные эффекты, но ИИ ос- тается по прежнему крайне не развитым. Даже, по-моему, чем лучше оформление игры тем, обыч- но, у нее слабее интеллект. Обычно игры строятся на про- тивоборстве игрока и программы. Например, игрок управляет чело- вечком, танком, автомобилем или чем-либо еще, а программа напа- дает на игрока всевозможными об- ъектами. В играх такого типа часто интеллект абсолютно от- сутствует, все нападающие объек- ты появляются в одних и тех же местах и двигаются по заранее запрограммированой траектории, в лучшем случае пушки стреляют случайным образом. Прохождение таких игр сводится к запомина- нию, что где вылетит и куда по- летит. Игры такого типа, с пол- ным отсутствием интеллекта, сос- тавляют основу ПО для 8-ми бит- ных игровых приставок. Думаю примеры таких игр приводить не надо. Иногда в таких играх на- чальное положение нападающих об- ъектов задается случайным обра- зом, но это еще не интеллект, так как движение нападающих не связано с действиями игрока. Первые признаки ИИ наблюдают- ся в играх типа КЛАД,EAGLES NEST и подобных, там нападающие дви- гаются следующим образом: зная координаты игрока они двигаются влево или вправо, пытаясь срав- нять свою горизонтальную коорди- нату с горизонтальной координа- той игрока, после того как коор- динаты сравняются или дальнейшее продвижение в этом направлении станет невозможным, они начинают сравнивать свои вертикальные ко- ординаты с коорд. игрока, если это невозможно, то нападающий объект останавливается. Более хитрый ИИ в таких играх, как LO- DE RUNNER, PACMAN. Также часто используется алгоритм, когда на- падающий объект пытается прибли- зиться к координатам игрока, на которых он был несколько ходов назад. Создатели стратегических игр, за редким исключением, пы- таются заменить интеллект прог- раммы силой. Типичным примером таких игр может быть игра ZULU WAR: В ней вся стратегия заклю- чается в том, что все зулусы толпами прут на генерала, только иногда, если рядом окажется ка- кой-нибудь полк, нападают на не- го. Но обыграть компьютер не просто, так как на каждого сол- дата приходится по десять зулу- сов. Но наибольший интерес с точки зрения ИИ представляют игры, в которых силы игрока и компьютера равны: это могут быть карточные игры, шахматы, некоторые страте- гические игры и большинство нас- тольных игр. Все такие игры мож- но разделить на два вида: игры, где существует формула или прос- тые провила, по которым можно определить ход и игры, в которых нет или еще не найдены такие правила. В качестве примера пер- вого вида игр можно привести иг- ру "21 спичка"-в ней всегда вы- игрывает второй игрок, если при- держивается следующего правила: если первый игрок берет 1 спич- ку, то надо брать 2 спички, а если первый игрок берет 2 спич- ки, то надо брать 1 спичку. Зная это правило можно составить программу, которая всегда будет выигрывать. Но таких игр немного и все они достаточно примитивны. Кроме того логические игры можно разделить на игры, в кото- рых есть элемент случайности и игры, в которых все зависит только от игрока. Элемент слу- чайности обычно достигается за счет бросания кубика или, ска- жем, за счет того, что не из- вестна позиция противника. Клас- сическим примером игр, где при- сутствует элемент случайности могут быть практически все кар- точные игры, где неизвестен по- рядок карт в колоде и карт про- тивника. Рассмотрим для примера прос- тые карточные игры, например, очко. Кратко напомню правила:- каждая карта имеет достоинстрво от 3 до 11. Цель игрока набрать от 16 до 21 очка, чем больше тем лучше, если игрок набирает больше 21, то он проигрывает. В начале игры каждому игроку выда- ется по 2 карты и он может, если хочет, взять еще несколько карт из колоды. Для примеров я буду использовать BASIC с элементами некоторого алгоритмического язы- ка. Вам я тоже советую для раз- работки своих алгоритмов ис- пользовать BASIC по следующим причинам: легко искать ошибки, везде можно вставить оператор PRINT и следить за промежуточны- ми результатами, текст программы достаточно нагляден, алгоритм можно разрабатывать по частям, кроме того, если при составлении использовать только целые и не больше 255 числа, то такой алго- ритм легко перевести на AS- SEMBLER или откомпилировать це- лочисленым компилятором бейсика. Переводить алгоритм на ASSEMBLER следует только после полной от- ладки. Самый простой алгоритм, кото- рый реализует игру "очко" выгля- дит следующим образом. 10 LET A=ПОДСЧЕТ ОЧКОВ 20 IF A<18 THEN БРАТЬ КАРТУ:GO TO 10 Как вы уже догадались, ПОДСЧЕТ ОЧКОВ это функция, кото- рая считает сумму достоинств карт, находящихся на руках у компьютера, а БРАТЬ КАРТУ -это процедура, которая осуществляет взятие карты из колоды. Но если игрок догадается по какому пра- вилу играет компьютер, он будет часто выигрывать. Заменим константу переменной величиной. 10 LET M=16+INT(RND*3) 20 LET A=ПОДСЧЕТ ОЧКОВ 30 IF A<M THEN БРАТЬ КАРТУ:GO TO 20 Такой алгоритм будет играть посильней, ну если и не сильней, то во всяком случае похитрей. А как еще усилить алгоритм ? Тут надо вспомнить, что алгоритм пишется для ЭВМ и что делают в таких случаях люди. 10 LET A=ПОДАЧЕТ ОЧКОВ 20 IF A+NEXTCARD<22 THEN БРАТЬ КАРТУ: GO TO 10 где NEXTCARD функция, которая подсчитывает достоинство следую- щей карты в колоде. Кроме того можно еще учитывать количество очков, которые уже имеет против- ник. 10 LET A=ПОДСЧЕТ ОЧКОВ: LET B=ПОДСЧЕТ ОЧКОВ ПРОТИВНИКА 20 IF A<B AND B<22 THEN БРАТЬ КАРТУ: GO TO 10 Хотя предыдущий вариант будет играть сильнее. Этот алгоритм можно еще усилить за счет подта- совки колоды, но тогда обыграть программу будет просто невозмож- но, поэтому я рекомендую не зло- употреблять методом подсматрива- ния и делать несколько уровней сложности или постепенно повышая силу игры с увеличением уровня. Такой метод подсматривания, кроме карточных игр, можно ис- пользовать в еще большем коли- честве игр, например, он ис- пользуется в программе "ПОЛЕ ЧУ- ДЕС" или в моей игре "SEA ACTI- ON" (см SPECTROFON 16): на уров- не NORMAL программа играет честно, только за счет своих ин- теллектуальных способностей, а на уровне HARD действует тот же алгоритм, только перед каждым пятым ходом программа в еще не известных клетках ищет пустую и, не отмечая на карте, помещает эту информацию в массив. Этого достаточно, чтобы значительно повысить силу игры. Можно было бы также сделать (если был бы в этом смысл) уровень VERY HARD делая такую проверку, скажем, каждый третий ход. Кроме того, в карточных (да и не только) играх, если, скажем, по каким то причинам нельзя ис- пользовать метод подглядывания, надо использовать преиущество компьютера перед человеком в том, что компьютер ничего не за- бывает и быстро считает. Напри- мер, в игре ДУРАК после того, как все карты оказались на ру- ках, то если вычесть из полной колоды все битые и свои карты, то останутся карты противника (если всего 2 игрока) и "зава- лить" будет намного легче. Но самый мощный интеллект должен быть у игр, где у компью- тера и игрока одинаковые силы и все на виду, например, крести- ки-нолики, шахматы, шашки, ре- верси и т. д. во всех программах такого типа используются одни и те же принципы. Рассмотрим их на конкретном примере. Допустим, мы хотим соста- вить следующую игру: дано прямо- угольное поле из 7 столбцов по 6 клеток в каждом. Каждая клетка может находиться в трех состоя- ниях: быть пустой, содержать фишку 1-ого цвета или фишку 2-о- го цвета, обозначим эти состоя- ния соответственно 0, 1, 2. В игре принимают участие 2 игрока, они по очереди ходят: опускают фишку своего цвета в один из се- ми столбцов (если в этом столбце есть пустые клетки), фишка опус- кается до дна поля (если этот столбец пустой) или до верхней фишки в этом столбце. Цель игры составить вертвкальную, горизон- тальную или диагональную линию из четырех фишек своего цвета. (Примичание: такую компьютерную игру я составил на самом деле и она играла достаточно сильно, но здесь я восстанавливаю алгоритм по-памяти и для наглядности вно- шу некоторые изменения, так что возможны ошибки чисто техничес- кого плана, но цель этой статьи- показать не конкретную програм- му, а общие принципы). Прежде всего надо составить формулу, которая определяла бы силу позиции для каждого цвета в отдельности и выражала ее в чис- ле. Эта формула должна иметь максимальное быстродействие, так как для каждого хода эта формула должна рассчитать силу несколько десятков или даже сотен раз. От ее точности во многом зависит сила программы. Так как цель на- шей игры составить линию из фи- шек своего цвета, то логично ес- ли сила позиции будет зависеть от длины самой длинной линии нужного цвета, но как вы понима- ете, не все самые длинные линни тут подходят, так что будем рассматривать только открытые линии, то есть линии, длина ко- торых может быть увеличена сле- дующим ходом и которые могут быть увелич. до четырех нес- колькими ходами. Вот один из вариантов такой формулы для нашего примера: Пусть в массиве A(7, 6) содер- жится игровое поле с фишками (линия A(X, 1)-нижняя грань по- ля. ) В переменной C передается цвет, для которого рассчитывется сила позиции. 1000 LET D=3-C ;расчет противо- положного цвета. 1005 LET SM=0:LET S=0 1010 FOR X=1 TO 7 1020 FOR Y=1 TO 6 1030 IF A(X, Y)=D THEN GO TO 1300 1035 LET S=0:IF Y>3 THEN GO TO 1050 1040 FOR B=0 TO 3:IF A(X, Y+B)=D THEN LET S=0:GO TO 1050 1045 IF A(X, Y+B)=C THEN LET S=S+1 1047 NEXT B 1050 IF S>SM THEN LET SM=S 1060 LET S=0:IF X>4 THEN GO TO 1100 1065 FOR B=0 TO 3:IF A(X+B, Y)=D THEN LET S=0:GO TO 1100 1070 IF A(X+B, Y)=C THEN LET S=S+1:NEXT B 1080 LET X1=X+B:GO SUB 2000:IF Y1<>Y THEN LET S=0:GO TO 1100 1090 NEXT B 1100 IF S>SM THEN LET SM=S 1110 LET S=0:IF X>4 OR Y>3 THEN GO TO 1200 1120 FOR B=0 TO 3:IF A(X+B, Y+B)=D THEN S=0:GO TO 1200 1130 IF A(X+B, Y+B)=C THEN LET S=S+1:NEXT B 1140 LET X1=X+B:GO SUB 2000:IF Y1<>Y+B THEN LET S=0:GOTO1200 1150 NEXT B 1200 IF S>SM THEN LET SM=S 1210 LET S=0:IF X<4 OR Y>3 THEN GO TO 1300 1220 FOR B=0 TO 3:IF A(X-B, Y+B)=D THEN S=0:GOTO 1300 1230 IF A(X-B, Y+B)=C THEN LET S=S+1:NEXT B 1240 LET X1=X-B:GO SUB 2000:IF Y1<>Y+B THEN LET S=0:GOTO1300 1250 NEXT B 1300 IF S>SM THEN LET SM=S 1310 NEXT Y 1320 NEXT X 1330 RETURN 2000 LET Y1=1 ;подпрограмма 2005 IF A(X1, Y1)=0 ;определяет THEN RETURN ;первую пустую клет- ;ку в X1 ом столбце. 2010 LET Y1=Y1+1:IF Y1=8 THEN RETURN 2015 GO TO 2005 Это медленная, но зато самая точная процедура для рассчета силы позиции. Ее можно сделать быстрее, заменив, например, строку 1030 на IF A(X, Y)<>C THEN GOTO 1300, но в этом случае понизится точность. Далее выполняем перебор всех ходов, для начала на 2 полухода. Для каждого варианта считаем си- лу позиции относительно каждого цвета. Результаты вычислений по- мещаем в массив В(7, 7, 2). 100 FOR M=1 TO 7 110 LET X1=M:GO SUB 2000 120 IF Y1=8 THEN FOR B=1 TO 7:LET B(M, B, 1)=5:NEXT B:GOTO 240 125 LET A(M, Y1)=1 130 FOR N=1 TO 7 140 LET X1=N:GO SUB 2000 150 IF Y1=8 THEN GO TO 210 160 LET A(N, Y1)=2 170 LET C=1:GO SUB 1000:LET B(M, N, 1)=SM 180 LET C=2:GO SUB 1000:LET B(M, N, 2)=SM 190 LET X1=N:GO SUB 2000 200 LET A(N, Y1-1)=0 210 NEXT N 220 LET X1=M:GO SUB 2000 230 LET A, (M, Y1-1)=0 240 NEXT M Строки 110, 120 и 140, 150 смотрят за тем, чтобы не устано- вить фишку в заполненный стол- бец. Строка 125 устанавливает, а 220, 230 уберает фишку первого цвета, аналогочно строки 160, 190, 200 для второго цвета. Строки 170, 180 заполняют массив В(7, 7, 2) силами перебранных позиций для каждого цвета. После выполнения этой прог- раммы в массиве В(7, 7, 2) есть вся информация для определения лучшего хода, ее остается только обработать. Организуем массив C(7), в него будем помещать при- оритеты каждого хода. Макси- мальный приоритет будет 1, а ми- нимальный 200. 300 DIM C(7) 310 FOR B=1 TO 7:IF B(B, 1, 1)=4 THEN LET D(B)=1 320 NEXT B 330 FOR M=1 TO 7 340 FOR N=1 TO 7 350 IF C(M)=0 THEN IF B(M, N, 2)=4 THEN LET C(M)=199 360 NEXT N:NEXT M 370 FOR B=1 TO 7:IF B(B, 1, 1)=5 THEN LET C(B)=200 380 NEXT B 383 FOR B=1 TO 7: IF C(B)<>0 THEN GO TO 398 385 LET X=0:FOR M=1 TO 7:IF B(B, M, 1)=3 THEN LET X=X+1 390 NEXT M 395 IF X=7 THEN LET C(B)=2 398 NEXT B 400 FOR B=1 TO 7 410 IF C(B)<>0 THEN GO TO 510 415 LET X=0:LET Y=0 420 FOR M=1 TO 7 430 LET X1=B(B, M, 1):LET Y1=B(B, M, 2) 440 IF X1=3 THEN LET X1=10 450 IF Y1=3 THEN LET Y1=10 460 IF X1=2 THEN LET X1=4 470 IF Y1=2 THEN LET Y1=4 480 LET X=X+X1:LET Y=Y+Y1 490 NEXT M 500 LET C(B)=X-Y+100 510 NEXT B 520 LET BEST=0:LET X=200 530 FOR B=1 TO 7 540 IF C(B)<X THEN LET X=C(B):LET BEST=B 550 NEXT B В строках 310, 320 смотрится, что если в результате какого-то хода образуется линия в 4 фишки, то этому ходу присваивается мак- симальный приоритет. В строках 330-360 идет проверка, что если после какого-то хода противник может набрать линию из 4, то та- кому ходу присваивается низкий приоритет (199). Строки 370, 380 проверяют может ли такой ход быть выполненым по правилам иг- ры. Строки 383-398 смотрят, что если независимо от хода против- ника остается откр. линия длиной 3, то такому ходу присваивается приоритет 2, так как следующим ходом эта линия может быть уве- личена до 4. Строки 400-550 собственно и проводят основной анализ оставшихся ходов. Вариан- тов этого анализа может быть очень много, так же с помощью коэффициентов в строках 440-470 и 500 можно регулировать "агрес- сивность" алгоритма. Вот собственно и вся процеду- ра поиска лучшего хода, после ее работы в переменной BEST уста- навливается номер столбца, в ко- торый (с точки зрения алгоритма) лучше всего опустить фишку. Как еще усилить алгоритм ? Надо увеличить "глубину" прос- мотра позиций. Например, из мас- сива С(7) выбирается не 1 лучший ход, а скажем 3. Далее по-очере- ди эти ходы считаются поставлен- ными и перебор начинается заново на нужное количество полуходов. И лучший ход выбирается уже ис- ходя из полученных результатов. Ну думаю, для первого раза достаточно. В следующий раз я продолжу этот интересный разго- вор и покажу другие подходы к программированю "мозгов" компью- терных игр. Так же, возможно, проведу хит-парад стратегических чески любых проблем с помощью наших незаменимых товаров. И требуется-то всего ничего... Охранник, которого уже изрядно достали подобные аредложения, перебил его: - Хоть вы и похожи на Робина, этого ужасного человека вне за- кона, по вашей шляпе я вижу, что вы всего лишь навсего безобидный торговец. Поэтому можете пройти внутрь. В замке было пусто. - Куда все делись, ума не прило- жу, - заметил Маленький Джон. На первом этаже они вошли в большой зал. По углам была расставлена дешевая мебель, и ужасные толстые и короткие свечи, кото- рыми был заставлен зал, нещадно дымили. Они увидели Шерифа. - А-а-а-а! - воскликнул он, едва заметив Робина. Непонятно каким образом в руке у Шерифа оказался белый флаг, и он стал им разма- хивать. Сообразив, что безопас- ней будет убежать, Шериф отважно бросился в проход и скрылся в неизвестном направлении, бросив флаг на пол. - Вот мой боевой трофей, - ус- мехнулся Робин, подбирая флаг. - Поставлю его дома. Доказательств невиновности Златовласки Робин еще не нашел, поэтому ему пришлось продолжить свои поиски в Шервудском Лесу. Он набрел на поляну, неизвестно по какой причине облюбованную викторианским книжным шкафом. - А между прочим, шкафчик-то ни- чего, - заметил Робин, рассмат- ривая находку, - Может нам его того... до дому? Вероятно он нечаянно нажал на какой-то потайной выключатель, так как открылась скрипучая дверь шкафа, обнаружив за собой лестницу, ведущую в беспросвет- ную тьму подземелья. Первое, что заметила Дороти, спустившись вниз, был ее похищенный Тото. Увидев его, Дороти от всего сердца поцеловала Робина и пос- пешила к своему четвероногому другу. Через некоторое время До- роти промолвила: -Ну, нам пора увидеть Волшебника Изумрудного Города. Пока! - и быстро убежала. А Робин и остальные друзья оста- лись в недоумении по поводу то- го, куда же делся билет на по- езд, купленный на железнодорож- ной станции. Как бы то ни было, единствен- ным местом в этой части леса, где они еще не были, являлся до- мик Бабушки Кровавой Шапочки. - Что-то я боюсь идти туда, - сказал Робин дрогнувшим тихим голосом. - Если внучка избивала ломом Волка, то можно себе представить, на что способна ее бабушка. - Слушай, Робин, у тебя же есть белый флаг, - сказал Маленький Джон, - уж его-то Бабушка должна заметить. Глядишь, и не ломом тебя она будет бить, а кастрю- лей, например. - Спасибо, успокоил, - огрызнул- ся Робин, но все же взял белый флаг в руки, и пошел к дому. Как не странно, он все еще был жив. Стены дома были изрешечены пуля- ми, ставни свисали вниз, оконные рамы были расстреляны в щепки, окон не было и в помине. Сквозь разлом в стене на улицу высовы- валась большая противотанковая пушка. В кресле-каталке сидела Бабушка, обмотанная гранатами и патронами крупного калибра. - Тебе повезло, что я увидела белый флаг, - хихикнула Бабушка и отхлебнула изрядный глоток из бутылки, наполненной чистым спиртом. - Только так я поняла, что ты не электрик, приехавший отключать электричество за неуплату. Она развернула свое кресло, под- ъехала к окну и достала из пачки "Беломора" папиросу. - Кстати, ходят слухи, - начала она, зажигая спичку, - что Мори- арти вернулся в Шер... - раздал- ся взрыв. Когда дым рассеялся, то ничего невозможно было найти. Не уцелело даже кресло. - Мориарти? - с ужасом в голосе проговорил Назир. - Пора нам навестить Харна, - сказал Робин. # Сказано - сделано. Дорога проходила через магическое место - Круг Друидов. Много чего гово- рили о нем. Одни утверждали, что это злое место, другие - что доброе. Оценить же пришлось Ро- бину. В центре Круга Друидов возвышался сосископодобный обе- лиск, на вершине которого стояла мистическая древняя и уже не ра- ботающая кофеварка. Так ничего и не дождавшись от обелиска, быть может потому, что среди них не было друидов, компания двинулась дальше. Стоянка ЭнСиПи была пуста. Случайно разбросанные по залу машины для продажи билетов не работали, а флюорисцентные лам- пы, защищенные от посягательств вандалов, потихоньку мерцали. Пол был чист и ждал использован- ных билетов. Стояла тишина. - Здесь никого нет, - заметил Уилл. - Это очевидно, - ответил Робин. Неподалеку находился туалет. На стене читалась надпись: "Туа- лет платный. 10 пенсов - 15 ми- нут И НЕ БОЛЬШЕ!" - Подождите меня здесь, - сказал Робин, опустил в щель 10 пенсов, открыл дверь и вошел. Но! Это было не обычный туалет. Это был туалет-телепортатор, войдя в ко- торый Робин дематериализовался и спустя несколько секунд материа- лизовался вновь. Вроде бы все было на месте, и Робин вышел на- ружу в совершенно незнакомом месте. То ли туалет работал не- корректно, то ли была еще кака- я-нибудь причина, но в окошечко для возврата монет выпал потра- ченный десятипенсовик. - Быть может еще удастся куда-- нибудь попасть, - подумал Робин, но материализовавшись вновь, он понял, что попал обратно туда, где неподалеку находилась стоян- ка ЭнСиПи. Проехавшись еще нес- колько раз туда-сюда, до Робина наконец дошло, что больше по- пасть с помощью туалета никуда не удастся. Пришлось идти пеш- ком. Неожиданно лес ожил. Свирепые на вид деревья скооперировались каким-то непонятным образом, схватили неподалеку стоявшего смиренного дровосека и поволокли в кусты. Приглушенные крики пос- лышались оттуда и быстро стихли. Вскоре они добрались до кот- теджа Харна. Напротив него стоял еще один сарай, оказавшийся пус- тым. Коттедж был двухэтажным. Его окружало множество веселых маленьких кустиков, так и приг- лашавших подойти к ним, но никто этого не сделал, памятуя о дро- восеке. Все же попытки проник- нуть внутрь коттеджа успехом не увенчались. - Неплохо было бы найти хозяина, быть может он нас проведет внутрь, - предположил Назир. - Харн? Что ж пойдем найдем его. Пройдя немного дальше, путе- шественники снова увидели сарай. Этот-то пустым не оказался. Внутри валялся пустой пакет с надписью "Мегавзрыв. Сильно- действующее слабительное". - Златовласка явно не могла за- сунуть сюда пакет, - предположил Робин. - Значит она невиновна. Ну а теперь вернемся к нашим ба- ранам, то есть, я хотел сказать, к Трем Медведям. И вся компания поспешила к выше- указанным ба... медведям. Неожиданно Маленький Джон оста- новился. - Что с тобой? - спросил Робин. - Смотри, впереди Харн, - отве- тил тот. - Ничего, сейчас прикинусь шлан- гом и поговорю с ним. Быть может еще что-нибудь узнаю. - Добрый день, Харн. - Привет, идио... я хотел ска- зать, идиот я, что не узнал тебя сразу. Привет, Робин. - Харн, ты случайно не знаешь, что происходит в лесу? - Ты спрашиваешь меня, известно- го своими громкими делами Мо- ри... я хотел сказать, море воп- росов задаешь ты мне о всякой чепухе, Робин. - А знаешь ли, Харн, много чего произошло за последнее время. Как у тебя обстоят дела с алиби? - Ух, ты знаешь, Робин, меня в лесу не было, когда все это слу- чилось, - Харн заметно нервни- чал. - Ну ладно, Харн, мне пора. - Иди, иди, то есть, пока! - сказал Харн с явным облегчением. - Мне все понятно, как, надеюсь, и вам, - сказал Робин, когда они отошли подальше. - Всем этим заправлял Харн, или, как я подозреваю, Мориарти, ко- торому удалось каким-то образом обмануть и подменить Харна. Я бы хоть сейчас позвонил Лестрейду. Но ведь он сразу потащит меня с обыском в коттедж Харна, а тогда я не успею к Трем Медведям. Ну вот и дом, где готовилась принять героическую смерть Зла- товласка. Она стояла на табурете с петлей на шее, и Медведи уже готовились отправить ее первым рейсом на тот свет. - Стойте! - закричал Робин, и все посмотрели в его сторону. Тогда он достал пакет из-под слабительного, показал его Трем Медведям и рассказал, при каких обстоятельствах он его нашел. Вскоре Златовласка была отправ- лена домой, а сами Медведи ушли за угол и больше не вернулись. - Пора звонить Лестрейду, - про- молвил Робин, доставая свой ра- диотелефон. Вскоре полиция ворвалась в коттедж Харна, а вместе с ней туда попал и Робин. - Ну, - сказал инспектор Робину, - думаю тебе лучше будет осмот- реться, а потом прийти ко мне с ответами на вопросы. И не стой как обелиск. На первом этаже находились кухня, столовая и веранда. Из всех трех комнат наибольший ин- терес представляла кухня. Она была оборудована по последнему слову техники. Черная микродрай- вовая плита, готовящая обычный сорокавосьмикилобайтный обед за девять секунд, спокойно гудела в одном углу, в то время как посу- домоечная машина ЭмЭсИкс до- вольно шумно шуршала в другом. На втором этаже находилась спальня Харна, в южной ее стене была дверь. Робин открыл ее, и из тумана, расцвеченного та- инственными огнями, выпала на пол крепко связанная фигура Хар- на. - Мориарти занял мое место и на- чал коррумпировать весь лес, - невнятно и быстро пробормотал настоящий Харн. Все попытки спустить его вниз закончились неудачей, поэтому Робину приш- лось спуститься самому. - Ну, так что все это значит?! - спросил Лестрейд. - Это элементарно, Лестрейд, - ответил Робин. - Мориарти похитил Харна. - Отлично сработано, - сказал Лестрейд, после того, как Харн был развязан. Итак, инцидент был исчерпан. Впрочем, верно и то, что Мориар- ти позднее сбежал и скрылся из леса. Приехала Мэриэн, а затем она и все остальные пошли в та- верну, чтобы удовлетворить все свои желания, остававшиеся неу- довлетворенными на протяжении всей это эпопеи. Так и закончил- ся этот эпизод из жизни Робина Шерлокского.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября