[英]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.