Статья Автор: Лебедев Дмитрий

TUZ_5-07 Игра Вари

TUZ_5-07 Игра Вари

TUZ_5-07 Игра Вари
5.7 Игра Вари
Вари (оваре) – африканская настольная игра со множеством вариаций, самая популярная,
пожалуй, из семейства игр манкала (манкала - семейство настольных игр для двух игроков).
В игре используется игровая доска с двумя рядами лунок.
Игроки могут «засевать» и «захватывать» семена в лунках.
В этом задании дается доска с 2n лунками (домами).
Первый ряд с n лунками принадлежит первому игроку, а второй – второму.
Первоначально в каждой лунке находится определенное количество семян и их нужно собрать.
Если в лунке находятся 2 или 3 семени, то их можно захватить.
Рассмотрим раунд игры на примере.
Пусть дана доска board = [0, 2, 1, 2] и дом house = 1.
Нужно вывести массив, отражающий изменения после сбора семян.
  • Первая фаза – сбор урожая и посев – начинается с позиции house + 1 
    и продолжается до индекса board [house] (т. е. выполняется столько шагов, сколько семян в лунке board [house + 1]). Значение board [house] обнуляется (из лунки извлекаются два зерна),
    поэтому board = [0, 0, 1, 2]. Далее одно зерно засевается во второй элемент (напомню, что счет начинается с 0), поэтому board = [0, 0, 2, 2], и еще одно зерно засевается в третий элемент,
    поэтому board = [0, 0, 2, 3]. Вторая и третья лунки содержат 2 и 3 зерна соответственно,
    поэтому они захватываются.
    В результате на выходе получается массив board = [0, 0, 0, 0] и игра завершается.
Ваша задача: написать функцию, которая принимает доску и возвращает массив,
показывающий изменения после сбора урожая и посева.
В табл. 5.7 показаны ожидаемые результаты для некоторых входных данных.
Таблица 5.7. Некоторые ожидаемые результаты для задачи определения состояния игровой доски в африканской игре вари
Board, house Ожидаемый результат 
2, 1, 2, 0
1
2, 0, 0, 0
1, 4, 5, 6
1
2, 0, 7, 7
7, 7, 7, 68, 0, 1, 0
18, 18, 18, 0, 0, 1, 1
2, 0, 7, 7
1
2, 0, 7, 7

Алгоритм
Алгоритм использует циклы while и for для обхода игровой доски, посева семян в дома
и захвата семян противника, если это возможно.
  1.  Принимается список board, представляющий текущее состояние игровой доски,
    и целое число house, представляющее индекс лунки – дом, – откуда начинаются сбор урожая и посев.
  2. Определяется индекс last_index последнего дома на доске вычитанием 1 из длины списка board.
  3. Количество семян в выбранном доме сохраняется в переменной seeds_to_sow.
  4. В переменную current_index (текущий индекс) записывается индекс дома, следующего за выбранным.
  5. Количество семян в выбранном доме устанавливается равным 0.
  6. Пока значение seed_to_sow больше 0, выполняются следующие действия:
  • а) если текущий индекс (current_index) выходит за пределы последнего индекса,
    то выполняется переход к первому индексу;
  • б) если текущий индекс равен индексу дома, откуда были извлечены семена для посева,
    то этот индекс пропускается;
  • в) в текущий дом добавляется одно семя;
  • г) количество семян для посева (seed_to_sow) уменьшается на единицу;
  • д) выполняется переход к следующему дому увеличением
    текущего индекса (current_index) на единицу;
  • е) по достижении последнего дома в своем ряду происходит переход к последнему дому
    в ряду противника и движение продолжается от конца к началу ряда;
  • ж) для каждого дома в ряду противника выполняются следующие действия:
  1. если в доме 2 или 3 семени, то они захватываются и их количество в доме
    устанавливается равным нулю;
  2. если семян в доме противника больше, то они не захватываются.
     7. Возвращается обновленный список board.


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать