Чуть-чуть въехал. А вот смотри, к примеру, имеем два спортсмена (вводим переменные $имя и $имя1). Один прошел трассу за 70 ходов, а второй за 64 хода.
<<set $имя = Вася>>
<<set $имя1 = Петя>>
<<set $счетчик_хода_имя = 0>> #персональный счетчик хода спортсмена Васи
<<set $счетчик_хода_имя1 = 0>> #персональный счетчик хода спортсмена Пети
...
:: В след. параграфе получаем финишные значения:
<<set $счетчик_хода_имя = 70>>
<<set $счетчик_хода_имя = 64>>
Теперь надо чтобы выдало результаты по местам: 1 место - получается занял второй спортсмен (Петя), 2 место - первый спортсмен (Вася).
Неактивен
Всё то же самое, как и со временем, только вместо времени добавляем в массив $place счётчики ходов вместе с именами:
<<set $place = []>> --- создадим новый массив
<<set $place.push($счетчик_хода_имя + "|" + $имя)>> --- добавили в массив счетчик ходов и имя первого спортсмена (значения разделены символом "|")
<<set $place.push($счетчик_хода_имя1 + "|" + $имя1)>> --- добавили в массив счетчик ходов и имя второго спортсмена
<<set $place = $place.sort()>> --- отсортировали массив
Теперь в массиве $place спортсмены расположены по возрастанию значений их ходов: нулевой элемент - первое место, первый элемент - второе место и так далее. Чтобы всё работало правильно, нужно перед занесением значений в массив $place убедиться, что число символов для параметра сортировки у всех спортсменов будет одинаково. Т.е. если число ходов может быть от 10 до 99 - все хорошо, но если число ходов может быть 100 и больше, то и все прочие счетчики ходов нужно дополнить до трёх символов: 064, 070, 125.
Неактивен
Делаю так:
: Начало
<<set $имя = 'Вася'>>
<<set $имя1 = 'Петя'>>
<<set $счетчик_хода_имя = 0>>
<<set $счетчик_хода_имя1 = 0>>
[[Ход игрока|Просчет]]
: Просчет
<<random $кубик = 50>>
<<set $счетчик_хода_имя = $счетчик_хода_имя + $кубик>>
[[Ход соперника|Просчет соперника]]
: Просчет соперника
<<random $кубик = 50>>
<<set $счетчик_хода_имя1 = $счетчик_хода_имя1 + $кубик>>
[[Финиш|Финиш]]
: Финиш
А как тут код прописать?
И еще нужно, чтобы разница, полученная между числами плюсовалась в след. параграфе к значению $счетчик_хода_имя. Например, Петя прошел гонку за 64 хода, а Вася за 70. Разница между ними равна 6. Значит в след. параграфе у Пети будет к счетчику хода прибавлено значение 6, а у Васи это значение будет равно 0.
Неактивен
Тогда лучше сразу составлять код из расчёта, что спортсменов много. Но прежде хотелось бы подробнее узнать логику игры: по пунктам что за чем должно происходить, включая то прибавление разницы ходов.
Неактивен
Morych написал:
Тогда лучше сразу составлять код из расчёта, что спортсменов много. Но прежде хотелось бы подробнее узнать логику игры: по пунктам что за чем должно происходить, включая то прибавление разницы ходов.
Если знаком с биатлоном то будет легче понять Если нет, то попытаюсь логику передать:
Будет, скажем 12 сборных, в каждой по 6 спортсменов. Итого - 72 спортсмена. Сперва все бегут спринт (то есть, тут все ходят по очереди, кто затратил на прохождение трассы меньше всего времени - тот победитель. Далее все бегут преследование. Тут разница (отставание от победителя спринта) ходов должна записываться в переменную длины пройденной трассы. То есть, если Петя в спринте был лучше Васи, и прошел за 64 хода трассу, а Вася за 70, то в преследовании Петя должен при старте иметь показатель <<$длина_пройденной_трассы_Петя = $длина_пройденной_трассы_Петя + 6>>. То есть, он раньше на 6 ходов, чем Вася стартанул в гонке. При чем, вместо "6" должна наверное быть некая переменная, типа <<$отставание_от_первого_места_в_спринте>>, которая на финише спринта формировала бы сразу разницу отставаний между местами автоматом. Вот как то так должно быть!
Отредактировано alfa10 (01.01.2015 22:33)
Неактивен
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.
Это то, что было нужно?
Неактивен
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.
Это то, что было нужно?
Блин, вообще не пойму код
Неактивен
<<set $ходы_спринт = [64, 70, ... 60]>> (итого в массиве 72 элемента)
А как система поймет, кто за сколько ходов прошел спринт? Я так понимаю, в массиве уже конкретные результаты тут указаны?
теперь перед началом преследования у каждого спортсмена уже установлено стартовое число ходов, а у лидера спринта это число будет = 0.
Так у лидера наоборот, должен быть бонус перед другими, он же раньше второго номера уйдет на трассу на n-ходов.
Неактивен
Вот получил такой вот результат при таком вот коде. Места определились некорректно!
Неактивен
alfa10 написал:
<<set $ходы_спринт = [64, 70, ... 60]>> (итого в массиве 72 элемента)
А как система поймет, кто за сколько ходов прошел спринт? Я так понимаю, в массиве уже конкретные результаты тут указаны?
Да, все верно, тут указаны конкретные результаты после спринта просто для примера. Перед спринтом этот массив будет содержать все нули, а во время спринта значения поменяются в зависимости от характеристик спортсменов, каких-то внешних факторов, выбора игрока или чего-то еще.
alfa10 написал:
теперь перед началом преследования у каждого спортсмена уже установлено стартовое число ходов, а у лидера спринта это число будет = 0.
Так у лидера наоборот, должен быть бонус перед другими, он же раньше второго номера уйдет на трассу на n-ходов.
Нам нужно определиться, что считать результатом. Если число затраченных ходов, как в спринте, то минимальное значение ходов будет лучшим результатом. Поэтому стартовое значение = 0 - это и есть самый лучший бонус, т.е. лидер стартует сразу, без ожидания. А тот, кто отстал от лидера в спринте на 10 ходов, и у кого значит стартовое значение ходов = 10 - тот, получается, как бы ждет 10 ходов прежде чем начать преследование.
Неактивен
alfa10 написал:
Вот получил такой вот результат при таком вот коде. Места определились некорректно!
Это как раз тот случай, о котором я говорил в этом сообщении. В массив для сортировки нужно заносить не "4", а "04"!
Неактивен
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?
Неактивен
Если число ходов не может быть больше 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|Ваня"
Неактивен
Да, тут надо использовать цикл и массивы. И не забыть про переменную $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>>
Неактивен
Morych, а посмотри плиз мой сейв. Как тут код можно упростить?
Неактивен
Еще вопрос по другому моему проекту. Нужно сделать жеребьевку команд в турнирной сетке. Сперва будет 32 команды. Отсюда вопросы:
1) как сделать жеребьевку команд в турнирной сетке (1/32 финала)? Команды не должны повторяться
2) как сделать рандомные результаты матчей между соперниками? Более сильные команды должны иметь бонус при расчете результатов перед более слабыми командами.
3) как вывести из дальнейшей жеребьевки (1/16 финала) проигравшие команды?
Неактивен
alfa10 написал:
Morych, а посмотри плиз мой сейв. Как тут код можно упростить?
Посмотрел и все переписал
Неактивен
alfa10 написал:
Еще вопрос по другому моему проекту. Нужно сделать жеребьевку команд в турнирной сетке. Сперва будет 32 команды. Отсюда вопросы:
1) как сделать жеребьевку команд в турнирной сетке (1/32 финала)? Команды не должны повторяться
2) как сделать рандомные результаты матчей между соперниками? Более сильные команды должны иметь бонус при расчете результатов перед более слабыми командами.
3) как вывести из дальнейшей жеребьевки (1/16 финала) проигравшие команды?
Нечто похожее - рандомная выборка неповторяющихся элементов - есть в этой части учебника. Можно там пример кода глянуть. Делается при помощи массива и его метода splice:
- загоняем все 32 команды в общий массив;
- в цикле получаем рандомный индекс массива (рандом по длине);
- методом splice вырезаем этот рандомный элемент из общего массива.
На следующем шаге цикла рандом будет выбирать уже только из оставшихся команд.
Неактивен
alfa10 написал:
а как работать с таблицами можно? Можно где-нибудь примеры посмотреть?
Все есть в руководстве пользователя:
<<row 'Заголовок таблицы'>>
<<row 'Столбец 1' 'Столбец 2'>>
<<row 'Столбец 1' 'Столбец 2' noborder>>
Неактивен