2013-01-16 17 views
6

Próbuję zbudować prostą grę Connect Four z Python(2.7)
Tworzenie planszę z Python i Tkinter

I stworzyli płytę, która składa się z prostej listy Python wielowymiarowej.
Lista My Board wygląda następująco:

board = [ 

[_,_,_,_,_,_,_,_,_,_], 
[_,_,_,_,_,_,_,_,_,_], 
[_,_,_,_,_,_,_,_,_,_], 
[_,_,_,_,_,_,_,_,_,_], 
[_,_,_,_,_,_,_,_,_,_], 
[_,_,_,_,_,_,_,_,_,_], 
[_,_,_,_,O,_,_,_,_,_], 
[_,_,_,_,X,_,_,_,_,_], 
[_,_,_,_,X,O,_,_,_,_], 
[_,_,_,_,X,O,_,_,_,_], 

]

Czy X jest Gracz1 i O jest player2 (lub komputer).

Teraz stworzyliśmy jakiś kod podstawowy dla GUI, tak:

# 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() 

Pytanie: Jak mogę stworzyć wizualną reprezentację planszy, tak, że dla każdej listy, tam to jest prostokąt? Czy istnieje również sposób wykrywania, kiedy kliknięty jest prostokąt i zastąpienie odpowiedniej wartości listy?

Mam nadzieję, że pytanie nie jest zbyt niejasne. Dzięki!

+3

Czy jest jakiś powód, dla którego każdy element twojej tablicy jest samą listą? Mam na myśli '['_']', '['X']' lub '['O']'. Czy nie powinny to być po prostu elementy, takie jak '' _'' 'X'' czy' 'O''? – ford

+0

Chyba nie. Właśnie uczę się Pythona i to był mój pierwszy pomysł, jak to zrobić. Jestem pewien, że jest lepszy sposób, ale po prostu ich nie znam. – intelis

+0

@fizzisist: dziękuję, właśnie zredagowałem kod – intelis

Odpowiedz

6

I stworzył płytę etykiet i pokolorować je według którego kliknięciu:

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() 

To nie robi żadnej walidacji (aby upewnić się, że element kliknięciu na dole na przykład). Byłoby to o wiele lepsze z klasami zamiast danych globalnych, ale jest to ćwiczenie dla zainteresowanego programisty :).

3

Prawdopodobnie chcesz utworzyć siatkę o wartości Buttons. Można je ustawić zgodnie z wartościami podanymi w board i przypisać wywołanie zwrotne, które po kliknięciu aktualizuje board.

+0

Dokładnie to zrobiłem z moją wersją * Battleship *. Przyciski działają wyjątkowo dobrze w tym celu –

Powiązane problemy