Счетовод
Простой помощник банкира в настольных экономических играх «Монополия», «Конверсия 1» и прочих, основанных на взаимных расчётах при помощи игровой валюты; позволяет удобно вести учёт перечислений между игроками и банком без возни с наличными средствами.
Распределение регистров
Данные пользователя:
- 0: число игроков — до 13;
- 1, 2…: счета игроков.
Служебные (используются для нужд самой программы):
- e: косвенное обращение к регистрам.
Неиспользуемые:
Все после занятых под счета игроков и до d включительно.
Игровой процесс
Перед началом игры можно на всякий случай перевести программу на шаг 00 командой В/О (после загрузки программы и при нормальном её использовании это производится автоматически).
В #0 заносится n — число игроков (n X→П 0).
Игроки получают последовательные номера 1, 2, …, n (которые лучше всего присваивать согласно очерёдности хода). Средства игрока хранятся в регистре с его номером (номерам 10, 11, 12, 13 соответствуют #a, #b, #c, #d). В любой момент можно проверить текущее состояние счёта командой П→X номер.
Номер 0 зарезервирован за Банком; его счёт — бесконечный (не содержит суммы, которую можно было бы просмотреть).
Начиная новую партию регистры счетов следует либо заполнить начальными суммами денег, либо обнулить (CX X→П 1 X→П 2 …), а начальные средства внести, используя
Перечисления
делаются следующим образом:
- номер счёта, откуда списываются средства → #Z;
- номер счёта, куда поступают эти средства → #Y;
- перечисляемая сумма → #X;
- запуск командой С/П.
Как правило, это будет выглядеть так: отправитель В↑ получатель В↑ сумма С/П.
Примечание: если задать номер счёта нецелым числом, дробная часть будет отброшена.
Программа проверяет, что:
- номера́ счетов отправителя и получателя допустимы (находятся в диапазоне от 0 до количества игроков включительно);
- переводимая сумма неотрицательна;
- для отправителя-игрока переводимая сумма не превышает наличных средств на его счету; для отправителя-Банка эта проверка не производится.
Возможные результаты:
- Номер получателя (0, если получатель — Банк) — все проверки успешно пройдены, со счёта отправителя списана, а к счёту получателя прибавлена заданная сумма. В #Y находится текущий баланс получателя (если получатель — игрок), либо перечисленная сумма (если получатель — Банк); это значение можно просмотреть, нажав ↔.
- Отрицательное число — заданная сумма отрицательна, либо превышает находящиеся на счету отправителя средства (последнее актуально только для отправителя-игрока; Банк обладает бесконечным запасом денег).
- ЕГГОГ — был указан недопустимый номер счёта отправителя и/или получателя. В этом случае перед продолжением необходимо нажать В/О.
Независимо от исхода дальше можно переходить к следующему перечислению.
Если выполненное перечисление содержало допустимые, но неверные данные (не тот номер участника, не та сумма), его можно отменить перечислив ту же сумму обратно (поменяв местами отправителя и получателя).
Рекомендации
- Индикатор имеет всего 8 разрядов мантиссы. Если в игре фигурируют исключительно суммы, кратные 10/100/1000…, то на счетах лучше оперировать десятками/сотнями/тысячами денежных единиц, отбрасывая соответствующее количество конечных нулей, чтобы избежать переполнения и потери точности для очень больших сумм.
- В свободных регистрах можно хранить дополнительные параметры. Например в «Конверсии 1» помимо основной валюты — рублей — используются доллары. Если фактическое число игроков не превышает 6, можно учитывать и их долларовые балансы, введя для каждого участника, включая Банк, дополнительный счёт и указав соответственно большее количество игроков (n × 2 + 1); при этом контроль того, что переводы осуществляются только между счетами одного типа (с рублёвых на рублёвые, с долларовых на долларовые), возлагается на игроков. Также следует иметь ввиду, что «бесконечные деньги» доступны только счёту № 0.
Пример использования
Двое играют в «Монополию».
Подготовка: В/О (переход к шагу 00); 2 X→П 0 (указание числа игроков); CX X→П 1 X→П 2 (обнуление счетов игроков).
Банк перечисляет игрокам начальные средства — по 3000:
0 В↑ 1 В↑ 3 0 0 0 С/П — 1-му.
0 В↑ 2 В↑ 3 0 0 0 С/П — 2-му.
1-й игрок попадает на некоторую улицу и приобретает её у Банка за 70:
1 В↑ 0 В↑ 7 0 С/П
2-й игрок попадает на эту же улицу и платит 10 за проход по ней владеющему ей 1-му игроку:
2 В↑ 1 В↑ 1 0 С/П
И так далее.
Исходный код
Fx≥0 44 ↔ К[x] П→X0 ↔ − FВx × F√
. В↑ F⟳ F⟳ ↔ К[x] Fx≠0 34 П→X0 ↔
− FВx × F√ . X→Пe F⟳ В↑ КП→Xe ↔
− Fx≥0 44 КX→Пe F⟳ ↔ Fx≠0 44 X→Пe ↔
КП→Xe + КX→Пе ↔ С/П БП 00
Программу разработал, перевёл в формат эмулятора и составил эту инструкцию А. Лаврик — 2025-03-17