Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет курс ООП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
130.97 Кб
Скачать
  1. Развернутое индивидуальное задание

Вариант 6. Игровая программа «Пятнадцать».

Разработать на языке C++ реализацию компьютерной версии игры «Пятнадцать», придерживаясь принципов объектно-ориентированного программирования. Игра ведется на поле, представляющем собой таблицу размером 4x4, разделенную на 16 ячеек одинакового размера, заполненных числами от 1 до 15, одна ячейка пустая. В свободную клетку можно передвигать соседние с ней заполненные ячейки. Цель игры – двигая ячейки по одной, упорядочить их по номерам, сделав как можно меньше перемещений.

Программа должна обеспечить вывод на экран игрового поля, перемещение числовой ячейки в пустую, если таковая есть в заданном направлении движения. В случае выстраивания чисел по порядку – завершения игры – необходимо предусмотреть вывод сообщения о победе.

  1. Выбор метода решения задачи

    1. Выбор метода хранения данных об игровом поле

Для того, чтобы решить, как хранить данные об игровом поле, необходимо решить, как его представить через классы. Это можно сделать разными способами: можно сделать отдельный класс для ячейки и отдельный класс для самого поля, можно сделать один класс, в котором будут содержаться данные и о ячейках, и о самой таблице. Поскольку свойств у ячейки мало, и методы для перемещения обмена содержимым ячеек при работе со всей таблицей удобнее, был выбран второй вариант.

Теперь необходимо выбрать структуру хранения данных об игровом поле. Каждую ячейку поля можно хранить как отдельное свойство поля, можно хранить значения ячеек в массивах: одномерном из шестнадцати элементов и двумерном, размерности 4x4. Первый вариант отбрасывается сразу: неудобно было бы обращаться к отдельным ячейкам, только по именам переменных, содержащих значения определенной ячейки поля, а следовательно, сложно было бы реализовать одни из главных действий программы – перемещение ячеек поля.

Работать в данной программе со вторым и третьим методами представления поля было бы практически одинаково легко. Однако выбран двумерный массив, поскольку такое представление нагляднее в этом случае – само игровое поле представляет собой двумерную таблицу с четырьмя строками и четырьмя столбцами.

Также для того, чтобы при запросе на перемещение не искать, где находится свободная клетка, необходимо также хранить номер строки и номер столбца положения, в котором она располагается. Их можно представить как два отдельных поля целого типа. Так их использовать будет очень удобно. Главное - надо дать понятные имена переменным.

    1. Обоснование метода решения задачи

      1. Анализ задачи

В классической версии игры любое начально положение можно привести к двум состояниям, причем одно из них победное (рис. 1), а другое – неразрешимое (рис. 2).

Можно показать, что ровно половину из всех возможных 20 922 789 888 000 = 16! начальных положений пятнашек невозможно привести к собранному виду: пусть квадратик с числом i расположен до (если считать слева направо и сверху вниз) k квадратиков с числами меньшими i. Будем считать , то есть, если после костяшки с i-м числом нет чисел, меньших i, то k = 0. Также введем число e — номер ряда пустой клетки (считая с 1). Если сумма

является нечётной, то решения головоломки не существует.

Очевидно, что неразрешимую комбинацию можно перевести в разрешимую, если поменять местами ячейки «14» и «15».

1

2

3

4

1

2

3

4

5

6

7

8

5

6

7

8

9

10

11

12

9

10

11

12

13

14

15

13

15

14

Рис. 1. Победная комбинация

Рис. 2. Неразрешимая комбинация