c++ - 2048游戏中撤销操作的实现

标签 c++ undo game-theory 2048

我已经用 C++ 实现了 2048 游戏,github 链接:2048

为了实现撤消操作,即返回到游戏的先前状态,我为先前的棋盘配置维护了一个矩阵,但是如果我连续允许许多撤消操作,我就无法维护那么多的矩阵。

有什么方法可以改进这种方法?

我认为的一种方法是只保留之前的移动(上、下、左或右),但如果我在这种方法中遗漏了某些东西,或者它可能是扩展,请建议一种方法。

最佳答案

您可以将棋盘的当前状态存储到堆栈中,因此每次用户移动时,都会改变棋盘状态,只需将其放入堆栈中,这样您就可以得到一个充满棋盘当前状态矩阵的堆栈用户的移动和从最近的移动排序在顶部。因此,当您想撤消他们的最新 Action 时,只需从堆栈中弹出即可,这将为您提供他们的最新操作。

...
std::stack<std::array<int, 16>> boardStates;
std::array<16, int> currentBoardState;
// whenever user makes a move
makeMove(currentBoardState)

//when they want to undo    
tempBoardState = undoMove();
if(tempBoardState != nullptr)
{
   currentBoardState = tempBoardState;
}
else
{
   std::cout << "No previous move available" << std::endl
}
...

void makeMove(std::array<int, 16> currentState)
{
   boardStates.push(currentState);
}

std::array<int, 16> undoMove()
{
    if(!boardStates.empty())
    {
        return boardStates.pop();
    }

    return nullptr;
}

关于c++ - 2048游戏中撤销操作的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48720622/

相关文章:

c++ - 传递参数时的宏扩展问题

C++ 析构函数约定

github - 错误: Undo last git commit on both local and remote

vim 持久撤消无法正常工作

git - 如何撤消 'git update-ref -d refs/heads/master' ?

java - 国际象棋中达到目标的最少步数 - 使用 BFS 进行马遍历

design-patterns - 浏览现有的开源项目以学习/改进类设计和设计模式

c++ - 错误 : cannot declare variable ‘bg’ to be of abstract type ‘cv::BackgroundSubtractorMOG2’ in OpenCV 3

c++ - 在Ubuntu 18.04上找不到MPI_C和MPI cmake

在给定完整历史记录的情况下计算球队赢得体育比赛几率的算法