Python tic tac toe获胜者决心

时间:2016-10-27 10:47:11

标签: python

作为我大学课程的一部分,我正在python制作一个tic tac toe游戏。电路板尺寸由用户决定,因此可能是3x3或15x15,具体取决于用户的选择。有没有办法在几行代码中确定一行中是否有三个条目,与网格的大小无关,或者我必须在获胜组合中进行硬编码,如:

if grid[1][1] == grid[2][1] == grid [3][1]:
    return True

对于更大的电路板中的每个可能的线路和组合?

谢谢。

3 个答案:

答案 0 :(得分:1)

正如@ SiGm4在评论中指出的那样,如果您检查用户的每次更改,您只需要检查包含已更改字段的可能获胜组合。如果您想检查所有可能的组合,我建议您使用支持轻松切片的numpy数组。然后检查会是这样的:

if np.any(np.logical_and(grid[ :-2, :] == grid[1:-1, :],
                         grid[1:-1, :] == grid[2:  , :])):
    return True # There are three consecutive matches horizontally

然后你必须对垂直方向和两个对角方向重复这一点,这样你就可以得到4个if子句。

如果事实证明你想要更多的行/列,这将变得不可行。在这里,您可以为一个玩家填充网格,为另一个玩家填充-1,然后检查一个大小为N的窗口的移动窗口总和是否为N,以获得玩家1的胜利和-N为玩家2的胜利。

答案 1 :(得分:0)

这个问题与Python没有关系,它基本上是离散数学。因此,使用Python而不是C或Fortran或PHP或..blank将没有神奇的优势。

如果我是你,我会做以下

  1. 将数字0,1或2存储在长度为N的二维数组中(表示空,十字或圆)
  2. 设计一个函数,在给定2D数组和对角线索引的情况下提取对角线的一维数组(每种类型的对角线总数为2n-1)
  3. 设计一个给定1D数组的函数,确定是否有M个连续数字不是0.这可以通过计算重复数字在O(N)中完成,如果出现不同的数字则重新开始计数
  4. 对所有行,所有列以及两种类型的所有提取对角线都使用此函数。

答案 2 :(得分:0)

这是一个非常简单的模型。不要忘记完成作业是你的工作。

def printgrid(grid):
    for i in range(len(grid)):
        print (grid[i])

size = int(input("Give me size "))
grid= []
for i in range(size):
    line = []
    for j in range(size):
        line.append('')
    grid.append(line)
printgrid(grid)

while(1): #you need to put here a flag to end the game
    row = int(input("Give row "))
    col = int(input("Give col "))
    grid[row][col] = "X" #you need to make this for 2-players
    printgrid(grid)
    #check if vertical win (there are 3 diferrent vertical ones)
    #check if horizontal win (3 again)
    #check if first diagonical win (3 again)
    #check if second diagonical win (3 again)

概念是,从放置新“X”的角度来看,您只需要检查12种不同的组合。

因此,如果在[4,4]中放置“X”,则对于垂直方向,您必须检查以下3种组合:

1) [2,4],[3,4],[4,4]
2) [3,4],[4,4],[5,4]
3) [4,4],[5,4],[6,4]

其他3个方向相同