如何在 python 中编写 TicTacToe 游戏中的 win/tie 条件

How to code win/tie conditions in TicTacToe game in python

我已经为 TicTacToe 游戏制作了主​​要游戏机制;但是,我不知道如何编写最终游戏获胜条件的代码,即如何找到某人 wins/ties。

我尝试使用 all() 函数,但是这不起作用,或者我使用不正确(可能是后者)。

这是完整的代码,以及代码的变量列表(因为没有注释):

def get_grid():
    r1 = ['-','-','-']
    r2 = ['-','-','-']
    r3 = ['-','-','-']
    return r1, r2, r3

def get_coords():
    x = 0
    y = 0
    while True:
        try:
            x = int(input("x coord : "))
            y = int(input("y coord : "))
        except ValueError:
            print("Must be an integer")
        if x < 0 or x > 3 or y < 0 or y > 3:
            print('Both values must be in the grid!')
        else:
            break
    return x, y

def pgrid(x, y, r1, r2, r3, player):
    rdict = {1:r1, 2:r2, 3:r3}
    if x != 0 and y != 0:
        while True:
            if rdict[y][x-1] == '-':
                rdict[y][x-1] = player
                break
            else:
                print("Invalid Space!")
                x, y = get_coords()
    print('\t1\t2\t3')
    print('  1 |', end = '\t')
    for i in r1:
        print(i, end = '   |   ')
    print()
    print('  2 |', end = '\t')
    for i in r2:
        print(i, end = '   |   ')
    print()
    print('  3 |', end = '\t')
    for i in r3:
        print(i, end = '   |   ')
    print()


def main():
    r1, r2, r3 = get_grid()
    players = ['X', 'O']
    pgrid(0, 0, r1, r2, r3, None)
    win = False
    while win == False:
        for i in players:
            x, y = get_coords()
            pgrid(x, y ,r1 ,r2 , r3, i)

变量
r1, r2 and r3 是棋盘的第一、第二和第三行。 列表
x and y 是放置 'X' 或 'O' 的坐标。 整数
rdict 在输入的 y 值和面板行之间导航。 词典
player 是播放器。 字符串 players 是玩家 ('X' and 'O')
List win 当玩家获胜/比赛平局时为真。 布尔值

win 变量是这个问题的答案需要更改的内容,我只需要代码或者至少需要一个关于如何编码的想法(因为我没有任何代码!)。
提前致谢!

检查三个相同字母是否在一行或一列中的最简单方法是什么?对于第一列,取 r1[0]r2[0]r3[0] 并检查它们是否都包含相同的字母:

if r1[0] == 'X' and r2[0] == 'X' and r3[0] == 'X':
    print('First column meets victory conditions', 'X')

现在对所有行和列以及两个字母执行此操作会是 麻烦,但幸运的是我们可以让一些 for 循环完成工作对我们来说。

for letter in 'XO':
    for i in range(3):
        if r1[i] == letter and r2[i] == letter and r3[i] == letter:
            print('Column', i, letter)

对于行,只需遍历 (r1, r2, r3) 而不是 range(3) 并检查:

if row[0] == letter and row[1] == letter ...

当然,您也可以使用 all 函数和列表理解或生成器表达式来查看所有字母是否相等。

for row in (r1, r2, r3):
    if all(item == letter for item in row):

你可以试试我的功能:

def check_who_won(board):
 for letter in 'xo':
    if all(col == letter for row in board for col in row):
        return True
    for col in range(3):
        if all(board[row, col] == letter for row in range(3)):
            return True
    if (board[2, 0] and board[1, 1] and board[0, 2]) in letter:
        return True
    if all(board[index, index] == letter for index in range(3)):
        return True
return False