Я бы посоветовал вам сохранить массив истории, в котором вы находились sh состояний в соответствующих полях доски до того, как был сделан ход.
Когда вы перематываете / отменяете историю, вы восстанавливаете эти состояния, выталкивая их из массива и возвращая эти поля в исходное состояние.
Преимущество этого метода по сравнению с методом Titulum заключается в том, что с помощью этого метода вы также создаете историю выполненных ходов, и вы можете проанализировать ход позже, не отфильтровывая, какие ходы были особенно сделаны со всей доски.
См. пример ниже. Вы можете расширить нужные шаги, отредактировав json в текстовом поле и нажав перезагрузить
function getOriginalBoard() { return [
["C", "H", "B", "Q", "K", "B", "H", "C"],
["P", "P", "P", "P", "P", "P", "P", "P"],
[" ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " "],
["p", "p", "p", "p", "p", "p", "p", "p"],
["c", "h", "b", "q", "k", "b", "h", "c"]
]
};
let board = getOriginalBoard();
let history = [
];
function makeHistoryEntry(from, to) {
history.push({
from : {
location: from,
value: board[from.y][from.x]
},
to : {
location: to,
value: board[to.y][to.x]
}
});
}
function rewind() {
if(history.length > 0) {
let previousState = history.pop();
let from = previousState.from;
board[from.location.y][from.location.x] = from.value;
let to = previousState.to;
board[to.location.y][to.location.x] = to.value;
renderField();
}
}
function makeMove(from, to) {
makeHistoryEntry(from, to);
let piece = board[from.y][from.x];
board[from.y][from.x] = " ";
board[to.y][to.x] = piece;
renderField();
}
function renderField() {
let play = document.getElementById('play');
let content = [];
content.push('Y -' + ([...Array(board[0].length)].join("---")))
for(let i = 0; i < board.length; i++) {
content.push(i +' : ' + board[i].join(' '));
}
content.push(' -' + ([...Array(board[0].length)].join("---")))
content.push(' X: ' + ([...Array(board[0].length).keys()].join(" ")))
play.innerText = content.join('\n');
}
let movesElement = document.getElementById('moves');
let moves = JSON.parse(movesElement.value);
document.getElementById('next_move').addEventListener('click', (e)=>{
let move = moves.shift();
if(move) {
makeMove(move.from, move.to);
} else { window.alert("No more moves"); }
});
document.getElementById('rewind').addEventListener('click', rewind);
document.getElementById('reload').addEventListener('click', (e) => {
moves = JSON.parse(movesElement.value);
history = [];
board = getOriginalBoard();
renderField();
});
renderField();
#play {
background: #333;
color: #eee;
font-weight: 800;
padding: 12px;
display: inline-block;
}
#moves {
width: 300px;
height: 200px;
}
перезагрузить следующий ход отменить
[{"from": {"x": 7, "y": 7}, "to": {"x": 6, "y": 5}}, {"from": {"x": 0 , "y": 0}, "to": {"x": 0, "y": 3}}, {"from": {"x": 1, "y": 0}, "to": {"x": 1, "y": 4}}, {"from": {"x": 0, "y": 6}, "to": {"x": 0, "y": 3 }}]