井字游戏胜出条件

问题描述 投票:-2回答:2

这是数字井字游戏。我尝试使行,列或对角线的获胜条件加起来等于15。但是,' '不能更改为整数。我该怎么做才能避免这种情况?

这里是主要问题部分:

local_board = [[ '','0','1','2'],
               ['0',' ',' ',' '],
               ['1',' ',' ',' '],
               ['2',' ',' ',' ']]

def isWinner(self):
    if int(local_board[1][1]) + int(local_board[1][2]) + int(local_board[1][3]) == 15\
    or int(local_board[2][1]) + int(local_board[2][2]) + int(local_board[2][3]) == 15\
    or int(local_board[3][1]) + int(local_board[3][2]) + int(local_board[3][3]) == 15\
    or int(local_board[1][1]) + int(local_board[2][1]) + int(local_board[3][1]) == 15\
    or int(local_board[1][2]) + int(local_board[2][2]) + int(local_board[3][2]) == 15\
    or int(local_board[1][3]) + int(local_board[2][3]) + int(local_board[3][3]) == 15\
    or int(local_board[1][1]) + int(local_board[2][2]) + int(local_board[3][3]) == 15\
    or int(local_board[1][3]) + int(local_board[2][2]) + int(local_board[3][1]) == 15:
        print('Player '+ self.player +' wins. Congrats!')
        self.continue_game = False
python python-3.x tic-tac-toe
2个回答
0
投票

代替2D列表,创建2D numpy数组。您可以用NaN替换空白空间。其他所有内容均以整数形式输入。然后,您可以使用numpy.nansum函数来计算您对计算感兴趣的总和。

这里是一些示例代码。我没有测试。

import numpy as np

local_board = [[np.nan,0,1,2],
               [0,np.nan,np.nan,np.nan],
               [1,np.nan,np.nan,np.nan],
               [2,np.nan,np.nan,np.nan]]

local_board = np.array(local_board)

def isWinner(self):
    if np.nansum(local_board[1][1] + local_board[1][2] + local_board[1][3]) == 15\
    or np.nansum(local_board[2][1] + local_board[2][2] + local_board[2][3]) == 15\
    or np.nansum(local_board[3][1] + local_board[3][2] + local_board[3][3]) == 15\
    or np.nansum(local_board[1][1] + local_board[2][1] + local_board[3][1]) == 15\
    or np.nansum(local_board[1][2] + local_board[2][2] + local_board[3][2]) == 15\
    or np.nansum(local_board[1][3] + local_board[2][3] + local_board[3][3]) == 15\
    or np.nansum(local_board[1][1] + local_board[2][2] + local_board[3][3]) == 15\
    or np.nansum(local_board[1][3] + local_board[2][2] + local_board[3][1]) == 15:
        pr'Player '+ self.player +' wins. Congrats!')
        self.continue_game = False


0
投票

您不希望空位计为零,因此必须将其转换为整数,以确保总和不会为15(例如-15)。这可以使用a if condition else b构造完成:

n = int(p) if p.strip() else -15 # where p is the string value at a given position

要检查行和对角线上的总和,您可以准备一个索引列表(在平整的位置列表中,并将其用作间接添加相应板位置上的值的方法:

local_board = [['','0','1','2'],['0',' ',' ',' '],['1',' ',' ',' '],['2',' ',' ',' ']]

lines = [ [0,1,2,3],  [4,5,6,7],  [8,9,10,11], [12,13,14,15],
          [0,4,8,12], [2,5,9,13], [2,6,10,14], [3,7,11,15],
          [1,5,10,15],[3,6,9,12] ]
nums  = [ int(n) if n.strip() else -15 for row in local_board for n in row ]
win   = 15 in (sum(nums[p] for p in line) for line in lines)

print(win) # False
© www.soinside.com 2019 - 2024. All rights reserved.