Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #126
31.12.2014 00:50

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Ребята, задумал сделать интерактивную игру про биатлон smile Пока не могу понять следующий момент как реализовать: спортсмены бегут спринт, у каждого свое время, финишируют, им присваивается их результат (время) - тут все понятно как делается, но... как сделать так, чтобы после финиша программа считала, у кого из спортсменов результат лучше, у кого хуже? Например, спортсмен А прошел трассу за 5 минут 10 секунд, спортсмен Б - за 5 минут 14 секунд, спортсмен В - за 4 минуты 59 секунд. Должно быть на финише так - первым будет В, вторым А, третьим - Б.  Как сделать, чтобы программа считала места по результатам?

Можно, например, так:

Код:

:: biatlon
<<set $name = ["Alex", "Bob", "Carl"]>>
<<set $time = [0, 0, 0]>>
<<set $place = []>>

<<set $i = 0>>
<<loop $time.length>>
    <<random $min = 2>>
    <<set $min = $min + 4>>
    <<random $sek = 59>>
    <<if $sek lt 10>>
        <<set $sek = "0" + $sek>>
    <<endif>>
    <<set $time[$i] = $min + ":" + $sek>>
    <<set $place.push($time[$i] + "|" + $name[$i])>>
    <<set $i++>>
<<endloop>>

<<set $place = $place.sort()>>

Results:
<<set $i = 0>>
<<loop $place.length>>
    <<set $position = $place[$i].split('|')>>
    <<print ($i + 1)>> - <<print $position[1]>> (<<print $position[0]>>)
    <<set $i++>>
<<endloop>>

[[Repeat|biatlon]]

Суть в том, что мы заносим время вместе с именами спортсменов в новый массив, который затем сортируем. Поскольку элементы этого массива начинаются с времени, он сортируется в порядке возрастания времени. Программа не учитывает случай, если спортсмены показали одинаковый результат. Не знаю, бывает ли такое в биатлоне.

Неактивен

0    0    #127
31.12.2014 15:07

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Morych, а можно расшифровку? Результаты будут заноситься не рандомные. Одинаковых результатов не будет, так что все норм.

Не пойму, что означает в коде параметр "i" и "$place.push".

И вот эта часть кода не ясна мне:

<<loop $place.length>>

    <<set $position = $place[$i].split('|')>>

    <<print ($i + 1)>> - <<print $position[1]>> (<<print $position[0]>>)

    <<set $i++>>

<<endloop>>

Давай попробуем разобраться. параметр $i - это просто переменная-счётчик, при помощи которой мы перебираем все индексы массива. От 0 до 2 в нашем случае, но в общем случае число элементов массива нам не известно, поэтому используем цикл и переменную $i.

При помощи $place.push мы заносим в массив новые элементы.

Теперь часть кода:

<<loop $place.length>> --- цикл, повторяющийся столько раз, сколько элементов в массиве $place.

    <<set $position = $place[$i].split('|')>> --- берём i-й элемент массива $place (это будет строка вида "5:09|Имя спортсмена") разделяем эту строку при помощи метода split по символу "|" и получаем массив из двух строк - отдельно время, отдельно имя биатлониста. Массив этот заносится в переменную $position.

    <<print ($i + 1)>> - <<print $position[1]>> (<<print $position[0]>>) --- выводим на экран номер места, затем имя спортсмена (первый элемент массива $position) и в скобках его время (нулевой элемент массива $position).

    <<set $i++>> --- увеличиваем переменную-счётчик на 1, чтобы перейти к следующему элементу массива $place при следующем повторении цикла.

<<endloop>> --- конец цикла.

Спрашивай ещё, если что! smile

Неактивен

0    0    #128
31.12.2014 15:56

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Всё то же самое, как и со временем, только вместо времени добавляем в массив $place счётчики ходов вместе с именами:

<<set $place = []>> --- создадим новый массив

<<set $place.push($счетчик_хода_имя + "|" + $имя)>> --- добавили в массив счетчик ходов и имя первого спортсмена (значения разделены символом "|")

