7

私はPython(2.7)コネクトフォーの簡単なゲームを構築しようとしています

単純な多次元Pythonリストで構成されるボードを作成しました。
私のボードリストは次のようになります。

board = [
    [_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,O,_,_,_,_,_],
    [_,_,_,_,X,_,_,_,_,_],
    [_,_,_,_,X,O,_,_,_,_],
    [_,_,_,_,X,O,_,_,_,_],
]

XはPlayer1で、OはPlayer2(またはコンピューター)でした。

これで、次のようなGUIの基本的なコードを作成しました。

# Connect 4 Game
import Tkinter

screen = Tkinter.Tk()
screen.title("My First Game")

#Create a board
board = Tkinter.Canvas(screen,width=500,height=500)
board.pack()

screen.mainloop()

質問:ボードの視覚的表現を作成して、すべてのリストに長方形が表示されるようにするにはどうすればよいですか?また、長方形がクリックされたときにそれを検出し、対応するリスト値を置き換える方法はありますか?

4

2 に答える 2

9

ラベルのボードを作成し、クリックされたものに応じて色を付けました。

import Tkinter as tk

board = [ [None]*10 for _ in range(10) ]

counter = 0

root = tk.Tk()

def on_click(i,j,event):
    global counter
    color = "red" if counter%2 else "black"
    event.widget.config(bg=color)
    board[i][j] = color
    counter += 1


for i,row in enumerate(board):
    for j,column in enumerate(row):
        L = tk.Label(root,text='    ',bg='grey')
        L.grid(row=i,column=j)
        L.bind('<Button-1>',lambda e,i=i,j=j: on_click(i,j,e))

root.mainloop()

これは検証を行いません (たとえば、クリックされた要素が一番下にあることを確認するため)。グローバルデータの代わりにクラスを使用する方がはるかに優れていますが、それは興味のあるコーダーの演習です:)。

于 2013-01-16T00:51:03.370 に答える
3

おそらくButtonsのグリッドを作成したいと思うでしょう。の値に従ってスタイルを設定し、クリック時にboardを更新するコールバックを割り当てることができます。board

于 2013-01-16T00:42:59.907 に答える