作为我大学课程的一部分,我正在python
制作一个tic tac toe游戏。电路板尺寸由用户决定,因此可能是3x3或15x15,具体取决于用户的选择。有没有办法在几行代码中确定一行中是否有三个条目,与网格的大小无关,或者我必须在获胜组合中进行硬编码,如:
if grid[1][1] == grid[2][1] == grid [3][1]:
return True
对于更大的电路板中的每个可能的线路和组合?
谢谢。
答案 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将没有神奇的优势。
如果我是你,我会做以下
答案 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个方向相同