2017-09-20 16 views
0

我目前正在製作一個Tic-Tac-Toe遊戲,並且我正在努力檢查是否有人獲得了連續3件作品,所以我可以告訴他們他們已經贏了。我試圖通過檢查按鈕的文本來做到這一點,看看我是否已經連續3次。但是,我不知道如何檢查列表中特定按鈕的文本。有沒有人有任何想法,或者如果有更好的方法,你能讓我知道嗎?如何獲取按鈕列表中特定按鈕的文本?我正在使用Tkinter

全碼

import tkinter as tk 


class TicTacToe(tk.Tk): 
    def __init__(self): 
     super().__init__() 
     # Vars 
     self.rounds_played = 0 
     self.wins = 0 
     self.losses = 0 
     self.player = 0 
     self.turn = 0 
     self.clicked_buttons = [] 

     # Attributes 
     self.resizable(False, False) 
     self.attributes("-toolwindow", True) 

     # Start 
     self.game_title = tk.Label(text="Stew's Tic Tac Toe") 
     self.name_label = tk.Label(text="Choose a name\n(Press the \'Enter\' key to submit)") 
     self.name_entry = tk.Entry() 
     self.symbol_label = tk.Label(text="Choose your symbol") 
     self.symbol_buttons = [tk.Button(text="[X]", command=lambda: self.symbol_select(0)), 
           tk.Button(text="[O]", command=lambda: self.symbol_select(1))] 
     self.next = tk.Button(text="Next", command=self.next_button) 
     self.ready = tk.Button(text="Start", command=self.start_game_button) 
     self.game_title.grid(row=0) 
     self.name_label.grid(row=1) 
     self.name_entry.grid(row=2) 
     self.name_entry.bind("<Return>", lambda x: self.set_player_name(self.player)) 

    def set_player_name(self, num): 
     if num == 0: 
      self.names = [self.name_entry.get()] 
      if self.names[0] == " ": 
       self.names = ["Player 1"] 
      print(self.names[0]) 
      self.symbol_label.grid(row=3,) 
      self.symbol_buttons[0].grid(row=4, sticky=tk.W, padx=57.5) 
      self.symbol_buttons[1].grid(row=4, sticky=tk.E, padx=57.5) 
     elif num == 1: 
      self.names.append(self.name_entry.get()) 
      if self.names[1] == "" or " ": 
       self.names.append("Player 2") 
      self.ready.grid(row=4) 

    def symbol_select(self, num): 
     if num == 0: 
      self.symbol = ["[X]", 
          "[O]"] 
     else: 
      self.symbol = ["[X]", 
          "[O]"] 
     self.next.grid(row=5) 

    def next_button(self): 
     self.player = 1 
     self.next.grid_forget() 
     self.name_entry.delete(0, tk.END) 
     self.symbol_label.grid_forget() 
     for x in self.symbol_buttons: 
      x.grid_forget() 

    def start_game_button(self): 
     self.game_title.grid_configure(row=0, column=1, columnspan=3) 
     self.whos_turn = tk.Label(text="{}\'s turn".format(self.names[0])) 
     self.whos_turn.grid(row=1, column=1, columnspan=3) 
     self.ready.grid_forget() 
     self.name_label.grid_forget() 
     self.name_entry.grid_forget() 
     self.game_buttons = [tk.Button(text="[ ]", command=lambda: self.move_update(0)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(1)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(2)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(3)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(4)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(5)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(6)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(7)), 
          tk.Button(text="[ ]", command=lambda: self.move_update(8))] 
     num = 0 
     for r in range(0,3): 
      for c in range(0,3): 
       self.game_buttons[num].grid(row=(r%3 + 2), column=(c%3 + 1)) 
       num = num + 1 
     self.rounds = tk.Label(text="Rounds Played: {}".format(self.rounds_played)) 
     self.rounds.grid(row=5, column=1, columnspan=3) 

    def move_update(self, num): 
     if num not in self.clicked_buttons: 
      self.clicked_buttons.append(num) 
      self.turn = self.turn + 1 
      if self.turn%2 == 1: 
       self.game_buttons[num].config(text=self.symbol[0]) 
      elif self.turn%2 == 0: 
       self.game_buttons[num].config(text=self.symbol[1]) 
     # Here is where I am struggling 
     for x in range(0,8): 
      if self.game_buttons[x] == "[X]" and self.game_buttons[(x+3)%9]: 
       if self.game_buttons[(x+6)%9] == "[X]": 
        print("Winner") 
     # Here is where it ends 
     if self.turn == 9: 
      self.rounds_played = self.rounds_played + 1 
      self.rounds.configure(text="Rounds Played: {}".format(self.rounds_played)) 
      self.play_again = tk.Button(text="Play Again?", command=self.new_game) 
      self.play_again.grid(row=6, column=1, columnspan=3) 

    def new_game(self): 
     self.turn = 0 



game = TicTacToe() 
game.mainloop() 

部分我與

for x in range(0,8): 
      if self.game_buttons[x] == "[X]" and self.game_buttons[(x+3)%9]: 
       if self.game_buttons[(x+6)%9] == "[X]": 
        print("Winner") 

我在這部分我沒有找到文字實現掙扎,但我真的不知道該怎麼對雙方調用具體的清單項目和文字。

+1

'self.game_buttons [X] [ 「文本」]'將是特定按鈕的文本。 – jasonharper

+0

我試過了,但它似乎沒有工作過。但我可以再試一次。 *編輯*我看到我定義,如果陳述錯誤,那就是爲什麼它不起作用。謝謝。 – stew3254

回答

1

調用包含tkinter Button小部件的list中的元素將返回小部件本身,就像調用存儲在list元素中的任何其他值一樣。這意味着如果你想要text屬性值的元素,你可以使用["text"].cget("text")

下面參見:

from tkinter import * 

root = Tk() 

array = [Button(root, text="1"), Button(root, text="2"), Button(root, text="3")] 

for i in array: 
    print(type(i)) 
    print(i.cget("text")) 
    print(i["text"]) 
+0

謝謝,這使得它更容易理解。 – stew3254

相關問題