四连胜逻辑

wou*_*_be 6 c algorithm

我现在正在为自己开发一个基本的四连胜游戏,但我更倾向于坚持它背后的逻辑.

目前我有这个代表电路板的多维数组

[
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0]
]
Run Code Online (Sandbox Code Playgroud)

0将是一个空的插槽,而12代表的球员.那么让我们说一段时间后你得到这个数组:

[
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 1, 2, 2, 2, 0],
    [0, 1, 2, 2, 1, 2, 0]
]
Run Code Online (Sandbox Code Playgroud)

如何编写逻辑以检查连续四个?计算它的水平和垂直似乎相当容易(虽然仍然找出最好的方法),但我如何做对角线?

pax*_*blo 14

最好的办法是将搜索空间分成四个:

  • 垂直;
  • 水平;
  • 正确和向下;
  • 正确而向上.

然后根据方向限制开始和结束坐标.

例如,假设你的阵列是board[row=0-5][col=0-6]board[0][0]在左上角.

第一垂直(环都包括在这两个在这个伪代码结束):

for row = 0 to 2:
    for col = 0 to 6:
        if board[row][col] != 0 and
           board[row][col] == board[row+1][col] and
           board[row][col] == board[row+2][col] and
           board[row][col] == board[row+3][col]:
               return board[row][col]
Run Code Online (Sandbox Code Playgroud)

这限制了仅仅那些不会延伸到电路板边缘的可能性,这是大多数解决方案在通过检查每个电池并从那里向各个方向走出简单开始时所具有的问题.由此,我的意思是检查3的起始行是没有意义的,因为这将涉及行3,4,5和6(后者不存在).

同样,对于水平:

for row = 0 to 5:
    for col = 0 to 3:
        if board[row][col] != 0 and
           board[row][col] == board[row][col+1] and
           board[row][col] == board[row][col+2] and
           board[row][col] == board[row][col+3]:
               return board[row][col]
Run Code Online (Sandbox Code Playgroud)

对于正确和向下,然后是向右和向上:

for row = 0 to 2:
    for col = 0 to 3:
        if board[row][col] != 0 and
           board[row][col] == board[row+1][col+1] and
           board[row][col] == board[row+2][col+2] and
           board[row][col] == board[row+3][col+3]:
               return board[row][col]

for row = 3 to 5:
    for col = 0 to 3:
        if board[row][col] != 0 and
           board[row][col] == board[row-1][col+1] and
           board[row][col] == board[row-2][col+2] and
           board[row][col] == board[row-3][col+3]:
               return board[row][col]
Run Code Online (Sandbox Code Playgroud)

现在,您实际上可以通过创建外部循环并仅执行一次而不是两次来组合这两者for col = 0 to 3但我实际上更喜欢将它们分开(使用合适的注释)以便更容易理解.但是,如果你沉迷于性能,你可以尝试:

for col = 0 to 3:
    for row = 0 to 2:
        if board[row][col] != 0 and
           board[row][col] == board[row+1][col+1] and
           board[row][col] == board[row+2][col+2] and
           board[row][col] == board[row+3][col+3]:
               return board[row][col]
    for row = 3 to 5:
        if board[row][col] != 0 and
           board[row][col] == board[row-1][col+1] and
           board[row][col] == board[row-2][col+2] and
           board[row][col] == board[row-3][col+3]:
               return board[row][col]
Run Code Online (Sandbox Code Playgroud)

然后,如果在四个可能的方向上没有找到胜利,只需返回0而不是获胜者12.

例如,您的样板:

row
 0   [0, 0, 0, 0, 0, 0, 0]
 1   [0, 0, 0, 0, 0, 0, 0]
 2   [0, 0, 0, 1, 1, 0, 0]
 3   [0, 0, 0, 1, 1, 0, 0]
 4   [0, 0, 1, 2, 2, 2, 0]
 5 > [0, 1, 2, 2, 1, 2, 0]
         ^
      0  1  2  3  4  5  6 <- col
Run Code Online (Sandbox Code Playgroud)

将检测优胜者在右和上环,其中起始细胞是{5,1}因为{5,1},{4,2},{3,3}并且{2,4}都设置为1.