algorithm to check a connect four field

前端 未结 3 1218
礼貌的吻别
礼貌的吻别 2020-11-30 00:43

I\'m wondering what\'s the best way to check for a winner on a connect four field.

I\'m interested in what you guys think and whether there is some \"well-known\" al

相关标签:
3条回答
  • 2020-11-30 01:16

    Each cell can only attribute to a maximum number of 12 winning combinations. (4 horizontal, 4 vertical and 4 diagonal). Each combination would have 4 cells including the one under consideration. And these numbers are going to be much lower for the cells closer to the sides. So it would make sense to pre-compile these combinations and store a hash of hash of related cells which can make a single play a winner. This way after each cell is player you simply pull out the related combinations/cells to check if it's a winner.

    0 讨论(0)
  • 2020-11-30 01:28

    This is related to this question: How to find the winner of a tic-tac-toe game of any size?

    The twist is the 7x6 board with 4 in a row winning rather than a NxN board with N in a row winning. But it is trivial to adapt the solution to NxN tic tac toe to connect 4.

    EDIT: Actually, it's not quite trivial to adapt the other solution to this one. But you can get there with a little bit of extra work.

    Store a count for each player for every row, column, diagonal and anti-diagonal that could ever have 4 pieces in a row. When that count hits 4 or more for either player, check to see if that row/column/diagonal/anti-diagonal has the four pieces in a row. If it does, that player wins!

    0 讨论(0)
  • 2020-11-30 01:34

    The source code from the Fhourstones Benchmark from John Tromp uses a fascinating algorithm for testing a connect four game for a win. The algorithm uses following bitboard representation of the game:

    .  .  .  .  .  .  .  TOP
    5 12 19 26 33 40 47
    4 11 18 25 32 39 46
    3 10 17 24 31 38 45
    2  9 16 23 30 37 44
    1  8 15 22 29 36 43
    0  7 14 21 28 35 42  BOTTOM
    

    There is one bitboard for the red player and one for the yellow player. 0 represents a empty cell, 1 represents a filled cell. The bitboard is stored in an unsigned 64 bit integer variable. The bits 6, 13, 20, 27, 34, 41, >= 48 have to be 0.

    The algorithm is:

    // return whether 'board' includes a win
    bool haswon(unsigned __int64 board)
    {
        unsigned __int64 y = board & (board >> 6);
        if (y & (y >> 2 * 6))     // check \ diagonal
            return true;
        y = board & (board >> 7);
        if (y & (y >> 2 * 7))     // check horizontal
            return true;
        y = board & (board >> 8);
        if (y & (y >> 2 * 8))     // check / diagonal
            return true;
        y = board & (board >> 1);
        if (y & (y >> 2))         // check vertical
            return true;
        return false;
    }
    

    You have to call the function for the bitboard of the player who did the last move. I try to explain the algorithm in my answer to the question "How to determine game end, in tic-tac-toe?".

    0 讨论(0)
提交回复
热议问题