我试图将我的井字游戏概括为NxN网格。我一切正常,但发现很难获得检测胜利所需的代码。 这是我遍历电路板的行和列的功能。我不知道为什么它当前无法正常工作。谢谢
def check_win(array_board):
global winner
for row in range(N):
for i in range(N-1):
if array_board[row][i] != array_board[row][i+1] or array_board[row][i] == 0:
break
if i == N-1:
winner = array_board[row][0]
pygame.draw.line(board, (0, 0, 0), (75, (row * round(height / N) + 150)), (825, (row * round(height / N) + 150)), 3)
for col in range(N):
for j in range(N-1):
if array_board[j][col] == 0 or array_board[col][j] != array_board[col][i+1]:
break
if j == N - 1:
winner = array_board[0][col]
pygame.draw.line(board, (0, 0, 0), (col * round(width / N) + 150, 75), (col * round(width / N) + 150, 825), 3)
答案 0 :(得分:2)
您没有在问题中指定,所以 my 交叉网格是2D字符数组,带有一些默认的“空”字符串(单个空格)。
def getEmptyBoard( size, default=' ' ):
""" Create a 2D array <size> by <size> of empty string """
grid = []
for j in range( size ):
row = []
for i in range( size ): # makes a full empty row
row.append( default )
grid.append( row )
return ( size, grid )
因此,给定一个2D的字符串网格,如何检查n个非零交叉点Win?这就是在特定行或列中相同字符的计数等于网格的大小时。
因此,如果您有5x5的网格,则任何具有5个相同项目(例如“ x”)的row
都是赢家。同样,对于专栏... 5个“ o”是胜利。
因此,给定2D数组,您如何检查这些条件。一种方法是计算每个单元格中单独符号的出现次数。如果该计数达到5
(网格大小),那么无论该符号是什么,它都是赢家。
def checkForWin( board, default=' ' ):
winner = None
size = board[0]
grid = board[1]
### Tally the row and column
for j in range( size ):
col_results = {}
### Count the symbols in this column
for i in range( size ):
value = grid[i][j]
if ( value in col_results.keys() ):
col_results[ value ] += 1
else:
col_results[ value ] = 1
### Check the tally for a winning count
for k in col_results.keys():
if ( k != default and col_results[k] >= size ):
winner = k # Found a win
print("Winner: column %d" % ( j ) )
break
if ( winner != None ):
break
# TODO: also implement for rows
# TODO: also implement for diagonals
return winner # returns None, or 'o', 'x' (or whatever used for symbols)
上面的函数使用两个循环和一个python字典来保存找到的内容的列表。可以在同一循环中同时检查行和列,因此它并不是真正的逐行或逐列,而只是两个size
循环。
无论如何,因此在循环中,当我们第一次遇到x
时,它将被添加到字典中,其值为1
。下次我们找到x
时,将使用字典来对整个列中的事件dict['x'] → 2
进行计数。
在循环结束时,我们遍历字典键(可能是
,o
和x
)来检查计数。当计数与行或列的大小相同时,这就是获胜线。
很显然,如果找不到胜利,我们将计数归零,并使用外循环移动到下一列/行。