1

Draughts のゲーム ボードを作成したいと思います。最初は、「ボード」キャンバスに正方形とポーンを直接描いている間、すべてがうまくいきました。後でそれらのポーンを操作する必要があるため、各正方形とポーンをオブジェクトとして作成することで、より明確にしたいと考えました。そこで、円 (ポーン) を含む黒または白の正方形を含むボードを作成しようとしました。その後、すべてが台無しになりました。どうしてか分かりません。それでも、(私にとっては)完全に論理的に見えます。

パック方式の使用が関係していると思います。

コードは次のとおりです。

from tkinter import *



class Parent(Tk):

    def getRoot(self):
        return(self.body)

    def setTitle(self,title):
        self.title(title)

    def run(self):
        self.mainloop()

class Drawing:
    def __init__(self,root,width,height):
        self.zone=Canvas(root, width=width, height=height)

    def put(self,root,row,col):
        self.zone.grid(root,row=row,column=col)

    def getDrawing(self):
        return(self.zone)

    def rectangle(self,coordX1,coordY1,coordX2,coordY2,color):
        self.zone.create_rectangle(coordX1,coordY1,coordX2,coordY2,fill=color, outline="black")

    def circle(self,coordX1,coordY1,coordX2,coordY2,color):
        self.zone.create_oval(coordX1,coordY1,coordX2,coordY2,fill=color,outline="black")

if __name__=="__main__":
    root=Parent()
    root.setTitle("Draughts")
    board=Drawing(root,400,400)
    size=40
    logicBoard=[[0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
                [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0],
                [0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
                [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0], 
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
                [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], 
                [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
                [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]]
    DIMENSION=10
    for i in range(DIMENSION):
        for j in range(DIMENSION):
            coordX1 = (i * size)
            coordY1 = (j * size)
            coordX2 = coordX1 + size
            coordY2 = coordY1 + size
            if(not(i%2==j%2)):#if the square is black (on the board)
                color="black"
            else:
                color="white"
            case=Drawing(board.getDrawing(),40,40)
            case.rectangle(coordX1,coordY1,coordX2,coordY2,color)
            case.getDrawing().pack()
            if(logicBoard[i][j]>0):
                pawnColor="white"
            elif(logicBoard[i][j]<0):
                pawnColor="black"
            if (not(i%2==j%2)):
                pawn=Drawing(case.getDrawing(),40,40)
                pawn.circle(0,0,30,30,pawnColor)
                pawn.getDrawing().pack()

    board.getDrawing().pack()
    root.run()

ありがとうございました !

編集:

これは私が得るものです:

めちゃくちゃなボード

4

1 に答える 1

2

問題は、最初に作成したものを使用するのではなく、新しいものを作成して、各反復でそれCanvasを呼び出すことです。pack()最後に、クラスDrawingを使用して新しいを作成しますDrawings。正方形と円を描画するメソッドを使用して、すべてのボードを表すために1つのクラスのみを使用することをお勧めします。

コントラストを良くするために、楕円の色を変更しました。

from tkinter import Tk, Canvas
from itertools import product

class Board(Tk):
    def __init__(self, width, height, cellsize):
        Tk.__init__(self)
        self.cellsize = cellsize
        self.canvas = Canvas(self, width=width, height=height)
        self.canvas.bind("<Button-1>", self.onclick)
        self.canvas.pack()
    def draw_rectangle(self, x1, y1, x2, y2, color):
        self.canvas.create_rectangle(x1, y1, x2, y2, fill=color, outline="black")
    def draw_circle(self, x1, y1, x2, y2, color):
        self.canvas.create_oval(x1, y1, x2, y2, fill=color, outline="black")
    def onclick(self, event):
        i = int(event.x / self.cellsize)
        j = int(event.y / self.cellsize)
        print "You clicked on cell (%s, %s)" % (i, j)

if __name__=="__main__":
    size = 40
    board = Board(400, 400, size)
    board.title("Draughts")
    logicBoard = [[0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
                  [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0],
                  [0, -1, 0, -1, 0, -1, 0, -1, 0, -1], 
                  [-1, 0, -1, 0, -1, 0, -1, 0, -1, 0], 
                  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                  [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
                  [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], 
                  [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
                  [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]]
    for (i, j) in product(range(10), range(10)):
        coordX1 = (i * size)
        coordY1 = (j * size)
        coordX2 = coordX1 + size
        coordY2 = coordY1 + size
        color = "white" if i%2 == j%2 else "black"
        board.draw_rectangle(coordX1, coordY1, coordX2, coordY2, color)
        cell = logicBoard[i][j]
        if cell != 0:
            pawnColor = "red" if cell > 0 else "blue"
            board.draw_circle(coordX1, coordY1, coordX2, coordY2, pawnColor)
    board.mainloop()

編集:

クリックを追跡したい場合は、独自のイベントハンドラーを使用して多数のキャンバスを作成する代わりに、ハンドラー関数をキャンバスにバインドしてポイントを計算する方が明確で簡単です。

于 2013-03-01T00:42:08.700 に答える