2

プレイヤーがボードをクリックして色で塗りつぶすPythonゲームを作成しようとしています. ボックスをクリックして、隣接するボックスが他のプレーヤーの色で塗りつぶされている場合、色が自分の色に変わります。このボード コードは見つかりましたが、隣接するボックスを塗りつぶすことができません。

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 = "green" if counter%2 else "red"
    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,padx='3',pady='3')
        L.bind('<Button-1>',lambda e i=i,j=j: on_click(i,j,e))

root.mainloop()

質問:プレイヤーがボックスをクリックすると、すでに敵の色で塗りつぶされている隣接するボックスも赤/緑に変わるようにするにはどうすればよいですか? また、特定の色で満たされたボックスの数を数えて、誰が勝ったかを判断するにはどうすればよいですか? ご協力いただきありがとうございます。

4

2 に答える 2

1

これには時間がかかりました!これが私のバージョンです:

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)
于 2013-07-03T01:54:43.993 に答える