Форум » » Примеры кода » Ответить

Примеры кода

Nex: В этой теме будут примеры работающего кода для QSP.

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

Byte: noname пишет: вот, этого-то QSP и нехватает. этого не было и не будет, так как приводит к проблемам. при отладке "в строке 43 ошибка" - как её найти? там указано имя локации, на ней в "выполнить при посещении" ищешь 43ю строку.. QGen 3 - старый, один из минусов - не показывает номера строк :( сейчас (пока нет более нового QGen'а) вариант - писать в текстовом редакторе, там проще с номерами строк. по-моему rand(1,2) в 75% случаях даёт '1' - буду сделать спец-прогу для проверки рандома. используется генератор псевдослучайных чисел из стандартной библиотеки. PS: у меня, честно говоря, нет никакого желания что-то писать про урку и её подстановках. повторю, что это фактически 2 разных языка, с разными принципами исполнения кода. насчёт строк - тоже не хочу объяснять то, что кажется мне очевидным.

noname: есть ли возможность сделать переход на метку другой локации? т е войти не в начало локации, а куда-нибудь в середину или конец. это нужно для реализации ожидания нажатия игроком баттонов, если баттоны вызываются из локации 'ход_игрока', на которую переходили по gosub. после обработки ACT-а нужно вернуться в конец локации 'ход_игрока', которая передаст управление вызвавшей её локации. пользуюсь gosub так как ход_игрока вызывается в цикле, который перебирает всех персонажей (один из которых- игрок), и после обработки ход_игрока нужно продолжитьь обработку цикла.

Byte: именно в том виде, что ты описал - например, через дополнительную переменную, которая хранит имя метки.. то есть на локации, где необходимо "продолжение работы с заданной метки", в самом начале делаешь проверку: [pre2] if $ret!'':jump $ret ...код... :lab1 ..код.. (продолжение от какого-то действия) exit :lab2 ..код.. exit [/pre2] при вызове из act - $ret='lab1' & gt $prevloc ну или $ret='lab2' & gt $prevloc


Nex: noname очень странная реализация - наверняка можно было бы сделать гораздо проще, без таких извращений, ну ладно. перед вызовом gosub 'ход_игрока' запоминай имя текущей локации в переменную, вместо gosub пиши goto: $вернуться=$CURLOC & goto 'ход_игрока' При добавлении действия делай так: ACT 'Действие такое-то': оператор & оператор & choice_taken=1 & goto 'ход_игрока' В локации 'ход_игрока', в самом начале пишем if choice_taken:choice_taken=0 & jump 'after_choice'

Byte: Одно и то же написали :)

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

Byte: "странно" то, что ты хочешь весь цикл на одной локации уместить (все итерации). вообще что приходило в голову - на одной локации делать выбор, после него переходить на ещё одну, в которой реализовано "тело цикла".. тогда никаких jump'ов не нужно. noname пишет: начинает проявляться неуниверсальность языка и всякие неувязки. о какой "универсальности" идёт речь? на мой взгляд кусп более универсален (возможности языка), чем урка. взять хотя бы то, что ты в урк-стиле пишешь на куспе. возможно ли обратное? :)

noname: Byte пишет: взять хотя бы то, что ты в урк-стиле пишешь на куспе. возможно ли обратное? :) на урк возможно делать мои задумки (они там выложены в отдельной теме). я в урке года полтора назад написал два квеста не пользуясь почти ничем, кроме btn и pln т е языка практически не знал (чтоб разобраться с массивами запросил qwerty-bench-vic) потом забросил эту тему по личным причинам сейчас, имея такую задумку я за пару часов освоился с языком и создал пример№1 на тему живого игрового мира, ну и далее- в той же теме. остановился только из-за того, что хочу сделать то же самое на qsp (ну ещё из-за пассивности ихнего форума) на урк можно легко и просто писать проги в стиле урк можно ли на qsp писать в стиле qsp и что из этого выйдет? - можно. но сложно. варианты писать на урк в стиле qsp, как и наоборот, меня не интересуют. так же, как и возможность вывести строку, специально подобранную для того, чтоб её было невозможно вывести. у меня вполне нормальные авторские запросы. задумка- необычная. ну и что?