<<set $place.push($счетчик_хода_имя1 + "|" + $имя1)>> --- добавили в массив счетчик ходов и имя второго спортсмена

<<set $place = $place.sort()>> --- отсортировали массив

Теперь в массиве $place спортсмены расположены по возрастанию значений их ходов: нулевой элемент - первое место, первый элемент - второе место и так далее. Чтобы всё работало правильно, нужно перед занесением значений в массив $place убедиться, что число символов для параметра сортировки у всех спортсменов будет одинаково. Т.е. если число ходов может быть от 10 до 99 - все хорошо, но если число ходов может быть 100 и больше, то и все прочие счетчики ходов нужно дополнить до трёх символов: 064, 070, 125.

Неактивен

0    0    #129
01.01.2015 14:00

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

А соперников будет только двое?

Неактивен

0    0    #130
01.01.2015 21:57

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Тогда лучше сразу составлять код из расчёта, что спортсменов много. Но прежде хотелось бы подробнее узнать логику игры: по пунктам что за чем должно происходить, включая то прибавление разницы ходов.

Неактивен

0    0    #131
03.01.2015 21:40

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Будет, скажем 12 сборных, в каждой по 6 спортсменов. Итого - 72 спортсмена. Сперва все бегут спринт (то есть, тут все ходят по очереди, кто затратил на прохождение трассы меньше всего времени - тот победитель. Далее все бегут преследование. Тут разница (отставание от победителя спринта) ходов должна записываться в переменную длины пройденной трассы. То есть, если Петя в спринте был лучше Васи, и прошел за 64 хода трассу, а Вася за 70, то в преследовании Петя должен при старте иметь показатель <<$длина_пройденной_трассы_Петя = $длина_пройденной_трассы_Петя + 6>>. То есть, он раньше на 6 ходов, чем Вася стартанул в гонке. При чем, вместо "6" должна наверное быть некая переменная, типа <<$отставание_от_первого_места_в_спринте>>, которая на финише спринта формировала бы сразу разницу отставаний между местами автоматом.

Так, значит после спринта у нас есть массив ходов, которые спортсмены затратили на прохождение трассы:

<<set $ходы_спринт = [64, 70, ... 60]>> (итого в массиве 72 элемента)

Найдем число ходов лидера спринта (минимальное число ходов):

<<set $ходы_лидера = $ходы_спринт.sort()[0]>> --- сортируем массив и берем первый элемент отсортированного массива - минимальное значение

Перед началом преследования:

<<set $ходы_преследование = [0, 0, ... 0]>> --- число ходов, которые спортсмены затратят на прохождение гонки-преследования

и увеличим число ходов в зависимости от результата в спринте:

<<set $i = 0>>

<<loop $ходы_преследование.length>>
<<set $ходы_преследование[$i] = $ходы_спринт[$i] - $ходы_лидера>>
<<set $i++>>
<<endloop>>

теперь перед началом преследования у каждого спортсмена уже установлено стартовое число ходов, а у лидера спринта это число будет = 0.
Это то, что было нужно? smile

Неактивен

0    0    #132
03.01.2015 22:56

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

<<set $ходы_спринт = [64, 70, ... 60]>> (итого в массиве 72 элемента)

А как система поймет, кто за сколько ходов прошел спринт? Я так понимаю, в массиве уже конкретные результаты тут указаны?

Да, все верно, тут указаны конкретные результаты после спринта просто для примера. Перед спринтом этот массив будет содержать все нули, а во время спринта значения поменяются в зависимости от характеристик спортсменов, каких-то внешних факторов, выбора игрока или чего-то еще.

alfa10 написал:

теперь перед началом преследования у каждого спортсмена уже установлено стартовое число ходов, а у лидера спринта это число будет = 0.

Так у лидера наоборот, должен быть бонус перед другими, он же раньше второго номера уйдет на трассу на n-ходов.

Нам нужно определиться, что считать результатом. Если число затраченных ходов, как в спринте, то минимальное значение ходов будет лучшим результатом. Поэтому стартовое значение = 0 - это и есть самый лучший бонус, т.е. лидер стартует сразу, без ожидания. А тот, кто отстал от лидера в спринте на 10 ходов, и у кого значит стартовое значение ходов = 10 - тот, получается, как бы ждет 10 ходов прежде чем начать преследование.

Неактивен

0    0    #133
03.01.2015 22:58

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Вот получил такой вот результат при таком вот коде. Места определились некорректно!

Это как раз тот случай, о котором я говорил в этом сообщении. В массив для сортировки нужно заносить не "4", а "04"!

Неактивен

0    0    #134
04.01.2015 01:42

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Если число ходов не может быть больше 999, то вместо:

<<set $place.push($счетчик_хода_имя + "|" + $имя)>>

Делаем так:

<<if $счетчик_хода_имя lt 10>>

<<set $place.push("00" + $счетчик_хода_имя + "|" + $имя)>> --- если значение ходов от 0 до 9, добавляем "00" к счетчику ходов

<<elseif $счетчик_хода_имя lt 100>>

<<set $place.push("0" + $счетчик_хода_имя + "|" + $имя)>> --- иначе, если значение ходов от 10 до 99, добавляем "0"

<<else>>

<<set $place.push($счетчик_хода_имя + "|" + $имя)>> --- иначе, если значение ходов больше либо равно 100, ничего не добавляем

<<endif>>

Таким образом число ходов всегда будет состоять из 3 символов, и мы будем сортировать такие значения:

"064|Вася"
"008|Петя"
"256|Ваня"

Неактивен

0    0    #135
04.01.2015 12:55

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Да, тут надо использовать цикл и массивы. И не забыть про переменную $i

<<set $i = 0>>

<<loop 72>>

    <<if $счетчик_хода[$i] lt 10>>

        <<set $place.push("00" + $счетчик_хода[$i] + "|" + $имя[$i])>>

    <<elseif $счетчик_хода[$i] lt 100>>

        <<set $place.push("0" + $счетчик_хода[$i] + "|" + $имя[$i])>>

    <<else>>

        <<set $place.push($счетчик_хода[$i] + "|" + $имя[$i])>>

    <<endif>>

    <<set $i++>>

<<endloop>>

Неактивен

0    0    #136
04.01.2015 23:30

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Morych, а посмотри плиз мой сейв. Как тут код можно упростить?

Посмотрел и все переписал wink


Прикрепленные файлы:
Biatlon.sm, Размер: 2,541 байт, Скачано: 478

Неактивен

0    0    #137
05.01.2015 13:08

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Еще вопрос по другому моему проекту. Нужно сделать жеребьевку команд в турнирной сетке. Сперва будет 32 команды. Отсюда вопросы:
1) как сделать жеребьевку команд в турнирной сетке (1/32 финала)? Команды не должны повторяться
2) как сделать рандомные результаты матчей между соперниками? Более сильные команды должны иметь бонус при расчете результатов перед более слабыми командами.
3) как вывести из дальнейшей жеребьевки (1/16 финала) проигравшие команды?

