Автор | Сообщение |
|
| moderator
|
|
|
Отправлено: 23.03.08 23:35. Заголовок: Примеры кода
В этой теме будут примеры работающего кода для QSP.
|
|
Профиль
Цитата
Ответить
|
Новых ответов нет
, стр:
1
2
3
4
5
All
[см. все]
|
|
|
Отправлено: 29.03.08 15:19. Заголовок: noname пишет: вот, ..
noname пишет: цитата: | вот, этого-то QSP и нехватает. |
| этого не было и не будет, так как приводит к проблемам. цитата: | при отладке "в строке 43 ошибка" - как её найти? |
| там указано имя локации, на ней в "выполнить при посещении" ищешь 43ю строку.. QGen 3 - старый, один из минусов - не показывает номера строк :( сейчас (пока нет более нового QGen'а) вариант - писать в текстовом редакторе, там проще с номерами строк. цитата: | по-моему rand(1,2) в 75% случаях даёт '1' - буду сделать спец-прогу для проверки рандома. |
| используется генератор псевдослучайных чисел из стандартной библиотеки. PS: у меня, честно говоря, нет никакого желания что-то писать про урку и её подстановках. повторю, что это фактически 2 разных языка, с разными принципами исполнения кода. насчёт строк - тоже не хочу объяснять то, что кажется мне очевидным.
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 16:05. Заголовок: есть ли возможность ..
есть ли возможность сделать переход на метку другой локации? т е войти не в начало локации, а куда-нибудь в середину или конец. это нужно для реализации ожидания нажатия игроком баттонов, если баттоны вызываются из локации 'ход_игрока', на которую переходили по gosub. после обработки ACT-а нужно вернуться в конец локации 'ход_игрока', которая передаст управление вызвавшей её локации. пользуюсь gosub так как ход_игрока вызывается в цикле, который перебирает всех персонажей (один из которых- игрок), и после обработки ход_игрока нужно продолжитьь обработку цикла.
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 16:32. Заголовок: именно в том виде, ч..
именно в том виде, что ты описал - например, через дополнительную переменную, которая хранит имя метки.. то есть на локации, где необходимо "продолжение работы с заданной метки", в самом начале делаешь проверку: if $ret!'':jump $ret ...код... :lab1 ..код.. (продолжение от какого-то действия) exit :lab2 ..код.. exit при вызове из act - $ret='lab1' & gt $prevloc ну или $ret='lab2' & gt $prevloc
|
|
Профиль
Цитата
Ответить
|
|
| moderator
|
|
|
Отправлено: 29.03.08 16:37. Заголовок: noname очень странн..
noname очень странная реализация - наверняка можно было бы сделать гораздо проще, без таких извращений, ну ладно. перед вызовом gosub 'ход_игрока' запоминай имя текущей локации в переменную, вместо gosub пиши goto: $вернуться=$CURLOC & goto 'ход_игрока' При добавлении действия делай так: ACT 'Действие такое-то': оператор & оператор & choice_taken=1 & goto 'ход_игрока' В локации 'ход_игрока', в самом начале пишем if choice_taken:choice_taken=0 & jump 'after_choice'
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 16:45. Заголовок: Одно и то же написал..
Одно и то же написали :)
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 17:01. Заголовок: Nex пишет: noname ..
Nex пишет: цитата: | noname очень странная реализация - наверняка можно было бы сделать гораздо проще, без таких извращений, ну ладно. |
| что, вызов процедуры через gosub так странно, или то, что процедура может кнопочки-ACTы делать? или то, что мне хотелось бы, чтоб игрок успевал на них нажать? ну я понимаю- странно то, что игрок у меня- обычный персонаж. точнее игрок- играет за любого из персонажей игры. и ходит в порядке общей очереди. такого ещё не делали и поэтому начинает проявляться неуниверсальность языка и всякие неувязки. ещё скажите, что я пример придумал специально под урку.
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 17:20. Заголовок: "странно" то..
"странно" то, что ты хочешь весь цикл на одной локации уместить (все итерации). вообще что приходило в голову - на одной локации делать выбор, после него переходить на ещё одну, в которой реализовано "тело цикла".. тогда никаких jump'ов не нужно. noname пишет: цитата: | начинает проявляться неуниверсальность языка и всякие неувязки. |
| о какой "универсальности" идёт речь? на мой взгляд кусп более универсален (возможности языка), чем урка. взять хотя бы то, что ты в урк-стиле пишешь на куспе. возможно ли обратное? :)
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 17:39. Заголовок: Byte пишет: взять х..
Byte пишет: цитата: | взять хотя бы то, что ты в урк-стиле пишешь на куспе. возможно ли обратное? :) |
| на урк возможно делать мои задумки (они там выложены в отдельной теме). я в урке года полтора назад написал два квеста не пользуясь почти ничем, кроме btn и pln т е языка практически не знал (чтоб разобраться с массивами запросил qwerty-bench-vic) потом забросил эту тему по личным причинам сейчас, имея такую задумку я за пару часов освоился с языком и создал пример№1 на тему живого игрового мира, ну и далее- в той же теме. остановился только из-за того, что хочу сделать то же самое на qsp (ну ещё из-за пассивности ихнего форума) на урк можно легко и просто писать проги в стиле урк можно ли на qsp писать в стиле qsp и что из этого выйдет? - можно. но сложно. варианты писать на урк в стиле qsp, как и наоборот, меня не интересуют. так же, как и возможность вывести строку, специально подобранную для того, чтоб её было невозможно вывести. у меня вполне нормальные авторские запросы. задумка- необычная. ну и что?
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 17:51. Заголовок: имхо просто у тебя з..
имхо просто у тебя за спиной багаж "установок" от урки. потому тебе и кажется всё неудобным.
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 29.03.08 18:10. Заголовок: ну, буду осваиваться..
ну, буду осваиваться. некоторые фичи на qsp просто подкупают: у меня готов пример, где всё доступное игроку заносится в OBJ, выбираешь объект (пока только направления: сзюв), к примеру, север: видишь сразу в доп окне краткое описание северной локации и что там есть в панели действий видишь: "идти на север" (позже планирую вставить возможность "бросить кинжал в минотавра" - если он там и действия с дверями/окнами северной стены локации). выбираешь меч и видишь его описание в доп окне, а в панели действий- что с ним можно сделать. я сумел сделать всё корректно, хоть баги и мучали поначалу. P.S. для Зоны было бы полезно реализовать такое "подглядывание" в соседнюю локацию
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 30.03.08 07:25. Заголовок: Королева и конь (пор..
Королева и конь (порнофильм?) noname, конь и ферзь ходят по-разному же :) и ещё - не понимаю, зачем тут массивы.. #Начало 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 'победа коня' - #победа ферзя 'Вы проиграли!' - #победа коня 'Вы победили!' -
|
|
Профиль
Цитата
Ответить
|
|
|
Отправлено: 30.03.08 10:23. Заголовок: Byte, когда я выклад..
Byte, когда я выкладываю кусок кода- его легко копировать с экрана когда ты выкладываешь- у тебя нет символов переноса строки. ну что ж. буду править. сделал без массивов- тем лучше, хотя конструкция вида длинаXширинаY - уже массив
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 30.03.08 10:36. Заголовок: м-да, пошли по упрощ..
м-да, пошли по упрощениям: 1. без наглядного представления тяжело тестировать (и получать удовольствие от реализации) - но мне, в принципе, этого и не надо- мне для дела хотя, когда на досурке был выложен qwerty-bench-vic им многие заинтересовались 2. выбора за кого играть- нет? ну и ладно. я в принципе, понял, как разобраться с проблемой, возникавшей при отрисовке кнопок в процедуре, вызываемой из цикла. пожалуй, разобью цикл по локациям. не то, чтоб это было удобно, но всё же не так уродливо, как искуственно монтировать jump в другую локацию. p.s. в-общем, спасибо и на этом.
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 31.03.08 01:33. Заголовок: Небольшая доработка:..
Небольшая доработка (рисуется поле и ход ферзя выбирается немного по-другому): #Начало 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 'победа коня' - #победа ферзя 'Вы проиграли!' - #победа коня 'Вы победили!' - UPD: Выложил пример в каталоге, раздел "В помощь разработчикам игр / Примеры, заготовки игр".
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 01.04.08 19:33. Заголовок: спасибо! графика вдо..
спасибо! графика вдохновляет. даже не знаю за что больше хочется взяться: приделать буковки a..h и картинки фигур к твоему примеру, или свою прогу ковырять дальше. наверное, буду ковырять свою...
|
|
Профиль
Цитата
Ответить
|
|
| менеджер по рекламе
|
|
|
Отправлено: 13.05.09 19:18. Заголовок: Касательно РПГ. Для ..
Касательно РПГ. Для вычисления повреждений по системе 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. На мой взгляд, получилось довольно изящно) Первую строчку наверное можно убрать, это так, перестраховка
|
|
Профиль
Цитата
Ответить
|
|
| демиург
|
|
|
Отправлено: 14.05.09 10:57. Заголовок: WladySpb Прикольно, ..
WladySpb Прикольно, надо будет посмотреть как оно в коде получится.
|
|
Профиль
Цитата
Ответить
|
|
| менеджер по рекламе
|
|
|
Отправлено: 14.05.09 16:56. Заголовок: Ajenta В коде так и ..
Ajenta В коде так и получаеться, кидаю два значения, возвращает рандомное число с учётом вероятностей) Правда, это всё исходит из предпосылок что генератор псевдослучайных чисел работает именно так как надо.
|
|
Профиль
Цитата
Ответить
|
|
| менеджер по рекламе
|
|
|
Отправлено: 01.06.09 23:16. Заголовок: Ещё, не сказал бы чт..
Ещё, не сказал бы что оригинальный ход, но мне он пришёл в голову случайно,и не факт что до него все додумались) Часто нужно просто проверить посещалась ли локация, или - сколько раз посещалась. Для этого в локации-обработчике onnewloc прописываем либо: vizited['<<$curloc>>']=1 либо: vizited['<<$curloc>>']=vizited['<<$curloc>>']+1 и после этого там где надо просто проверяем: if vizited['название_локации']=1:
|
|
Профиль
Цитата
Ответить
|
|
Отправлено: 01.06.09 23:50. Заголовок: '<<$curl..
'<<$curloc>>' это то же самое, что просто $curloc: vizited[$curloc]=1 Вроде такой пример есть в стандартном хелпе.
|
|
Профиль
Цитата
Ответить
|
Новых ответов нет
, стр:
1
2
3
4
5
All
[см. все]
|
|