Byte: имхо просто у тебя за спиной багаж "установок" от урки. потому тебе и кажется всё неудобным.

noname: ну, буду осваиваться. некоторые фичи на qsp просто подкупают: у меня готов пример, где всё доступное игроку заносится в OBJ, выбираешь объект (пока только направления: сзюв), к примеру, север: видишь сразу в доп окне краткое описание северной локации и что там есть в панели действий видишь: "идти на север" (позже планирую вставить возможность "бросить кинжал в минотавра" - если он там и действия с дверями/окнами северной стены локации). выбираешь меч и видишь его описание в доп окне, а в панели действий- что с ним можно сделать. я сумел сделать всё корректно, хоть баги и мучали поначалу. P.S. для Зоны было бы полезно реализовать такое "подглядывание" в соседнюю локацию

Byte: Королева и конь (порнофильм?) noname, конь и ферзь ходят по-разному же :) и ещё - не понимаю, зачем тут массивы.. [pre2] #Начало showobjs 0 & showinput 0 & showstat 0 конь_x=2 & конь_y=1 ферзь_x=4 & ферзь_y=8 ход_коня=0 'Начало системы координат доски находится в её левом нижнем углу.' act 'Начать':gt 'ход' - #ход 'Ваша позиция: <<конь_x>>,<<конь_y>>' 'Позиция ферзя: <<ферзь_x>>,<<ферзь_y>>' '----------' ход_коня=no ход_коня & xgt $iif(ход_коня, 'ход коня', 'ход ферзя') - #ход коня x = конь_x & y = конь_y if x>2 and y<8:act 'Идти на (<<x-2>>,<<y+1>>)':конь_x=x-2 & конь_y=y+1 & xgt 'ход' if x>1 and y<7:act 'Идти на (<<x-1>>,<<y+2>>)':конь_x=x-1 & конь_y=y+2 & xgt 'ход' if x<8 and y<7:act 'Идти на (<<x+1>>,<<y+2>>)':конь_x=x+1 & конь_y=y+2 & xgt 'ход' if x<7 and y<8:act 'Идти на (<<x+2>>,<<y+1>>)':конь_x=x+2 & конь_y=y+1 & xgt 'ход' if x<7 and y>1:act 'Идти на (<<x+2>>,<<y-1>>)':конь_x=x+2 & конь_y=y-1 & xgt 'ход' if x<8 and y>2:act 'Идти на (<<x+1>>,<<y-2>>)':конь_x=x+1 & конь_y=y-2 & xgt 'ход' if x>1 and y>2:act 'Идти на (<<x-1>>,<<y-2>>)':конь_x=x-1 & конь_y=y-2 & xgt 'ход' if x>2 and y>1:act 'Идти на (<<x-2>>,<<y-1>>)':конь_x=x-2 & конь_y=y-1 & xgt 'ход' - #ход ферзя gs 'проверка для коня' & gs 'проверка для ферзя' :выбор x=ферзь_x & y=ферзь_y d=rand(1,8) & l=rand(1,7) if d=1:y=y-l if d=2:x=x+l & y=y-l if d=3:x=x+l if d=4:x=x+l & y=y+l if d=5:y=y+l if d=6:x=x-l & y=y+l if d=7:x=x-l if d=8:x=x-l & y=y-l if y>8 or x>8 or x<1 or y<1:jump 'выбор' ферзь_x=x & ферзь_y=y xgt 'ход' - #проверка для ферзя if ферзь_x=конь_x or ферзь_y=конь_y:xgt 'победа ферзя' разница_x=конь_x-ферзь_x if ферзь_y+разница_x=конь_y or ферзь_y-разница_x=конь_y:xgt 'победа ферзя' - #проверка для коня if конь_x=ферзь_x and конь_y=ферзь_y:xgt 'победа коня' - #победа ферзя 'Вы проиграли!' - #победа коня 'Вы победили!' - [/pre2]

