繁体   English   中英

Python 检查 Connect 4 中的平局

[英]Python Check for a Draw in Connect 4

我现在正在尝试用 Python 编写 Connect 4 游戏 - 棋盘有 6 行 7 列,我在检查是否发生平局时遇到了困难。 当棋盘中的所有元素都被 1 或 2 占据时,就会发生平局。

curr_board = [[1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 1, 1],
              [2, 2, 2, 2, 2, 2],
              [2, 2, 2, 2, 2, 2],
              [1, 1, 1, 1, 1, 1],
              [2, 2, 2, 2, 2, 2]]
for row in curr_board:
    if curr_board and all(piece == 1 or piece == 2 for piece in row):
        print("draw")

这将返回:

draw
draw
draw
draw
draw
draw

我知道正在发生的事情是它检查第 1 行,返回抽奖,检查第 2 行,返回抽奖等。如何让它在返回抽奖之前先检查所有行?

编辑:

counter = 0
for row in curr_board:
    if curr_board and all(piece == 1 or piece == 2 for piece in row):
        counter += 1
if counter == 6:
    print("draw")

我已经通过这样做解决了这个问题,但是 - 有没有更优雅的方法来解决这个问题?

你可以做这样的事情来检查胜利和平局,这是一个有点笨重的解决方案,但它是一个多合一的功能。 您只需复制它并重命名“tile = '1'”和“check1Win”

curr_board = [
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1],
    [2, 2, 2, 2, 2, 2],
    [2, 2, 2, 2, 2, 2],
    [1, 1, 1, 1, 1, 1],
    [2, 2, 2, 2, 2, 2],
]


def check1Win(board):

    boardHeight = len(board)
    boardWidth = len(board[0])
    tile = "1"
    # 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 "Draw"


print(checkOWin(curr_board))

这有效:

import itertools

if all(piece == 1 or piece == 2 for piece in itertools.chain.from_iterable(curr_board)):
    print("draw")

这也有效,我更喜欢它:

import itertools

set_board = set(itertools.chain.from_iterable(curr_board))
if set_board.issubset({1, 2}):
    print("draw")

if all(piece in (1, 2) for row in curr_board for piece in row):
   print('draw')

不确定我是否完全理解这个问题,但如果你想弄清楚所有水平部分是 1、2 还是组合,那么以下将起作用。 对不起,如果我误解了。

board = [[1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1],
        [2, 1, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2],
        [1, 2, 1, 1, 1, 1],
        [2, 2, 2, 2, 2, 2]]

for row in board:
    myset = set(row)
    if len(myset) > 1:
        print("draw")
    if myset == {2}:
        print("2 wins")
    if myset == {1}:
        print("1 wins")

这输出:

1 wins
1 wins
draw
2 wins
draw
2 wins

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM