2016-06-30 9 views
0

Ich arbeite an meinem letzten Projekt für meine Einführung in die CS-Klasse und entschied mich, Connect Four mit tkinter von Python zu erstellen. Ich habe mein Board mit tkinter's create_rectangle() gezeichnet, aber jetzt bin ich dran, wie ich meine Spalten beschriften/aufrufen/verweisen kann. Mein Raster ist 700x600 Pixel mit 7 Spalten und 6 Zeilen. Um die Stücke während des Spiels zu verfolgen, muss ich sehen, wo sie sind, damit ich eine boolesche Aussage machen kann, ob Spieler 1 oder Spieler 2 gewonnen hat. Deshalb würde ich die Koordinaten verwenden oder benennen Sie es als:Was setze ich meine Spalten wie in Connect Four (mit tkinter/Python gemacht)?

self.main_window.geometry("700x640") 

self.top_frame = tkinter.Frame(self.main_window) 
self.top_frame.pack(side='top') 

self.bottom_frame = tkinter.Frame(self.main_window) 
self.bottom_frame.pack(side='bottom') 
# Creating the board 
self.board = tkinter.Canvas(self.main_window, width = 700, height=600) 
self.board.pack(anchor='nw') 
# A rectangle is made (top left coord., bottom right coord.) 
# Fill color = #Hexnumber 
self.board.create_rectangle(0, 0, 700, 600, fill="#1E90FF") 
# Line is drawn after rectangle cause it is drawn ONTOP (order matters) 
self.board.create_line(0, 0, 0, 700) 
self.board.create_line(0, 0, 600, 0) 
# Drawn in rows 
for rows in range(100, 600, 100): 
    self.board.create_line(0, rows, 700, rows, fill="") 
# Drawn in columns 
for columns in range(100, 700, 100): 
    self.board.create_line(columns, 0, columns, 600, fill="") 
# Drawn in circles 
for i in range(0, 700, 100): 
    for k in range(0, 700, 100): 
     self.board.create_oval(i, k, i+100, k+100, fill="") 

# Set up for circle pieces 
self.yellow_piece = tkinter.PhotoImage(file="piece1round.gif") 
self.black_piece = tkinter.PhotoImage(file="piece2round.gif") 
self.empty_piece = tkinter.PhotoImage(file="empty.gif") 

# Created a button & placing them at the bottom left of the window frame 
self.buttonOne = tkinter.Button(self.bottom_frame, width=13, text="Column 1", command = "?") 
self.buttonOne.pack(side = 'left') 
self.buttonTwo = tkinter.Button(self.bottom_frame, width=13, text="Column2") 
self.buttonTwo.pack(side='left') 
self.buttonThree = tkinter.Button(self.bottom_frame, width=13, text="Column3") 
self.buttonThree.pack(side='left') 
self.buttonFour = tkinter.Button(self.bottom_frame, width=13, text="Column4") 
self.buttonFour.pack(side='left') 
self.buttonFive = tkinter.Button(self.bottom_frame, width=13, text="Column5") 
self.buttonFive.pack(side='left') 
self.buttonSix = tkinter.Button(self.bottom_frame, width=13, text="Column6") 
self.buttonSix.pack(side='left') 
self.buttonSeven = tkinter.Button(self.bottom_frame, width=13, text="Column7") 
self.buttonSeven.pack(side='left') 

# Set up values for columns and rows 
self.board_width = 700 
self.board_row = 600 

self.column1 = "?" 

ConnectFourBoardDisplay

+1

Bitte formatieren Sie Ihren Code – Li357

+0

Was ich nicht enthalten war mein Startbildschirm, aber es hatte meine Import tkinter, und so. Ich hoffe, das ist organisierter; und ein Foto des Rasters, das ich gemacht habe, ist beigefügt –

Antwort

0

Was ich vorschlagen, ist etwas entlang der Linien von

import tkinter as tk 

root = tk.Tk() 
c = tk.Canvas(root, width = 700, height = 600) 
c.pack() 

board_state = [] 
for i in range(0, 700, 100): 
    column = [] 
    for k in range(0, 700, 100): 
     column.append(c.create_oval(i, k, i+100, k+100, fill="")) 
    board_state.append(column) 

tk.Button(root, text = "Click", command = change).pack() 

root.mainloop() 

Wenn Sie ein Element auf der Leinwand schaffen es gibt eine Ganzzahl, die die ID dieses Elements ist. Wir können also eine Liste erstellen, in der alle von Ihnen erstellten Ovale gespeichert sind, damit Sie sie referenzieren können.

def change(): 
    c.itemconfig(board_state[0][0], fill = "yellow") 

    coords = c.coords(board_state[0][0]) 
    x, y = (coords[0] + coords[2])/2, (coords[1] + coords[3])/2 
    c.delete(board_state[0][0]) 
    c.create_image(x, y, image = yellow_piece) 

nun in dieser Funktion haben Sie zwei Möglichkeiten, zunächst die Füllfarbe des Elements zu konfigurieren, dass das, was Sie auf die Spieler wollen abhängig. Oder wenn Sie das Bild stattdessen verwenden möchten, dann können Sie die Koordinaten des Ovals erhalten, die Mittelposition finden, das Oval löschen und an seiner Stelle ein Bild erstellen, das wiederum von dem jeweiligen Spieler abhängt.

Jetzt im Beispielcode verwendet es nur die obere linke Ecke. Sie müssen es ändern, um es dynamisch zu machen.

Jetzt würde ich in dem Rest des Codes an, Sie haben ein Modell mit Ihrer Ansicht nach gehen (MVC), in dem Fall, dass Sie mit der alternativen Methode der Verwendung c.delete(tk.ALL) gehen könnten, die die Leinwand löscht und dann eine andere Funktion, die redraws haben alles mit einer if-Anweisung, um zu bestimmen, ob dieser Fleck auf der Leinwand leer ist, hat ein Spielerstück.