Нечто похожее - рандомная выборка неповторяющихся элементов - есть в этой части учебника. Можно там пример кода глянуть. Делается при помощи массива и его метода splice:
- загоняем все 32 команды в общий массив;
- в цикле получаем рандомный индекс массива (рандом по длине);
- методом splice вырезаем этот рандомный элемент из общего массива.
На следующем шаге цикла рандом будет выбирать уже только из оставшихся команд.

Неактивен

0    0    #138
05.01.2015 14:26

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

а как работать с таблицами можно? Можно где-нибудь примеры посмотреть?

Все есть в руководстве пользователя:

<<row 'Заголовок таблицы'>>
<<row 'Столбец 1' 'Столбец 2'>>
<<row 'Столбец 1' 'Столбец 2' noborder>>

Неактивен

0    0    #139
06.01.2015 20:20

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

А как сделать сортировку наоборот, чтобы первым был тот, у кого больше всего очков?

Вместо
<<set $place = $place.sort()>>

Нужно написать
<<set $place = $place.sort().reverse()>>

Элементы массива будут отсортированы по убыванию.

Неактивен

0    0    #140
06.01.2015 22:17

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Полезное замечание! Правда, применительно к биатлону такая сортировка не подходит, поскольку в массиве у нас не просто числа, а еще какая-то дополнительная информация, отделенная условным символом. Это может быть имя или индекс спортсмена. После сортировки нам нельзя потерять связь между числовым параметром и самим спортсменом. А поскольку сортируются строки, в числовом параметре мы добавляем нули вместо отсутствующих разрядов. Ничего лучше я не придумал. Может, есть более красивый способ?

Неактивен

0    0    #141
12.01.2015 15:22

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Такой еще вопрос: создал в начале игры массив <<set $имя = []>>. Также в начале игры называю своего спортсмена <<input '' $имя0>>. Как значение $имя0 вписать в массив?

<<set $имя.push($имя0)>>

Неактивен

0    0    #142
12.01.2015 15:46

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Можно ли, имея разные переменные, например (результат1, результат2, результат3, результат4), объединить их в массив, и сделать сортировку этого массива так, чтобы результаты с наименьшим числовым значением выводились выше, чем результаты с большим числовым значением?

Например:

Результат1 - 50 ходов
Результат2 - 75 ходов
Результат3 - 28 ходов
Результат4 - 52 хода

Выводится так:

1 место - Результат3 - 28 ходов
2 место - Результат1 - 50 ходов
3 место - Результат4 - 52 хода
4 место - Результат2 - 75 ходов

Это мы уже проходили wink

Код:

<<set $результат1 = 50>>
<<set $результат2 = 75>>
<<set $результат3 = 28>>
<<set $результат4 = 52>>

<<set $места = []>>

<<set $места.push($результат1 + "|Результат1")>>
<<set $места.push($результат2 + "|Результат2")>>
<<set $места.push($результат3 + "|Результат3")>>
<<set $места.push($результат4 + "|Результат4")>>

<<set $места = $места.sort()>>

<<set $номер = 0>>
<<loop $места.length>>
<<set $результат = $места[$номер].split("|")>>
<<set $место = $номер + 1>>
<<print $место>> место - <<print $результат[1]>> - <<print $результат[0]>> ходов
<<set $номер++>>
<<endloop>>

А чтобы в зависимости от числа выводить "ход", "хода" или "ходов", смотри эту заметку.

Неактивен

0    0    #143
12.01.2015 15:53

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

Парни, сел окончательно с игрой. Совершенно не пойму с просчетом гонок. Нужно вводить по идее очень много параметров: ведь, кто-то может бежать дистанцию, а кто то в это время стрелять. Как это сделать, мне не понятно! Хочу спросить, может кто-то сможет мне помочь в реализации игры по моим консультациям? В знак благодарности, я готов буду оплатить Вашу помощь. Не крупно конечно, но пару тысяч выделить смогу.

Попробуй спросить в Потоке. Сюда, мне кажется, увлекающиеся Асмом реже заглядывают.

Неактивен

0    0    #144
12.01.2015 23:08

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Кстати, alfa10, когда появится поддержка функции sort(*), можно попробовать добавлять в массив без дополнительных нулей, но через точку, а не через вертикальную линию. Т.е. так:

<<set $place.push($счетчик_хода0[$i] + "." + $i)>>

тогда в массиве у нас окажутся дробные числа (где целая часть - количество ходов, а дробная часть - это индекс спортсмена). Такой массив уже можно будет отсортировать методом sort(*) и сортироваться будут вообще любые значения ходов, без необходимости, повторюсь, добавлять дополнительные нули.

Потом, правда, и разделять строку надо будет по символу "."

Неактивен

0    0    #145
17.01.2015 11:22

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

alfa10 написал:

По идее, эта часть кода

Код:

<<if $счетчик_хода0[$i] lt 0>>
<<goto 'Результаты Гонки-1'>>
<<endif>>