noname: Byte, когда я выкладываю кусок кода- его легко копировать с экрана когда ты выкладываешь- у тебя нет символов переноса строки. ну что ж. буду править. сделал без массивов- тем лучше, хотя конструкция вида длинаXширинаY - уже массив

noname: м-да, пошли по упрощениям: 1. без наглядного представления тяжело тестировать (и получать удовольствие от реализации) - но мне, в принципе, этого и не надо- мне для дела хотя, когда на досурке был выложен qwerty-bench-vic им многие заинтересовались 2. выбора за кого играть- нет? ну и ладно. я в принципе, понял, как разобраться с проблемой, возникавшей при отрисовке кнопок в процедуре, вызываемой из цикла. пожалуй, разобью цикл по локациям. не то, чтоб это было удобно, но всё же не так уродливо, как искуственно монтировать jump в другую локацию. p.s. в-общем, спасибо и на этом.

Byte: Небольшая доработка (рисуется поле и ход ферзя выбирается немного по-другому): [pre2] #Начало usehtml=1 & fsize=14 showobjs 0 & showinput 0 & showstat 0 конь_x=2 & конь_y=1 ферзь_x=4 & ферзь_y=8 ход_коня=0 'Вы играете белым конём.' act 'Начать':gt 'ход' - #ход белая=-1 '<table border="1">' i=8 :строки *p '<tr height="30">' j=0 :колонки $поле=' ' белая=no белая if i>0 and j>0:$цвет=$iif(белая, 'FFFFFF', 'DDDDDD') else $цвет='00FF00' if j=0:$поле=$str(i) if i=0:$поле=$str(j) if ферзь_x=j and ферзь_y=i:$поле='Ф' if конь_x=j and конь_y=i:$поле='К' *p '<td width="30" bgcolor="#<<$цвет>>"><<$поле>></td>' j=j+1 if j<=8:jump 'колонки' *p '</tr>' i=i-1 if i>=0:jump 'строки' '</table>' 'Ваша позиция: <<конь_x>>,<<конь_y>>' 'Позиция ферзя: <<ферзь_x>>,<<ферзь_y>>' ход_коня=no ход_коня & xgt $iif(ход_коня, 'ход коня', 'ход ферзя') - #ход коня x = конь_x & y = конь_y if x>2 and y<8:act 'Идти на (<<x-2>>,<<y+1>>)':конь_x=x-2 & конь_y=y+1 & gt 'ход' if x>1 and y<7:act 'Идти на (<<x-1>>,<<y+2>>)':конь_x=x-1 & конь_y=y+2 & gt 'ход' if x<8 and y<7:act 'Идти на (<<x+1>>,<<y+2>>)':конь_x=x+1 & конь_y=y+2 & gt 'ход' if x<7 and y<8:act 'Идти на (<<x+2>>,<<y+1>>)':конь_x=x+2 & конь_y=y+1 & gt 'ход' if x<7 and y>1:act 'Идти на (<<x+2>>,<<y-1>>)':конь_x=x+2 & конь_y=y-1 & gt 'ход' if x<8 and y>2:act 'Идти на (<<x+1>>,<<y-2>>)':конь_x=x+1 & конь_y=y-2 & gt 'ход' if x>1 and y>2:act 'Идти на (<<x-1>>,<<y-2>>)':конь_x=x-1 & конь_y=y-2 & gt 'ход' if x>2 and y>1:act 'Идти на (<<x-2>>,<<y-1>>)':конь_x=x-2 & конь_y=y-1 & gt 'ход' - #ход ферзя gs 'проверка для коня' & gs 'проверка для ферзя' x=ферзь_x & y=ферзь_y влево=x-1 & вправо=8-x & вверх=8-y & вниз=y-1 k=0 if вниз>0:ход[k]=1 & длина[k] = вниз & k=k+1 if вниз>0 and вправо>0:ход[k]=2 & длина[k] = min(вниз, вправо) & k=k+1 if вправо>0:ход[k]=3 & длина[k] = вправо & k=k+1 if вправо>0 and вверх>0:ход[k]=4 & длина[k] = min(вправо, вверх) & k=k+1 if вверх>0:ход[k]=5 & длина[k] = вверх & k=k+1 if вверх>0 and влево>0:ход[k]=6 & длина[k] = min(вверх, влево) & k=k+1 if влево>0:ход[k]=7 & длина[k] = влево & k=k+1 if влево>0 and вниз>0:ход[k]=8 & длина[k] = min(влево, вниз) & k=k+1 выбор=rand(0,k-1) d=ход[выбор] l=rand(1, длина[выбор]) if d=1:y=y-l if d=2:x=x+l & y=y-l if d=3:x=x+l if d=4:x=x+l & y=y+l if d=5:y=y+l if d=6:x=x-l & y=y+l if d=7:x=x-l if d=8:x=x-l & y=y-l ферзь_x=x & ферзь_y=y gt 'ход' - #проверка для ферзя if ферзь_x=конь_x or ферзь_y=конь_y:xgt 'победа ферзя' разница_x=конь_x-ферзь_x if ферзь_y+разница_x=конь_y or ферзь_y-разница_x=конь_y:xgt 'победа ферзя' - #проверка для коня if конь_x=ферзь_x and конь_y=ферзь_y:xgt 'победа коня' - #победа ферзя 'Вы проиграли!' - #победа коня 'Вы победили!' - [/pre2] UPD: Выложил пример в каталоге, раздел "В помощь разработчикам игр / Примеры, заготовки игр".

