Как сделать?
…
mkir,
На самом деле всё с массивами очень просто.
Массив — это ящик, в котором есть много-много ячеек.
Каждая ячейка может содержать лишь одно значение.
Чтобы получить значение определённой ячейки, нужно указать её номер (да-да, в квадратных скобках. Очень легко запомнить, потому что квадратные скобки по форме напоминают ящик).
Нумерация ячеек всегда ведётся с нуля.
Размер массива — это число ячеек до последней занятой.
Таким образом, номер последней ячейки всегда можно узнать так:
номер_последней_ячейки = размер_массива - 1
В принципе, этого должно хватить для большинства игр, тем более с картами.
Первая задача.
Spoiler
Как бы я начал. Во-первых, колода. Колода А. Представим новую, нераспакованную колоду в 54 карты. Где она лежит? В футляре, в коробке, в ящике. Каждая карта в этом ящике занимает строго своё место — абстрактную ячейку. Таким образом колоду можно написать так:
! обрати внимание, нумерация начинается с нуля
$deck_a[0] = 'двойка треф'
$deck_a[1] = 'тройка треф'
$deck_a[2] = 'четвёрка треф'
! и так далее до 54-й карты, которая лежит в ячейке с номером 53
$deck_a[53]='чёрный джокер'
Теперь из этой колоды выдаём карты игрокам. Число игроков пока ограничим двумя, для наглядности.
В любой карточной игре игрок может держать в руке некоторое количество карт (иногда сколько угодно). У нас — три, согласно условиям задачи.
В колоде (массив $deck_a) карта занимает ровно одну ячейку. Логично предположить, что и в руке карта занимает примерно столько же. Значит рука — это тоже массив.
! рука первого игрока — массив $hand_1
! у нас есть 54 ячейки в массиве $deck_a с номерами от 0 до 53
! что мы можем? Можем получить случайное число от 0 до 53
! но 53 — это номер последней ячейки, а он, как известно, вычисляется из размера массива.
! значит мы выбираем случайное число от 0 до номера последней ячейки массива
i_rand=rand(0,arrsize('$deck_a')-1)
! делаем мы это не просто так. Далее мы в этом убедимся
! Итак. Вкладываем карту в руку игроку.
$hand_1[0]=$deck_a[i_rand]
! теперь, чтобы карта больше не попадалась в колоде, убираем её. Вместе с ячейкой
killvar '$deck_a',i_rand
! номера ячеек при этом реорганизуются. Если мы выбросили 6-ю, то 7-ая станет 6-ой, восьмая — седьмой и т.д.
! а последняя будет под номером 52
! вот для чего мы используем формулу arrsize('$deck_a')-1, чтобы вычислить номер последней ячейки и не забивать
! лишними цифрами голову
! следующая карта
i_rand=rand(0,arrsize('$deck_a')-1)
$hand_1[1]=$deck_a[i_rand]
killvar '$deck_a',i_rand
! видим, что операции повторяются, меняется только номер ячейки для руки. Но добавим и третью карту
i_rand=rand(0,arrsize('$deck_a')-1)
$hand_1[2]=$deck_a[i_rand]
killvar '$deck_a',i_rand
! Вот так. Три карты уже есть у первого игрока, и мы видим, что записи повторяются, можно сделать цикл
! для второго игрока так и сделаем
i=0 & ! счётчик и одновременно номера ячеек в руке второго игрока
:for
if i<3:
! если число i меньше 3
! находим случайную карту в колоде
i_rand=rand(0,arrsize('$deck_a')-1)
! добавляем карту в руку
$hand_2[i]=$deck_a[i_rand]
! выбрасываем карту из колоды, вместе с ячейкой
killvar '$deck_a',i_rand
! увеличиваем значение счётчика
i+=1 & ! это то же самое, что i=i+1
! повторяем процедуру
jump 'for'
end
Первая задача решена. Думаю не составит труда проделать то же самое для других игроков.
Если число игроков неизвестно заранее (например, выбирается случайным образом, или иным), можно воспользоваться оператором dynamic
np_rand=rand(3,6) & ! число игроков (определили случайным образом)
np=1 & ! номер игрока и счётчик внешнего цикла
:for_n
if no np>np_rand:
! пока номер игрока не превысит число игроков
! выполняем раздачу карт через dynamic
dynamic "! это код, который будет выполнять оператор dynamic
! перед выполнением, вместо <<np>> будет подставлено число
i=0 & ! счётчик и одновременно номера ячеек в руке игрока номер np
:for_i
if i<3:
! если число i меньше 3
! находим случайную карту в колоде
i_rand=rand(0,arrsize('$deck_a')-1)
! добавляем карту в руку игроку номер np
$hand_<<np>>[i]=$deck_a[i_rand]
! выбрасываем карту из колоды, вместе с ячейкой
killvar '$deck_a',i_rand
! увеличиваем значение счётчика
i+=1 & ! это то же самое, что i=i+1
! повторяем процедуру
jump 'for_i'
end"
! увеличиваем счётчик внешнего цикла
np+=1
! повторяем
jump 'for_n'
end
Это всё не сложно и не громоздко. Просто я написал очень много комментариев. Если их удалить, код раздачи карт в руки займёт с десяток строк.
Спасибо всем! Буду долго думать)
Ну да, динамически меняющийся массив! Как я забыл. Раньше (очень давно) таких не было, и по этому все приходилось делать ручками. Здорово)))
Что делать если мне выдает ошибку знак [:] не найден в строке 509, всё бы ничего но у меня всего 500 строк
Гм, 500 строк для одной локации это дофига ) С номерами строк были какие-то косяки в плеере.
Предлагаю разбить локацию на части и вызывать эти части через GOSUB, заодно и код упростишь, и ошибку быстрее найдёшь.
Ну либо “Анализатором кода” пройтись.
По-моему в сообщениях об ошибках называется строка не в локации, а в целом. Т.е. если перевести файл игры в txt, то по строкам искать нужно именно там. Простите, если слишком кэп. А анализатор действительно очень помогает с подобными проблемами!
Nex,
Ошибку так и не удалось найти. Самое просто решение просто переделать всю локацию и попытаться убрать лишнее
NaViGaToR,
обрати внимание на многострочные операторы, такие как IF и ACT.
В конце строки для таких операторов должно стоять двоеточие.
Как можно проверить кусок написанного кода не запуская игру сначала?
Например: на 15-ой локации добавил кусок кода, как можно проверить только этот кусок кода, не проходя до него с самого начала игры…
P.S. я новичок, так что прошу сильно не плеваться в меня) если есть где-то уже такая тема, прошу кинуть ссыль.
Просто на первой локации сделайте переход в нужную и измените все переменные условия так, чтобы нужный кусок был доступен. Проверите - потом тестовый переход можно и удалить.
Друзья, как сделать, чтобы в игре было фиксированно-определенное расположение и размер всех окон, а также размер и тип шрифта? я полагал, что эти данные сохраняются при запуске игры в файле .qproj - и что достаточно этот файл прикреплять к основному, тогда и у всех игроков будет при запуске то, что нужно. Но вот вчера делал новый проект, сегодня запустил старый, находящийся, само собой, в другой папке - а в нем и шрифт и расположение-размер окон как в новом.
Хорошо, если локаций 15 этот способ хорош, а если уже пол игры сделано? Как тогда быть? Опять все условия на первой прописывать, так их всех и не запомнишь… Или я что-то не так понимаю(
HITD:
Хорошо, если локаций 15 этот способ хорош, а если уже пол игры сделано? Как тогда быть? Опять все условия на первой прописывать, так их всех и не запомнишь… Или я что-то не так понимаю(
Не важно сколько в игре локаций, просто перетаскиваешь нужную вверх, делаегь ее самой первой, так как плеер воспроизводит сначала ту локацию что стоит первой. Например на 101-й локации у тебя есть действие “Рубить мечем орков”, с переменной if меч=1: но при этом меч гл.герой может раздобыть только на 56-й локации. Если ты 101-ю локацию установишь первой, то естественно ты не проверишь действие “Рубить мечем орков”, так как меча у тебя нет. Для этого можешь временно дописать переменную в 101й локации - меч=1.
Ну, так надо вводить только то, что имеет значение для конкретного момента тестирования, или там прям тысячи всевозможных условий? Я, конечно, не вижу вашей игры, но у меня вполне получалось таким образом тестировать свою, например, последнюю, в которой, ну, поверьте, очень много локаций и строчек кода. + есть еще один способ, мне его здесь когда-то и подсказали:
1. Добавить строку ввода - в первой локации прописать, напр.: $usercom=‘usercom’
2. Добавить локацию usercom
3. В этой локации прописать:
if USER_TEXT = 'Код':
$cheat = input ("Введите исполняемый код")
dynamic $cheat
end
4. Теперь в самой игре можно ввести в командной строке “Код” - и уже там, что не введете, будет проигрываться как строчка кода.
Например, нужно мгновенно, попасть в какую-то локацию, пишите - “gt ‘локация’”
А если еще что-то изменить параллельно, переменные, предметы добавить-убрать, то то же самое “hp=100&money+=100&addobj’Важная вещь’>’локация’”
Единственное неудобство, что можно только в строчку писать, с &
как сделать, чтобы в игре было фиксированно-определенное расположение и размер всех окон, а также размер и тип шрифта?
mkir,
1. Запустить игру, настроить размеры окошек по вкусу.
2. Закрыть плеер.
3. Скопировать файл qspgui.cfg из папки плеера в папку игры.
4. Проставить для файла qspgui.cfg в папке игры атрибут “только чтение”.