算法Trax获胜条件

时间:2015-04-20 22:56:09

标签: c++ algorithm bitboard

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

到目前为止,我已经建立了这个板,并创建了规则,我可以放置下一个Tile,以及允许设置哪个。 但现在,我正在努力赢得胜利的条件。 如你所见,我需要一行至少8个瓷砖..

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

我使用比特板的尝试非常复杂,所以我的问题是如果有一个更简单的方法,我现在只是想念。

Greets,MC

2 个答案:

答案 0 :(得分: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;
                }
            }
        }
    }
}

答案 1 :(得分:0)

对于这种游戏的东西为了方便起见,我会在图块表示中添加一个小位图

  1. 创建平铺地图

    能够代表所有瓷砖的最小分辨率

    Trax tiles map

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

    • 灰墙 -
    • 红色 - 路径plr1
    • 白色 - 路径plr2
    • 洋红色 - 路径plr1,plr2
  2. 每回合后
  3. 从切片位图创建纸板位图,并使用A*从最后编辑的切片开始(也可能是4个邻居),并为每个玩家/路径起点(黄色)执行路径。当A *完成后,然后分析地图数据(橙色),找到地图中的最大数字(绿色中点)。这是A *填充停止的点(不需要搜索它)。然后重建最短路径回到起点(棕色)设置使用的地图点不可用。然后尝试再次重建路径,如果可以,然后闭环存在

    A*

  4. 重建路径时
  5. 计算已使用点的边界框,因此您需要min,max x,y坐标x0,x1,y0,y1(在图块中)。从这个if循环中你知道:

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

    所以胜利条件只是来自

  6. 的单if

    希望这有帮助,我在 Carcassonne 游戏中开发了这种闭环路径寻找/计数技术