如何在井字游戏中连续检查3次

2024-10-16 20:50:17 发布

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

我正在做一个井字游戏,并试图创建一个函数,以检查3个相同的点在一行有相同的输入'x'或'0'。我有麻烦的三进排功能,我试图使触发游戏结束。我正试图找出如何以一种简单的方式来实现这一点,这样当播放3x或0时,所有的行或列都将被触发。。。以下是我目前所掌握的情况。这是Python2.7.13中的

(这只是我认为应该相关的代码的一部分)

def setup_board(size): 
    board = []
    for row in range(size):
        board.append([])
        for col in range(size):
            board[row].append(empty)
    return board 

def three_in_row(b):      
    b[0][0] and b[0][1] and b[0][2] == 'x'

def game_over(b):
    if three_in_row(b) == True:
        print "Congratulations You Win!"
    else:
        return False

def tic_tac_toe():
    b = setup_board(3)
    run_game(b)

Tags: andinboardgame游戏forsizereturn
3条回答
def line_match(game):
    for i in range(3):
        set_r = set(game[i])
        if len(set_r) == 1 and game[i][0] != 0:
            return game[i][0]
    return 0
#transposed column function for future use
#def column(game):
#   trans = numpy.transpose(game)
#   for i in range(3):
#       set_r = set(trans[i])
#       if len(set_r) == 1 and trans[i][0] != 0:
#           return list(set_r)[0]

def diagonal_match(game):
    if game[1][1] != 0:
        if game[1][1] == game[0][0] == game[2][2]: 
            return game[1][1]
        elif game[1][1] == game[0][2] == game[2][0]:
            return game[1][1]           
    return 0

在我看来,将X存储为+1,将O存储为-1可能更有意义,这样您就可以轻松地进行算术来检查游戏是否结束了。在

例如:

def three_in_row(b):
    xWin = check_winner(b,3)
    oWin = check_winner(b,-3)
    return xWin | oWin

def check_winner(b, valToCheck):
    foundWin = any(sum(r) in {valToCheck} for r in b)  # check rows
    # now check columns
    for i in range(3):
        foundWin = foundWin | (sum([b[j][i] for j in range(3)]) == valToCheck)
    # now check diagonals
    foundWin = foundWin | (sum([b[i][i] for i in range(3)]) == valToCheck)
    foundWin = foundWin | (sum([b[i][2-i] for i in range(3)]) == valToCheck)
    return foundWin

感谢Blender提供了以下更简洁的方法:

^{pr2}$

检查的正确语法是:

b[0][0] == 'x' and  b[0][1] == 'x' and b[0][2] == 'x'

或者(更简洁地说):

^{pr2}$

您还缺少一个return,例如:

return b[0][0] == b[0][1] == b[0][2] == 'x'

无论如何,您的代码不会遍历所有行。一种可能的纠正方法是:

def three_in_row(b):
    for row in rage(0, 3):
        if b[row][0] == b[row][1] == b[row][2] == 'x':
            return True
    return False

在(b)列中执行三个u应该相当容易(更改b[n][column]中的b[row][n]),因此也需要手动检查两条对角线。在

相关问题 更多 >