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

时间:2015-11-21 14:19:48

标签: c++ arrays c++11

我目前正在使用c ++进行类似国际象棋的游戏,并且想知道是否有任何模式或良好的编程方式来检查类之间的消息。

在我的问题中,我有两个类,一个boardSquare-和一个GameBoard类(BoardSquareManager)。 boardsquare具有的功能是,当您单击一个正方形时,布尔值将设置为true,这意味着已单击boardSquare。目前在GameBoard-class中我有一系列BoardSquares,为了检查是否已经点击了一个boardsquare,我会检查每个BoardSquare每个tick,看看是否有人点击过,看起来像这样。

void AGameBoard::CheckMessages()
{
  for (int i = 0; i < 64; i++)
 {
    if (BoardSquareArray[i]->GetWasClicked())
    {

        iClickedTile = BoardSquareArray[i]->GetSquareNum();

        BoardSquareArray[i]->DeactivateClick();

        bTileWasClicked = true;
    }
 }
}

在我看来,没有必要一直查看整个阵列,所以如果点击了一块瓷砖我可以得到信息,你知道更好的方法吗?

我感谢所有答案!

3 个答案:

答案 0 :(得分:2)

考虑过观察者模式?来自E. Gamma的经典设计模式书包含许多来自实现GUI应用程序的模式。其他可能有趣的模式是Command(想要撤消移动吗?),装饰器,命令链,复合,策略,模板方法。我肯定会建议您阅读这本书。

答案 1 :(得分:1)

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

静态MessageClass的代码:

/*
* 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();
}

答案 2 :(得分:0)

制作一些std :: vector或std :: stack,然后点击点击了tile的坐标点击事件。你也可以制作一些onClick方法,它使指针执行AGameBoard并向其发送有关点击图块的消息。

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