これには時間がかかりました!これが私のバージョンです:
import Tkinter as tk
import TkMessageBox as messagebox
board = [ [None]*10 for _ in range(10) ]
counter = 0
root = tk.Tk()
def check_board():
freespaces = 0
redspaces = 0
greenspaces = 0
for i,row in enumerate(board):
for j,column in enumerate(row):
if board[i][j] == "red":
redspaces += 1
elif board[i][j] == "green":
greenspaces += 1
elif board[i][j] == None:
freespaces += 1
if freespaces == 0:
if greenspaces > redspaces:
winner = "green"
elif greenspaces < redspaces:
winner = "red"
else:
winner = "draw"
if winner != "draw":
messagebox.showinfo("Game Over!",winner+" wins!")
else:
messagebox.showinfo("Game Over!","The game was a draw!")
def on_click(i,j,event):
global counter
if counter < 100:
if board[i][j] == None:
color = "green" if counter%2 else "red"
enemycolor = "red" if counter%2 else "green"
event.widget.config(bg=color)
board[i][j] = color
for k in range(-1,2):
for l in range(-1,2):
try:
if board[i+k][j+l] == enemycolor:
board[i+k][j+l] = color
except IndexError:
pass
counter += 1
global gameframe
gameframe.destroy()
redraw()
root.wm_title(enemycolor+"'s turn")
else:
messagebox.showinfo("Alert","This square is already occupied!")
check_board()
def redraw():
global gameframe
gameframe = tk.Frame(root)
gameframe.pack()
for i,row in enumerate(board):
for j,column in enumerate(row):
name = str(i)+str(j)
L = tk.Label(gameframe,text=' ',bg= "grey" if board[i][j] == None else board[i][j])
L.grid(row=i,column=j,padx='3',pady='3')
L.bind('<Button-1>',lambda e,i=i,j=j:on_click(i,j,e))
redraw()
root.mainloop()
ウィジェットへの保存された参照がないため、毎回ボード全体を再描画しています。各ウィジェットはすべて「L」と呼ばれるため、作成後に各ウィジェットにアクセスする方法がわかりません。そのため、ボードで色の値を確認し、色付けされているかどうかに基づいてウィジェットを作成します。チェックは、正方形の周りの 3x3 グリッドの色を見て行います。
四角をチェックして、それらがすべていっぱいかどうかを検出する機能を追加しました。コードを調べることで何が起こっているのかを理解できるはずです。質問がある場合はお知らせください。私が追加したいい感じは、誰の番であるかに基づいてタイトル バーを変更することです!
編集: 現在のプレーヤーの色を通知するラベルを追加するには、以下を redraw 関数の最後に追加してください!
global counter
whosturn = "Green" if counter%2 else "Red"
turnLbl = tk.Label(gameframe,text=color+"'s Turn")
turnLbl.grid(row=11,column = 0,columnspan = 10)