我有以下代碼,唯一不同的是我的串列中的j和I的位置。有沒有辦法通過寫一個函式或類似的東西來使它變得更好,因為我不太明白?
for i in range( dimension):
for j in range(dimension - 4)。
k = 1
while k < 5 and gameboard[i][j k] == gameboard[i][j] 。
k =1
if k == 5:
winner = gameboard[i][j].
for i in range( dimension):
for j in range(dimension - 4)。
k = 1
while k < 5 and gameboard[j k][i] == gameboard[j][i] 。
k =1
if k == 5:
winner = gameboard[j][i]。
uj5u.com熱心網友回復:
你可以通過插入一個額外的嵌套回圈來合并這兩個回圈,處理i和j的排列組合以及相應的維度deltas:
for i in range( dimension):
for j in range(dimension - 4)。
for i,j,di,dj in [ (i,j,0, 1), (j,i,1,0) ] 。
k = 1
while k < 5 and gameboard[i k*di][j k*dj] == gameboard[i][j] 。
k =1
if k == 5:
winner = gameboard[i][j]。
通用于所有方向
另外,你可以創建一個函式,告訴你在給定的方向上是否有勝利,并在一個回圈中使用該函式。
def directionWinner(board,i,j,di,dj)。
player,pi,pj = board[i][j],i,j
# if player == empty: return。
for _ in range(4)。
pi,pj = pi di, pj dj
if pi not in range(len(board))。return: return.
if pj not in range(len(board)): return: return.
if board[pi][pj] != player: return
return player
然后用它來檢查所有的方向:
for pos in range( dimensions*dimensions)。
i,j = divmod(pos, dimensions)
for direction in [ (0,1), (1, 0),(1,1),(1,-1) ] 。
winner = directionWinner(gameboard,i,j,*direction)
if winner is not None: break None: 破壞
else: continue; break: else.
方向是由每一步的垂直和水平坐標的增加/減少(deltas)來表示。 所以[ (0,1),(1,0),(1,1),(1,-1)]分別給你 "向下"、"跨越"、"對角線1"、對角線2"。
只從最后一步棋開始檢查
同樣的想法可以用來從特定的位置檢查贏家(例如,檢查最后一步是否是贏家):
# count how may consecutive in a given direction (and its inverse)
def countDir(board,i,j,di,dj,inverted=False)
player,pi,pj = board[i][j],i,j
count = 0
while pi in range(len(board) and pj in range(len(board)) 。
if board[pi][pj] == player: count = 1.
else: break: break.
pi, pj = pi di, pj dj
if not inverted:
count = countDir(board,i,j,-di,-dj,True)-1
return count
def winnerAt(board,i,j)。
for方向 in [ (0,1), (1, 0),(1,1),(1,-1) ] 。
if countDir(board,i,j,*direction)>=5:
return board[i,j] 。
那么,在i,j位置下完棋后,你可以立即知道這步棋是否贏得了比賽:
if winnerAt(gameboard,i,j) is not None:
print(gameboard[i][j],"wins!!")
uj5u.com熱心網友回復:
這也許是一個微不足道的改變,但是你為什么不把第二個檢查放在第一個回圈中,只是通過交換索引和使用另一個變數來完成while部分?我的意思是像這樣:
def check_winner(gameboard, dimension)。
for i in range( dimension):
for j in range(dimension - 4)。
# 執行第一次檢查。
k = 1: # 執行第一次檢查。
while k < 5 and gameboard[i][j k] == gameboard[i][j] 。
k =1
if k == 5:
return gameboard[i][j].
# and the second check.
l = 1
while l < 5 and gameboard[j k][i] == gameboard[j][i] 。
l =1
if l == 5:
return gameboard[j][i]。
無論如何,如果你找到了贏家,就直接回傳,這樣更干凈,避免了冗余。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/312363.html
標籤:
