Выбор метода хранения данных об игровом поле
Для того, чтобы решить, как хранить данные об игровом поле, необходимо решить, как его представить через классы. Это можно сделать разными способами: можно сделать отдельный класс для ячейки и отдельный класс для самого поля, можно сделать один класс, в котором будут содержаться данные и о ячейках, и о самой таблице. Поскольку свойств у ячейки мало, и методы для перемещения обмена содержимым ячеек при работе со всей таблицей удобнее, был выбран второй вариант.
Теперь необходимо выбрать структуру хранения данных об игровом поле. Каждую ячейку поля можно хранить как отдельное свойство поля, можно хранить значения ячеек в массивах: одномерном из шестнадцати элементов и двумерном, размерности 4×4. Первый вариант отбрасывается сразу: неудобно было бы обращаться к отдельным ячейкам, только по именам переменных, содержащих значения определенной ячейки поля, а следовательно, сложно было бы реализовать одни из главных действий программы – перемещение ячеек поля.
Работать в данной программе со вторым и третьим методами представления поля было бы практически одинаково легко. Однако выбран двумерный массив, поскольку такое представление нагляднее в этом случае – само игровое поле представляет собой двумерную таблицу с четырьмя строками и четырьмя столбцами.
Также для того, чтобы при запросе на перемещение не искать, где находится свободная клетка, необходимо также хранить номер строки и номер столбца положения, в котором она располагается. Их можно представить как два отдельных поля целого типа. Так их использовать будет очень удобно. Главное — надо дать понятные имена переменным.
Обоснование метода решения задачи
Анализ задачи
В классической версии игры любое начально положение можно привести к двум состояниям, причем одно из них победное (рис. 1), а другое – неразрешимое (рис. 2).
Можно показать, что ровно половину из всех возможных 20 922 789 888 000 = 16! начальных положений пятнашек невозможно привести к собранному виду: пусть квадратик с числом i расположен до (если считать слева направо и сверху вниз) k квадратиков с числами меньшими i. Будем считать , то есть, если после костяшки с i-м числом нет чисел, меньших i, то k = 0. Также введем число e — номер ряда пустой клетки (считая с 1). Если сумма
является нечётной, то решения головоломки не существует.
Очевидно, что неразрешимую комбинацию можно перевести в разрешимую, если поменять местами ячейки «14» и «15».
Рис. 1. Победная комбинация | Рис. 2. Неразрешимая комбинация | ||||||||
При запуске формируется двумерный массив чисел от 0 до 15, после этого числа перемешиваются с учетом разрешимости комбинаций. Открывается консольное окно, которое отображает этот массив, выводя вместо 0 пустую клетку. Под таблицей находится поле для подсчета ходов. Перед таблицей – подсказки, следуя которым можно выйти из игры или перемешать числа в таблице и начать новую игру.
Управление игрой происходит с помощью клавиатуры: при нажатии на стрелку влево местами меняются пустая клетка и клетка, находящаяся справа от пустой, если таковая есть, на стрелку вправо – находящаяся слева от пустой и пустая клетка, на стрелку вверх – пустая клетка и клетка, снизу от пустой, на стрелку вниз – пустая клетка и клетка, сверху от пустой. При нажатии на сочетание клавиш Alt+X производится выход из программы, Alt+R – перемешивание таблицы. При нажатии на другие символьные клавиши ничего не происходит.
После каждого хода игрока увеличивается на один значение счетчика ходов и производится проверка на достижение победного положения.
Игра продолжается до тех пор, пока числа в массиве не будут располагаться в правильном порядке. При достижении этого положения под счетчиком ходов выводится надпись «Победа!» и программа переходит в режим ожидания – возможны только перемешивание таблицы и выход из игры.