noname: спасибо! графика вдохновляет. даже не знаю за что больше хочется взяться: приделать буковки a..h и картинки фигур к твоему примеру, или свою прогу ковырять дальше. наверное, буду ковырять свою...

WladySpb: Касательно РПГ. Для вычисления повреждений по системе AD&D бросаются кубики, сначала пробовал в коде локации "бой" указывать вычисление урона как damage=rand(weapon_min_dam,weapon_max_dam) первая и вторая переменные это соответственно минимальный и максимальный урон. Потом вспомнил одну особенность работы с костями.. При уроне 1d8 вполне подходит вычисление через rand(1,8) а вот при уроне 2d4 нет. Дело в том, что хотя диапазон примерно тот же, но вероятность выпадания значений другая. Грубо говоря, при 1d8 есть 1/8 вероятность любой цифры. А при 2d4 есть 1/16 вероятность выпадения 2 или 8, 2/16 выпадения 3 или 7, 3/16 выпадения 4 или 6, и 4/16 выпадения 5. Непринципиально, но мысль запала. Увеличивать и без того громоздкий код боёвки не стал, но набросал функцию) result=0 :1 result=result+rand(1,args[1]) args[0]=args[0]-1 if args[0]>0: jump '1' В функцию передаются два аргумента: первый это количество костей, второй - грани кости. То есть для броска 2d4 передаём 2 и 4. На мой взгляд, получилось довольно изящно) Первую строчку наверное можно убрать, это так, перестраховка

Ajenta: WladySpb Прикольно, надо будет посмотреть как оно в коде получится.

WladySpb: Ajenta В коде так и получаеться, кидаю два значения, возвращает рандомное число с учётом вероятностей) Правда, это всё исходит из предпосылок что генератор псевдослучайных чисел работает именно так как надо.

WladySpb: Ещё, не сказал бы что оригинальный ход, но мне он пришёл в голову случайно,и не факт что до него все додумались) Часто нужно просто проверить посещалась ли локация, или - сколько раз посещалась. Для этого в локации-обработчике onnewloc прописываем либо: vizited['<<$curloc>>']=1 либо: vizited['<<$curloc>>']=vizited['<<$curloc>>']+1 и после этого там где надо просто проверяем: if vizited['название_локации']=1:

Byte: '<<$curloc>>' это то же самое, что просто $curloc: vizited[$curloc]=1 Вроде такой пример есть в стандартном хелпе.



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