检查数组中消息的最有效方法

Most efficient way to check for messages in array

本文关键字:有效 方法 消息 数组 检查      更新时间:2023-10-16

我目前正在用c++开发一款类似象棋的游戏,我想知道是否有任何模式或良好的编程方法可以检查类之间的消息。

在我的问题中,我有两个类,一个是boardSquare类,另一个是GameBoard类(BoardSquareManager)。boardsquare的功能是,当您单击一个正方形时,布尔值将设置为true,这意味着boardsquare已被单击。目前在GameBoard类中,我有一个boardsquare数组,为了检查是否有一个棋盘格被点击,我在每个勾选中都会查看每个棋盘格,看看是否有人被点击,看起来是这样的。

void AGameBoard::CheckMessages()
{
  for (int i = 0; i < 64; i++)
 {
    if (BoardSquareArray[i]->GetWasClicked())
    {
        iClickedTile = BoardSquareArray[i]->GetSquareNum();
        BoardSquareArray[i]->DeactivateClick();
        bTileWasClicked = true;
    }
 }
}

在我看来,我觉得没有必要一直查看整个阵列,这样我就可以在瓷砖是否被点击时获得信息,你知道有什么更好的方法吗?

我感谢所有的答案!

是否考虑过Observer模式?E.Gamma的经典设计模式书中包含了许多来自于实现GUI应用程序的模式。其他可能感兴趣的模式有Command(是否要撤消移动?)、Decorator、Chain of Command、Composite、Strategy、Template Method。我绝对建议你读这本书。

现在我已经开始制作一个有队列的静态类。我使用这个类从BoardSquare向游戏板发送消息。(制作一个静态类可能不是长期目标中的"最佳"解决方案,但由于这是一个原型,我认为它现在可能可行)

静态消息类代码:

/*
* Public variables
*/
static void SendMsgToBoard(int& tile) { TileNumbers.push_back(tile); }
static int& RecieveMsgFromSquare() { return TileNumbers.front(); }
static void SquareMsgRecieved() { TileNumbers.pop_front(); }
static bool IsEmpty() { return TileNumbers.empty(); }

private:
/*
* Private Variables
*/
static std::deque<int> TileNumbers;

Boardsquare的新代码:

    messagePasser::SendMsgToBoard(iSquareNum);

游戏板的新代码:

if (!MessagePasser::IsEmpty())
{
    if (IsTileOccupied)
    {
        //Do stuff...
    }
    else
        //Do Other Stuff...
    MessagePasser::SquareMsgRecieved();
}

制作一些std::vector或std::stack,并用点击的瓦片的坐标推送点击事件。您还可以制作一些onClick方法,该方法将指针作为AGameBoard,并向其发送有关单击的瓦片的消息。

在互联网上搜索一些关于事件处理的内容。