Функция «Победитель»
Что происходит в функции Победитель?
В начале дуэли все участники живы: все три элемента вектора Статус принимают значение “жив”[50]. Далее проводится жеребьевка: определяется направление очередности выстрелов (если переменная Очередь равна единице, то очередность идет в таком направлении ...0®1®2®0®1®2.., если минус единице – ...0®2®1®0®2®1) и определяется первый стреляющий (переменная Стрелок). Кроме того, обнуляется переменная Убийство, по которой прерывается цикл выстрелов в дуэли.
Математическая модель дуэли опирается на цикл с выходом из середины (while ... break…): дуэль продолжается, пока не будут сделаны два результативных выстрела. В теле цикла while определяется Цель – самый меткий противник, которого убивают (СтатусЦель
¬ “убит”), если, во-первых, не промахиваются (МеткостьСтрелок
> rnd(1)) и (And), во-вторых, не (Not) стреляют намеренно в воздух. Второе имеет место при хитрой тактике стреляющего (ТактикаСтрелок = 2) и (And), если метких противников более одного.
Определение следующего стреляющего ведется в цикле с постпроверкой (while ... break): цикл прерывается, когда, перебирая очередь, отмеченную выше (...0®1®2®0®1®2.. или ...0®2®1®0®2®1...), «натыкаются» на живого участника.
Возвращает функция Победитель номер участника дуэли (0, 1 или 2), оставшегося в одиночестве (значение переменной Стрелок по выходу из цикла).
Функция Победитель возвращает непредсказуемое целочисленное значение 0, 1 или 2, так как в ней в трех местах вызывается встроенная в Mathcad функция rnd, которая возвращает псевдослучайное число в интервале от нуля до значения аргумента функции rnd. Этот аргумент у нас равен либо единице (случайный выбор очередности выстрелов и имитация выстрела с вероятностью попадания, пропорциональной меткости стреляющего), либо трем (случайный выбор первого стреляющего – здесь дополнительно работает встроенная функция floor, возвращающая у положительного вещественного числа его «пол» (в смысле не «потолок» – по-английски a floor): floor(0.54), floor(1.82), floor(2.48) = 0...