0

我尝试用 C++ 实现游戏 Trax。对于那些不知道的人:http ://www.traxgame.com/about_rules.php

到目前为止,我已经建立了棋盘并创建了规则,我可以在其中放置下一个 Tile 以及允许我设置哪个 Tile。但是现在,我正在为获胜条件而苦苦挣扎。如您所见,我需要一行至少 8 块瓷砖..

我的第一次解决方案尝试包括了许多 if 条件。那根本不可能。所以我需要实现一个适当的算法..

我使用位板的 secong 尝试变得非常复杂,所以我的问题是是否有更简单的方法,我现在只是想念。

问候,MC

4

2 回答 2

0

我可以建议你使用递归。我可能会误解你的意思,但无论如何:

bool isWin(int i, int j, int length) {
    if (length >= 8)
        return true;

    if (canMoveTo(i + 1, j)) {
        if (isWin(i + 1, j, length + 1))
            return true;
    }
    if (canMoveTo(i - 1, j)) {
        if (isWin(i - 1, j, length + 1))
            return true;
    }
    if (canMoveTo(i, j + 1)) {
        if (isWin(i, j + 1, length + 1))
            return true;
    }    
    if (canMoveTo(i, j - 1)) {
        if (isWin(i, j - 1, length + 1))
            return true;
    }      
    return false;
}

bool isWin(int i, int j) {
    int length = 0;
    isWin(i, j, length);
}

..

main() {
    for (int i = 0; i < HEIGHT; ++i) {
        for (int j = 0; j < WIDTH; ++j) {
            if (isTilePresent(i, j)) {
                if (isWin(i, j)) {
                    if (isRed(i, j))
                        std::cout << "Red is won!" << std::endl;
                    else
                        std::cout << "White is won!" << std::endl;
                }
            }
        }
    }
}
于 2015-04-20T23:47:23.133 回答
0

对于这种游戏的东西为了简单起见,我会在平铺表示中添加一个小位图

  1. 创建瓦片地图

    能够像这样表示所有图块的最小分辨率

    Trax瓷砖地图

    我认为3x3分辨率也可能是可行的。你需要4种颜色:

    • 灰色 - 墙
    • 红色 - 路径 plr1
    • 白 - 路径 plr2
    • 洋红色 - 路径 plr1,plr2
  2. 每转一圈后

    从瓷砖位图创建板位图并使用A*从最后编辑的瓷砖开始(也可能是 4 个邻居),并为每个玩家/路径起点(黄色)做路径。完成 A* 后,分析地图数据(橙色),找到地图中的最大数字(绿色中点)。这是 A* 填充停止的点(无需搜索)。然后重建返回起点(棕色)的最短路径,将使用的地图点设置为不可用。如果可以,然后尝试再次重建路径,然后存在闭环

    一个*

  3. 在重建路径时

    计算使用点的边界框,因此您将需要min,maxx,y 坐标x0,x1,y0,y1(以瓷砖为单位)。从这个 if 循环发现你知道:

    columns = x1-x0+1
    rows = y1-y0+1
    

    所以获胜条件是唯一if

希望这会有所帮助,我在我的Carcassonne游戏中开发了这种用于闭环路径查找/计数的技术

于 2015-04-21T07:24:02.373 回答