Форум » » Tokenы. С чем их едят » Ответить

Tokenы. С чем их едят

Chicago1920: Можно ли поподробнее об использовании токенов. (В частности игра Острова от Терракона)

Ответов - 80, стр: 1 2 3 4 All

Евгений: Из многочисленных учебников Корвина: Оператор разбиения строки - tokens Для удобства работы с длинными строками введен оператор разбиения строки на отдельные части. Разбиение проводится по разделителям, хранящимся в строковой системной переменной tokens_delim (по умолчанию в ней хранится пробел и четыре знака препинания: точка, запятая, вопрос и восклицальный знак, то есть она разбивает предложение на отдельные слова) Если равна char, то строка делится на отдельные символы. tokens - команда делит строку на подстроки (разделитель - tokens_delim) Результаты сохраняются в строках вида tokenN, где N - номер подстроки. (очевидно, что если tokens_delim равно char, то в этих строках содержатся отдельные символы). Применение: tokens <стр. перем> tokens_num - содержит число подстрок в результате расщепления строки(например, слов в предложении), строковые переменные token1, token2 ... token# tokens_num$ содержат сами токены (например, слова). Операция разделения на подстроки никак не сказывается на исходной текстовой переменной. Пример. Поиск в токенах слова «гоблин»: :1 instr pars=. input pars tokens pars i=1 :loop if token#i$=«гоблин» then pln Я не гоблин! - истерически кричит урук-хай & goto 1 if token#i$=«пока» then quit if i‹tokens_num then i=i+1 & goto loop pln Не понимаю goto 1 Распечатка токенов: :0 instr a= input a tokens a pln #tokens_num$ tokens: i=1 :loop if i‹=tokens_num then pln #i$: #%token#i$$ & i=i+1 & goto loop else ; _if not(a=«bye») then goto 0 else end

Chicago1920: а подробнее - для чего они вообще используются?

Евгений: Ну, это единственный оператор для работы со строками(кроме, конечно, сравнений и *?). То есть если ты хочешь как-то оперировать текстовой информацией записанной в переменную, то тут без токенов никак не обойтись. К примеру, ты можешь записывать в строку список предметов которые лежат у героя в кармане instr в_кармане="нож, зажигалка, разводной ключ, злая обезъяна, семечки" И если вдруг понадобится вычленить какой-нибудь предмет из этого списка, то на помощь приходят токены. делаем "tokens в_кармане" и у нас теперь в переменной token2 содержится "зажигалка", а в token5 "семечки"... Что с ними делать потом решай уже сам :) Терр, в островах, насколько я понимаю разбивал строчки не по запятой, а на символы(такая возможность появляется когда tokens_delim=char) и уже отдельно в цикле анализировал их(в его случае каждый символ это точка на карте по которой ходит ГГ), можно ли по ним ходить и тд, а потом выводил измененную карту на экран.


Chicago1920: Понятно теперь. Полезная вещь. А как дела обстоят в акурке? Почему мне не удается Острова Терракона портировать на нее?

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

Chicago1920:

Korwin: Запусти в акурке. Если пойдет - будешь знать по тексту в какой локации примерно искать

Chicago1920:

Евгений: У меня обычно if без then возникает когда я путаю в условиях ифа & и and :) В досурке есть примитивный дебаггер, который включается нажатием кнопки a, можно поробовать его. В любом случае, всегда помогает способ отладки - "запряги Вика", но этот способ нельзя использовать слишком часто :)

Korwin: А у меня была ошибка 'tnen' вместо 'then' Вообще, надо проверять те локации, которые создавались последними. Кстати, мэтры, а почему собственно не запускается? Я думал, раз интерпретатор, то должно дойти до "сбойной" локации и выдать ошибку там? Chicago1920 - кинь мне на почту свою игрушку (почта в профиле). Проверю. И пиши, пожалуйста, свои посты не в заголовок, а ниже, ладно?

Chicago1920: Всем спасибо. Работает. Вместо and было &. Нотеперрь мой проц (атлон 64 3500+) загружен под 100 процентов и игра тормрзит.... я неудачник))

Korwin: Chicago1920 пишет: Нотеперрь мой проц (атлон 64 3500+) загружен под 100 процентов и игра тормрзит.... я неудачник)) Однако, что-то неоптимально...

Хломидоманад: Chicago1920 пишет: Всем спасибо. Работает. Вместо and было &. Нотеперрь мой проц (атлон 64 3500+) загружен под 100 процентов и игра тормрзит.... я неудачник)) Та же самая ерунда была у меня с моими экспериментами (правда, процессор у меня похуже:)) - из-за использования волнового алгоритма. Под виндами, по ходу, тут ничего не попишешь. Зато в чистом досе летало... возможно, получше шло бы и в линуксе. Посмотри сам. Такова специфика досурки... смирись (и жди, как и все, мифического релиза) или переходи на C:). Собственно, играть-то можно и при загрузке CPU на 100%. Korwin пишет: Однако, что-то неоптимально... Ммм, досурка?;)

Chicago1920: Вот так всегда. Придется делать обрезание игры по фичям. Может быть поможет быть.

Евгений: А что там у тебя, вторые острова? :)

Хломидоманад: Chicago1920 пишет: Вот так всегда. Придется делать обрезание игры по фичям. Может быть поможет быть. Обрезание - обычай, конечно, древний, но вовсе не обязательный)... представь, что пишешь что-то в духе Doom 4, что будет по определению тормозить на любом компьютере;). Специфика еще в том, что на любой машине от 350 до 3500 MHz тормоза будут, в сущности, одинаковые... но играть-то при этом можно кое-как:).

Chicago1920: Что то вроде Островов. Просто больше фишек

Terracon: Круто. Будет очень антересно посмотреть.

Chicago1920: Может кто подскажет по старой дружбе... :) Допустим имеется игровое поле 10х10 клеток. По нему передвигается персонаж. NPC должен приблизится к нему. Примерный код: x1=5 ;координата х игрока y1=5 ;y игрока x2=5 ;координата х NPC y2=4 ;y NPC ........... ........... proc 1 .......... :1 if x2>x1 then x2=x2-1 if x2<x1 then x2=x2+1 if y2>y1 then y2=y2-1 if y2<y1 then y2=y2+1 end .......... .......... В чем ошибка?

Евгений: Приблизиться это значит встать на те же координаты? Не вижу никакой криминальной ошибки :) Все шагает нормально.. Если только у тебя начальные координаты не в той же локации что вызывается постоянно :) x1=5 ;координата х игрока y1=5 ;y игрока x2=3 ;координата х NPC y2=4 ;y NPC pln Начальные координаты: pln #x1$ #y1$ ME pln #x2$ #y2$ NPC btn 0, шаг end :0 if x1=x2 and y1=y2 then pln Уже на месте & end proc 1 pln Шагнул: pln #x1$ #y1$ ME pln #x2$ #y2$ NPC btn 0, шаг end :1 if x2>x1 then x2=x2-1 if x2<x1 then x2=x2+1 if y2>y1 then y2=y2-1 if y2<y1 then y2=y2+1 end



полная версия страницы