- •Министерство образования и науки Российской Федерации
- •Разработка программы для решения задачи «игра умножения»
- •Задание
- •Содержание
- •Введение
- •1 Постановка задачи
- •2 Анализ поставленной задачи
- •2.1 Основные объекты задачи и их взаимодействие
- •2.2 Решение задачи – вариант 1
- •2.3 Решение задачи – вариант 2
- •3 Описание результатов разработки
- •4 Руководство пользователя
- •Заключение
- •Список использованных источников
- •Приложение а (обязательное) Листинг программы a.1 Основной модуль MultiplyGame
- •A.2 Модуль тестирования MultiplyGameTest
- •A.3 Модуль MultiplyGameFile (ввод-вывод из файла)
1 Постановка задачи
Игра умножения является антагонистической игрой: в ней принимают участие 2 игрока и их выигрышные и проигрышные позиции противоположны. В соответствии с заданием и для удобства будем называть первого игрока – Слава, а второго – Оля. Слава всегда начинает игру с начального числа P=1 и умножает его на число в интервале от 2 до 9. Далее второй игрок Оля умножает полученное число также на число в интервале от 2 до 9. Так продолжается до тех пор, пока число P не превысит или не станет равно некоторому наперед заданному числу N. Число N в свою очередь лежит в пределах 2 ≤ N ≤ 4294967295. Верхний предел определяется максимальным числом которое может хранится в 32-битной структуре данных беззнакового целочисленного типа (232 – 1 = 4294967295).
Поставленная задача состоит в определении победителя, если оба игрока играют максимально хорошо в соответствии с заданным N, то есть переходят только в выигрышные для себя позиции (подробнее понятие выигрышной и проигрышной позиции будет рассмотрено в следующем пункте). Входными данными для разрабатываемой программы должно быть число N, а выходными – имя победителя при поставленном условии. Решение задачи должно быть выполнено в виде запускаемого консольного приложения.
Кроме этого, в требованиях к разработке стоит отметить необходимость создания тестов работоспособности программы с помощью технологии JUnit. Приложение должно адекватно реагировать на недопустимые вводимые значения числа N и выводить сообщение об ошибке.
2 Анализ поставленной задачи
2.1 Основные объекты задачи и их взаимодействие
Рассмотрим подробнее терминологию, которая применяется при решении данной задачи.
Позицией в данной игре умножения следует считать текущее число P, которое изменяют игроки, совершая очередной ход (умножение). Проанализируем понятия выигрышной и проигрышной позиции.
Позиция является проигрышной, если при любом ходе игрока его противник, играющий правильно, выиграет. В свою очередь, выигрышные позиции – позиции, при которых игрок, ходящий из них при правильной игре выигрывает (не зависимо от того как играет его соперник).
Естественно данные определения не касаются только окончания игры и значения этих терминов расширяются следующим образом: проигрышная позиция – позиция при которой любой допустимый ход игрока приводит к тому, что противник переходит в выигрышную позицию; позиция является выигрышной, если существует хотя бы один допустимый ход, при котором противник попадает в проигрышную позицию.
Каждая позиция является или выигрышной, или проигрышной, так как игра обязательно заканчивается победой одного из игроков за определенное количество шагов.
Так как игру начинает Слава и его позиция в начале игры P=1, то задача сводится к определению является данная позиция выигрышной или проигрышной для него при заданном N. Если позиция выигрышная – побеждает Слава, если позиция проигрышная – побеждает Оля.
Рассмотрим возможные варианты решения данной задачи.
2.2 Решение задачи – вариант 1
На первый взгляд может показаться, что в заданных пределах числа N, количество возможных позиций очень велико, но на самом деле оно не превышает 7000 возможных чисел.
Первым этапом данного варианта решения является нахождение всех таких позиций, то есть чисел, которые можно получить из начального состояния P=1 умножая на целые числа от 2 до 9. Числа целесообразно хранить в отсортированном массиве. Для формирования данного массива необходимо последовательно обрабатывать каждое из чисел, умножая их на числа в интервале от 2 до 9, проверять есть ли данное число в массиве и не превышает ли оно N. Если необходимые условия выполняются то данная позиция заносится в массив, при этом не нарушая его отсортированности.
Результирующий массив содержит все возможные игровые позиции и следующим шагом будет нахождение в данном массиве выигрышных позиций. Для этого необходимо пройти по массиву от больших чисел к меньшим, проверяя следующее условие выигрышности позиции: умножение числа в данной позиции на 9 приведет к условию выигрыша (P≥N) или к переходу в следующую выигрышную позицию.
После данных операций если числу 1 будет соответствовать выигрышная позиция, то побеждает Слава, а если нет – побеждает Оля.
Данный вариант решения требует создания временного массива чисел размером до 7000 элементов и написания дополнительных методов поиска и вставки чисел в данный массив. Помимо этого необходимо два прохода по массиву – для его заполнения и затем для определения выигрышности каждой из позиций. Это значительно замедляет процесс определения победителя в игре умножения.
