Forum.iFiction.Ru

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

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

Вы не зашли.

   #501
31.12.2014 15:37

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Чуть-чуть въехал. А вот смотри, к примеру, имеем два спортсмена (вводим переменные $имя и $имя1). Один прошел трассу за 70 ходов, а второй за 64 хода.
<<set $имя = Вася>>
<<set $имя1 = Петя>>
<<set $счетчик_хода_имя = 0>> #персональный счетчик хода спортсмена Васи
<<set $счетчик_хода_имя1 = 0>> #персональный счетчик хода спортсмена Пети
...
:: В след. параграфе получаем финишные значения:

<<set $счетчик_хода_имя = 70>>
<<set $счетчик_хода_имя = 64>>
Теперь надо чтобы выдало результаты по местам: 1 место - получается занял второй спортсмен (Петя), 2 место - первый спортсмен (Вася).

Неактивен

   #502
31.12.2014 15:56

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

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

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

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

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

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

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

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

Неактивен

   #503
31.12.2014 16:43

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Делаю так:

: Начало

<<set $имя = 'Вася'>>

<<set $имя1 = 'Петя'>>

<<set $счетчик_хода_имя = 0>>

<<set $счетчик_хода_имя1 = 0>>

[[Ход игрока|Просчет]]

: Просчет

<<random $кубик = 50>>

<<set $счетчик_хода_имя = $счетчик_хода_имя + $кубик>>

[[Ход соперника|Просчет соперника]]

: Просчет соперника

<<random $кубик = 50>>

<<set $счетчик_хода_имя1 = $счетчик_хода_имя1 + $кубик>>

[[Финиш|Финиш]]

: Финиш

А как тут код прописать? smile
И еще нужно, чтобы разница, полученная между числами плюсовалась в след. параграфе к значению $счетчик_хода_имя. Например, Петя прошел гонку за   64 хода, а Вася за 70. Разница между ними равна 6. Значит в след. параграфе у Пети будет к счетчику хода прибавлено значение 6, а у Васи это значение будет равно 0.

Неактивен

   #504
01.01.2015 14:00

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

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

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

Неактивен

   #505
01.01.2015 14:44

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Morych написал:

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

нет, будет много, просто на примере двух хотелось понять код

Неактивен

   #506
01.01.2015 21:57

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

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

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

Неактивен

   #507
01.01.2015 22:29

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Morych написал:

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

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

Отредактировано alfa10 (01.01.2015 22:33)

Неактивен

   #508
03.01.2015 21:40

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

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

Неактивен

   #509
03.01.2015 22:13

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Morych написал:

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

Блин, вообще не пойму код sadsadsad

Неактивен

   #510
03.01.2015 22:30

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

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

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

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

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

Неактивен

   #511
03.01.2015 22:32

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Наверное набросаю спринт, потом сейв выложу, а Вы поправите что да как, ок?

Неактивен

   #512
03.01.2015 22:44

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

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


Прикрепленные файлы:
Screenshot_3.jpg, Размер: 75,677 байт, Скачано: 83

Неактивен

   #513
03.01.2015 22:56

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

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

alfa10 написал:

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

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

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

alfa10 написал:

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

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

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

Неактивен

   #514
03.01.2015 22:58

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

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

alfa10 написал:

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

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

Неактивен

   #515
03.01.2015 23:14

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Morych написал:

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

У меня сейчас на финише такой код:

Код:

<<set $place = []>>

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

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

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

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

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

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

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

Результаты гонки:

<<set $i = 0>>

<<loop $place.length>>

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

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

    <<set $i++>>

<<endloop>>

[[Преследование|Преследование]]

Где надо в массиве добавить 0?

Неактивен

   #516
04.01.2015 01:42

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

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|Ваня"

Неактивен

   #517
04.01.2015 11:00

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

и такой цикл если-то на каждого из 72 спортсменов?

Неактивен

   #518
04.01.2015 12:55

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

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>>

Неактивен

   #519
04.01.2015 13:34

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

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


Прикрепленные файлы:
Биатлон_тест.sm, Размер: 4,367 байт, Скачано: 119

Неактивен

   #520
04.01.2015 17:22

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

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

Неактивен

   #521
04.01.2015 23:30

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

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

alfa10 написал:

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

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


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

Неактивен

   #522
05.01.2015 12:07

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

Спасибо, буду вкуривать! smile

Неактивен

   #523
05.01.2015 12:41

alfa10
Участник (+1, -1)
Зарегистрирован: 29.10.2013
Сообщений: 84

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

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

Неактивен

   #524
05.01.2015 13:08

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

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

alfa10 написал:

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

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

Неактивен

   #525
05.01.2015 14:26

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

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

alfa10 написал:

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

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

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

Неактивен

Powered by PunBB
© copyright 2001–2018 iFiction.Ru