巨蟒井字游戏赢家的决定



我在python做一个井字游戏,作为我大学课程的一部分。板的大小由用户决定,所以可以是3x3或15x15,这取决于用户的选择。是否有一种方法可以在几行代码中确定一行中是否有三个条目,与网格大小无关,或者我是否必须在获胜组合中硬编码,如:

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

对于更大的棋盘中所有可能的线和组合?

谢谢。

正如@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填充一个玩家的网格,用-1填充另一个玩家的网格,然后检查大小为N的窗口的移动窗口和对于玩家1的获胜是否是N,对于玩家2的获胜是否是-N。

这个问题实际上与Python无关,它基本上是离散数学。因此,与C、Fortran、PHP或.blank.

相比,使用Python并没有什么神奇的优势。

如果我是你,我会做以下事情

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

这是一个非常简单的模型。别忘了完成作业是你的工作。

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种不同的组合需要检查。

所以,如果一个"X"被放置在[4,4],对于垂直,你必须检查以下3个组合:

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

其他3个方向相同

最新更新