У меня есть сетка случайно сгенерированных чисел размера gameSize
(пользовательский ввод), который содержится в векторе векторов. Пользователь может ввести две координаты (x, y), чтобы он изменил число в сетке на предварительно определенное значение, равное «0».
Так, например, пользователь вводит, X: 0 Y: 0 и:
{9, 7, 9}
{9, 6, 8}
{5, 1, 4}
будет выглядеть так:
{0, 7, 9} <-- Changes position 0,0 to 0 (the predefined value)
{9, 6, 8}
{5, 1, 4}
Я пытаюсь выяснить, как добавить функцию «отменить», в которой пользователю предлагается, если он хочет отменить свой выбор или нет, и если да, затем отменить выбор, чтобы позиция 0,0 изменилась обратно к исходному значению (который является значением 9 в этом примере). Как я могу это реализовать? Я понимаю, что мне нужно как-то записать предыдущее состояние сетки, но понятия не имею, как.
Если вы хотите иметь возможность только «отменить» последнее изменение, то вы можете просто сделать копию своего рода резервную копию состояния до делать изменения. Затем, если пользователь хочет «отменить» изменение, скопируйте его из резервной копии в фактические данные.
Для большего количества уровней отмены у вас может быть стопка копий.
Если данные велики, то вместо копирования данных для каждого изменения просто сохраняйте копию фактического изменения. Затем, когда пользователь хочет «отменить», вы делаете противоположное изменение.
Пример: если пользователь хочет изменить координаты X, Y на Z, затем сохранить X, Y и Z. Затем, когда вы отменяете действия, вы изменяете X, Y с помощью -Z.
В объектно-ориентированных языках вы часто обнаруживаете, что люди будут использовать шаблон команд внедрить отмененные системы. Некоторые люди могут сказать, что это излишне, но на самом деле оно довольно гибкое и не требует больших усилий, чтобы начать работу.
Общая идея заключается в том, что вы создаете интерфейс с методами execute()
а также undo()
, Затем вы можете создать целый ряд других классов, которые реализуют этот интерфейс и которые знают, как выполнять конкретные действия (например, в вашем примере, изменить позицию) и как отменить их. Затем вам просто нужно отслеживать команды, которые вы выполнили, помещая их в стек, а когда вам нужно отменить, просто вытолкнуть их из стека и вызвать undo()
,
Вот хороший ресурс для изучения шаблонов команд и шаблонов проектирования в целом.