RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2427107 views

Белый Шарик #100 03.08.2015 10:11 (10 years ago)

Таки созрел для применения массива, но что-то без успехов. )

:opp
win[1] = rand (1,15)
win[2] = rand (1,15)
fail[1] = rand (1,15)
fail[2] = rand (1,15)
fail[3] = rand (1,15)
if win = fail : jump 'opp'
gt 'nex2'

По моему разумению

if win = fail : jump 'opp'

Сверит весь массив переменных win на равенство всему массиву fail?
Но код при исполнении почему-то зависает.

Что значит сверит?

fail <> fail[1]+fail[2]+fail[3]

Распишите подробнее, что вы хотели получить

В вашем случае win=0 и fail=0, поэтому уходит в вечный цикл.

PS. Забыл добавить, что win=win[0]. Сразу старайтесь привыкнуть, что массивы нумеруются с 0, а не 1. Даже если вы зададите только win[1] и win[2] - размер массива будет равен 3, ибо не назначенная win[0] останеться с нулем по умолчания.

Белый Шарик #100 03.08.2015 10:42 (10 years ago)

Ааа… Тоесть я неправильно понимал массив вообще.
Ну вообще хочу что бы выпадении условия, когда win[1] равен любому fail или когда win[2] равен любому fail происходил проброс рандома, пока не выпадет условие, когда win[1] И win[2] не совпадают ни с одним fail.

Я думал что fail - обобщенный подраздел для всего массива. Как с помощью массива задать проверку нужного мне условия?

Просто раньше громоздил формулы без массива

if win1 = fail1 or win1 = fail2 or win1 = fail3 : jump'opp'
if win2 = fail1 or win2 = fail2 or win2 = fail3 : jump 'opp'

Но когда в условии win1, win2, win3, win4 и 12 разных fail. Такие громозеки городить расхотелось. Вот и подумал, как бы массивом это облегчить.

Если такая сложная проверка между двумя большим массивам - проще сделать отдельную функцию для проверки.

1. Сначала определим оба массива win[0]… win[x] и fail[0]…fail[x]

2. Напишем функцию проверки, где начиная с win[0] и заканчивая winARRSIZE[win]-1 идет проверка на равенство с каждым элементом из массива fail[].
Грубо говоря, если у вас win[2] и fail[4], пишем вложенный цикл и сравниваем:
win[0]=fail[0], win[0]=fail[1],win[0]=fail[2],win[0]=fail[3],win[0]=fail[4]
win[1]=fail[0], win[1]=fail[1] и тд.
Если все нормально - выводим result=-1, если нет, то result=0

3. В коде локации пишем

if FUNC('функция проверки'):
   !все ок
else
   !не ок, прыгаем на метку, повторяем пункт 1.
end
:opp
KILLVAR 'win'
KILLVAR 'fail' 
win[] = rand (1,15) 
win[] = rand (1,15) 
fail[] = rand (1,15) 
fail[] = rand (1,15) 
fail[] = rand (1,15)
index_win = 0
    :labelloop_index_win
    if index_win <= ARRSIZE('win')-1: 
        if ARRPOS('fail',win[index_win]) <> -1: jump 'opp'
        index_win += 1 
        jump 'labelloop_index_win'
    end
gt 'nex2'

я уже по новой начал писать игру с этим кодом и все равно при обращении на локацию сон плеер зависает(

evp:

if ARRPOS(’fail’,win[index_win]) <> -1: jump ‘opp’

Точно, я почему то решил, что функция работает только с строковыми переменными.

Белый Шарик #100 04.08.2015 03:37 (10 years ago)

evp,
Распишите пожалуйста понятным языком (имею в виду русским языком), какая строка, что выполняет в этом фрагменте кода

if index_win <= ARRSIZE('win')-1: 
        if ARRPOS('fail',win[index_win]) <> -1: jump 'opp' 
        index_win += 1 
        jump 'labelloop_index_win' 
    end

ARRSIZE и ARRPOS часто вижу в кодах, не реже чем таинственный ARGS :) Но пока совершенно не вникал что это такое.
Кстати у меня с Кусповским хелпом проблемы, не понимаю что означают некоторые пояснения к операторам. Что значит например выражение - “Возвращает значение массиву”? Откуда возвращает?

:labelloop_index_win
    if [b]условие[/b]:
        [b]выполняем код[/b]
        index_win += 1
        jump 'labelloop_index_win'
    end

