Python connect 4 check win函数

2024-05-17 04:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个连接4游戏,你可以选择大小的董事会。这个游戏对大多数棋盘大小都完美无瑕,但当棋盘高过宽时会给我带来麻烦。我不断地得到索引超出范围的错误,我不确定我做错了什么。这是我现在的支票功能,因为它是唯一给我的问题部分。

def checkOWin(board):

    boardHeight = len(board)
    boardWidth = len(board[0])
    tile = 'O'
    # check horizontal spaces
    for y in range(boardHeight):
        for x in range(boardWidth - 3):
            if board[x][y] == tile and board[x+1][y] == tile and board[x+2][y] == tile and board[x+3][y] == tile:
                return True

    # check vertical spaces
    for x in range(boardWidth):
        for y in range(boardHeight - 3):
            if board[x][y] == tile and board[x][y+1] == tile and board[x][y+2] == tile and board[x][y+3] == tile:
                return True

    # check / diagonal spaces
    for x in range(boardWidth - 3):
        for y in range(3, boardHeight):
            if board[x][y] == tile and board[x+1][y-1] == tile and board[x+2][y-2] == tile and board[x+3][y-3] == tile:
                return True

    # check \ diagonal spaces
    for x in range(boardWidth - 3):
        for y in range(boardHeight - 3):
            if board[x][y] == tile and board[x+1][y+1] == tile and board[x+2][y+2] == tile and board[x+3][y+3] == tile:
                return True

    return False

如有任何帮助或建议,将不胜感激。提前谢谢!


Tags: andinboardtrue游戏for棋盘return
2条回答

好吧,这是3年后的事了,我正在学习编程和Python,并且正在做我自己的Connect Four项目,所以请忍受我。。。但我认为问题在于条件。

下面是一个示例输入,应该与OP使用的类似:

board = [['_','_','_','_','_','_','_'],
         ['_','_','_','_','_','_','_'],
         ['_','_','_','X','_','_','_'],
         ['_','_','_','O','_','_','_'],
         ['_','X','X','O','O','O','O'],
         ['X','X','X','O','O','X','O']]

我把条件改写成:

  for x in range(boardWidth):
    for y in range(boardHeight):
      try:
        if board[y][x] == tile and board[y][x+1] == tile and board[y][x+2] == tile and board[y][x+3] == tile:
          return True
      except IndexError:
        next

我们有6个不同的名单存储在董事会名单。当访问板时,y排在第一位,因为它首先告诉我们需要使用这6个列表中的哪一个,在板列表中向上或向下移动我们。现在x索引把我们移到我们访问过的y列表中。

try and except允许您删除for x in range(boardWidth - 3),因为如果收到索引错误,我们知道我们已经到达游戏板的边缘,无法满足获胜条件。所以我们继续下一个测试点。

你刚刚把尺寸弄混了,你应该这样设置:

def checkOWin(board):
    boardHeight = len(board[0])
    boardWidth = len(board)

因为当你提到board[x]时,那是在计算board中的列表数,当你提到board[x][y]时,那是指board中一个特定行的长度。

if board[x][y] == tile and board[x+1][y] == tile and board[x+2][y] == tile and board[x+3][y] == tile:

当我翻转这些值时,函数运行没有错误。

相关问题 更多 >