如果您存儲在board
的標籤,那麼你就可以
board[i][j]['bg']
訪問它的背景顏色,你可以用
board[i][j].config(bg=...)
甚至
board[i][j]['bg'] = ...
改變背景顏色
既然你要訪問的board
一個點的鄰居,很自然地使用for-loop
S,從而爲:
for ii in range(i - 1, i + 2):
for jj in range(j - 1, j + 2):
或等價但較少的嵌套使用itertools.product:
import itertools as IT
for ii, jj in IT.product(range(i - 1, i + 2), range(j - 1, j + 2)):
現在您可以通過board[ii][jj]
訪問鄰居,但請注意,ii
或jj
可能是超出界限的索引。
if ii<0 or ii>=rows or jj<0 or jj>=cols: continue
把使用上述兩種思路, 您使用可以指望的紅色,綠色和灰色方塊的數量:我們可以通過使用if
語句來處理出界外指標collections.Counter:
import collections
collections.Counter(
board[i][j]['bg'] for i, j in IT.product(range(rows), range(cols)))
import Tkinter as tk
import itertools as IT
import collections
cols, rows = 3, 3
board = [[None] * cols for _ in range(rows)]
other = {'green': 'red', 'red': 'green'}
player = 'red'
def on_click(event, i, j):
global player
board[i][j]['bg'] = player
for ii, jj in IT.product(range(i - 1, i + 2), range(j - 1, j + 2)):
if ii<0 or ii>=rows or jj<0 or jj>=cols: continue
neighbor = board[ii][jj]
if neighbor['bg'] != 'grey' and (ii, jj) != (i, j):
neighbor['bg'] = other[neighbor['bg']]
check_for_winner()
player = other[player]
def check_for_winner():
s = score()
if s['red'] + s['green'] == cols*rows:
# every box filled
winner = max(s, key=s.get)
print('Winner is: {}'.format(winner))
root.after(1, flash_winner, winner, 'blue')
def score():
return collections.Counter(
board[i][j]['bg'] for i, j in IT.product(range(rows), range(cols)))
def flash_winner(winner, altcolor):
for i, j in IT.product(range(rows), range(cols)):
if board[i][j]['bg'] == winner:
board[i][j]['bg'] = altcolor
root.after(250, flash_winner, altcolor, winner)
root = tk.Tk()
for i, j in IT.product(range(rows), range(cols)):
board[i][j] = L = tk.Label(root, text=' ', bg='grey')
L.grid(row=i, column=j, padx=3, pady=3)
L.bind('<Button-1>', lambda e, i=i, j=j: on_click(e, i, j))
root.mainloop()
感謝您的幫助!我有個問題。將可能發出的警告是什麼玩家把它作爲標籤而不是在窗口中作爲標籤在板上,或者它需要對板重新編碼並創建一個類?我混淆董事會的創建方式。 –
是!更新的答案,將最後一部分添加到重繪功能。理想情況下,您應該從頭開始重新創建整個程序,並在課程中正確編碼以瞭解更多信息。使用self來傳遞變量會更好。和Tk變量而不是使用凌亂的全局變量。 – mbdavis