Цикл, в данном случаем от 0, до ARRSIZE(’win’)-1 (размер массива win минус 1)
К примеру, у тебя массив win состоит из 3х элементов, win[0], win[1] и win[2]
ARRSIZE(’win’) - выдаст 3 (по количеству переменных в массиве, но так как массив начинается с нуля, то ‘крайним’ элементом будет x-1, 2 в данном примере.

index_win = 0

Обнуляем переменную, если есть. Первый ‘шаг’ нашего цикла будет 0, если цикл пройдет, но еще остаются переменные в массиве - увеличим на единичку и повторим. Так для каждого элемента массива (от 0 до 2, к моему примеру)

В данном цикле, мы проверяем все переменные в массиве win от 0

if ARRPOS('fail',win[index_win]) <> -1: jump 'opp'

ARRPOS ищет есть ли в другом массиве - fail строка равная переменной win[с текущим индексом]. Если строка не найдена, т.е. в массиве fail нет переменной win[x]- функция выдает результат -1 и можно переходить к следующему по порядку win[x+1].
А если выдает результат отличный от -1, значит одна (или несколько, но в данном условии нам это не важно) переменных из массива fail равны текущей win[x] и по вашим условиям - jump ‘opp’ прыгаем обратно на инициализацию этих переменных.

А вообшем, советую еще пару раз перечитать раздел справки про массивы

ps. Перечитал свой пост, как-то сумбурно все расписал. Простите если еще больше запутал :)

XaHK:

я уже по новой начал писать игру с этим кодом и все равно при обращении на локацию сон плеер зависает(

Дайте пример в файле.

Babai, спасибо.
Белый Шарик, я немного подправил ваш вопрос. Потому, что функции могут возвратить значения вам и только вам, а не каким-то массивам.

Белый Шарик:

Что значит например выражение - “Возвращает значение массиву”? Откуда возвращает?

А теперь отвечу.
Чтобы воспользоваться той или иной функцией, вы должны правильно задать ей вопрос, т.е. сообщить ей некие параметры. В программировании (и математике) эти параметры называются аргументами. Для примера возьмем функцию, вычисляющую пройденный путь: S=v*t. Чтобы получить у нее нужный ответ, надо ей сообщить скорость v и время t. Это и есть наши аргументы. Вы сообщаете функции аргументы, а она взамен сообщает вам результат.

В программировании последнее предложение звучит так: вы передаете функции аргументы, а она взамен возвращает вам результат.

Справка по QSP:

ARRSIZE([$имя]) - функция возвращает число элементов в массиве с названием [$имя].

Вы передаетефункции ARRSIZE имя массива, она возвращаетего размер. Чтобы реально увидеть результат, возвращаемоефункцией значение надо присвоить некоей переменной:

n = ARRSIZE('$a')

В переменную nбудет записан размер массива $a.

Кстати,

Белый Шарик:

ARRSIZE и ARRPOS часто вижу в кодах, не реже чем таинственный ARGS Но пока совершенно не вникал что это такое.

“таинственные” ARGS - это и есть аргументы :)

!Локация Path
$RESULT = ARGS[0]*ARGS[1]

Мы создали свою функцию в локации Path. А теперь воспользуемся ее помощью.

!Скорость
v=65
!Время
t=2
!Пройденный путь
S=FUNC('Path', 65, 2)

В строке

S=FUNC('Path', 65, 2)

мы сообщаем интерпретатору QSP, что мы хотим передатьфункции Path (первое значение в скобках) аргументы ARGS[0] и ARGS[1], равные 65 и 2 сответственно (второе и третье значения в скобках), а возвращаемыйфункцией результат поместить в переменную S.

Белый Шарик #100 04.08.2015 14:15 (10 years ago)

Babai,
evp,
Благодарю. В теории все вроде бы понял. Но боюсь, что сам пока применять подобное не решусь. ))))
Не хватает пока видимо програмистского мышления что ли… )))) Более рациональный метод иногда приходит в голову при написании кода, но сделанную примитивную громаду уже лень переписывать. Вообще при первоначальном знакомстве с Куспом именно массивы в самоучителе вызвали больше всего вопросов и непоняток. Надо как-то поэкспериментировать будет с ними в будущем.

upd: Хе хе хе. Глаза боятся, а руки делают. Следующую задачу в игре таки начал через массивы с применением arrpos решать. ))

вот пример12.qsp

XaHK, вы совсем не понимаете, что вы делаете? Код не надо просто копировать:) Его надо понять. У вас в 2-х локациях один и тот же отрывок кода. Он должен быть только в одной. А именно - в ‘стат’, именно там результат его исполнения используется. Из локации ‘календарь’ уберите этот отрывок. И, вообще, почему в календаре осуществляется вывод статистики? Эта локация не для того. Уберите и вынесите в отдельную локацию все, что касается работы с окном дополнительного описания. И вызывайте эту локацию из ‘стат’ после просчета всех характеристик, то бишь в конце.

12.qsp

evp,
спс

Log in or Register to post comments.