говорит нам о том, что если значение меньше нуля, то переходим к другому параграфу, но почему то работает это вот так (указано на скриншоте). Почему появляется кнопка "далее", которой нет в параграфе "Результаты Гонки-1", но есть в параграфе с тем куском кода. И при нажатии на эту кнопку продолжается тот параграф?!

Макрос goto хоть и очищает экран, выводя содержимое нового параграфа, но не прерывает выполнение текущего параграфа! Поэтому использовать его нужно осторожно, убедившись, что в текущем параграфе после goto ничего выведено не будет.

В нашем случае по идее нужно сделать так:

Код:

<<set $нужен_переход = false>>

<<loop ...>>
   <<if $счетчик_хода0[$i] lt 0>>
      <<set $нужен_переход = true>>
      <<break>>  --- выходим из цикла!
   <<endif>>
   ...
<<endloop>>

<<if $нужен_переход>>
   <<goto 'Результаты Гонки-1'>>
<<else>>
   ...
   А здесь выполняется оставшаяся часть текущего параграфа!
   ...
<<endif>> --- после этой строки больше ничего не должно быть!

Неактивен

0    0    #146
10.04.2015 13:47

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Здравствуйте! Я хоть и не DoubleDragon, но вижу, что здесь чего-то не хватает:

<<if $month eq 13>>
    <<set $month = 1>>
    <<set $year = $year + >>
<<endif>>

Неактивен

0    0    #147
10.04.2015 22:41

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Сергей Соловьев написал:

Спасибо огромное! Модуль заработал.
И сразу появился еще один вопрос..
Прописал 2 тестовые ссылки в заголовок
[[*Подождать 15 минут| календарь {$мин = $мин + 15}]] | [[*Подождать 1 час| календарь {$мин = $мин + 60}]]
Календарь работает, но данные в текущем времени обновляются только при переходе в другой параграф. Есть ли возможность обновлять данные без перехода между параграфами?

Я думаю, тут речь идет не об обновлении в реальном времени. Если так, то макрос <<repeat>> не нужен.
Просто поменяйте в ссылке целевой параграф на параграф с текущей локацией:

[[Подождать 15 минут| квартира {$мин = $мин + 15}]] (и ссылка нужна обычная, а не многоразовая)

Параграф "календарь" судя по коду и так вызовется в заголовке.

Неактивен

0    0    #148
22.06.2015 12:54

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Ну зачем же сразу удалять. Может, у кого похожий вопрос возникнет.

Неактивен

0    0    #149
10.10.2015 22:22

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Константин Шарыкин написал:

И когда я прописываю такой код:

Код:

<<repeat 'Антивирусы' 15>>
<<stop 'Антивирусы' >>

То не отображает ничего. Вообще. Даже через 15 сек.

Ну все же логично, ничего отображать и не должно. Ты же запускаешь таймер и тут же его останавливаешь, он просто не успевает сработать. Если нужно, чтобы параграф "Антивирусы" отработал только один раз через 15 секунд после запуска таймера, макрос <<stop 'Антивирусы'>> нужно перенести в сам параграф "Антивирусы". Через 15 секунд он выполнится и сам же остановит таймер.

Неактивен

0    0    #150
10.10.2015 23:15

Morych
Модератор (+67, -8)
Откуда: Гродно
Зарегистрирован: 05.07.2012
Сообщений: 523
Вебсайт

Re: Как сделать что-то или "я вот не понимаю"

Константин Шарыкин написал:

Код:

.body {
 background-image: url(https://yadi.sk/i/2dvr2OurgPdDY);
 background-color: #c7b39b;
 }

Кстати говоря, у меня background не показывает

DoubleDragon уже ответил: в url() нужно просто запихнуть ссылку на саму картинку, а не на веб-страницу. В данном случае на странице https://yadi.sk/i/2dvr2OurgPdDY кликаем на картинку, она открывается в новом окне, и там в адресной строке мы берем ссылку на картинку:

 спойлер…

Помещаем всю эту страшную ссылку в url(), и фон появится. Только в версии Асм 4+ селектор должен быть не .body, а #body.

Неактивен

Powered by PunBB
© copyright 2001–2023 iFiction.Ru