我在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并没有什么神奇的优势。如果我是你,我会做以下事情
- 将数字0、1或2存储在长度为N的2D数组中(表示空、十字或圆)
- 设计一个函数,给定二维数组和对角线索引(每种对角线共有2n-1条),提取对角线的一维数组
- 设计一个函数,给定一个1D数组,判断是否有M个不为0的连续数字。这可以通过计数重复数字并在出现不同数字时重新开始计数来在O(N)内完成
- 对所有行、所有列和所有提取的两种类型的对角线使用此函数。
这是一个非常简单的模型。别忘了完成作业是你的工作。
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个方向相同