2016-08-10 4 views
0

게임을하는 클래스 Game이 있다고 가정 해 보겠습니다. 게임이 끝나면 즉시 새로운 게임을 시작하고 싶습니다. 나는 자신의 클래스 정의 내에서 새로운 Game()을 인스턴스화함으로써 이것이 재귀 적으로 가능할 것이라고 생각했다. 이것이 가능한가? 버튼 라벨이 예상대로 변경 :파이썬에서 클래스를 다시 초기화하는 방법

import numpy as np 
import Tkinter as tk 

class Game: 
    def __init__(self, master, player1, player2): 
     frame = tk.Frame() 
     frame.grid() 
     self.master = master 
     self.player1 = player1 
     self.player2 = player2 
     self.current_player = player1 
     self.empty_text = "" 
     self.board = Board() 

     self.buttons = [[None for _ in range(3)] for _ in range(3)] 
     for i in range(3): 
      for j in range(3): 
       self.buttons[i][j] = tk.Button(frame, height=3, width=3, text=self.empty_text, command=lambda i=i, j=j: self.callback(self.buttons[i][j])) 
       self.buttons[i][j].grid(row=i, column=j) 

     self.reset_button = tk.Button(text="Reset", command=self.reset) 
     self.reset_button.grid(row=3) 

    def callback(self, button): 
     if button["text"] == self.empty_text: 
      button.configure(text=self.current_player.mark) 
      info = button.grid_info() 
      move = (info["row"], info["column"]) 
      self.board.place_mark(move, self.current_player.mark) 
      if self.board.over(): 
       print "The game is over. The player with mark %s won!" % self.current_player.mark 
       self.master.quit() 
      else: 
       self.switch_players() 

    def reset(self): 
     print "Resetting..." 
     self.master.destroy() 
     self = Game(self.master, self.player1, self.player2) 

    def switch_players(self): 
     if self.current_player == self.player1: 
      self.current_player = self.player2 
     else: 
      self.current_player = self.player1 


class Board: 
    def __init__(self, grid=np.ones((3,3))*np.nan): 
     self.grid = grid 

    def winner(self): 
     rows = [self.grid[i,:] for i in range(3)] 
     cols = [self.grid[:,j] for j in range(3)] 
     diag = [np.array([self.grid[i,i] for i in range(3)])] 
     cross_diag = [np.array([self.grid[2-i,i] for i in range(3)])] 
     lanes = np.concatenate((rows, cols, diag, cross_diag))  # A "lane" is defined as a row, column, diagonal, or cross-diagonal 

     any_lane = lambda x: any([np.array_equal(lane, x) for lane in lanes]) # Returns true if any lane is equal to the input argument "x" 
     if any_lane(np.ones(3)): 
      return 1 
     elif any_lane(np.zeros(3)): 
      return 0 

    def over(self): 
     return (not np.any(np.isnan(self.grid))) or (self.winner() is not None) 

    def place_mark(self, pos, mark): 
     num = self.mark2num(mark) 
     self.grid[tuple(pos)] = num 

    def mark2num(self, mark): 
     if mark == "X": 
      return 1 
     elif mark == "O": 
      return 0 
     else: 
      print "The player's mark must be either 'X' or 'O'." 


class HumanPlayer: 
    def __init__(self, mark): 
     self.mark = mark 


root = tk.Tk() 
app = Game(root, player1=HumanPlayer(mark="X"), player2=HumanPlayer(mark="O")) 
root.mainloop() 

나는 모든 게임을 처음 잘 :

나는 Tkinter의를 사용하여 GUI와 박하 사탕 발가락 게임을 쓰고 있어요, 구체적인 예를 제공합니다 승자가 선언됩니다 (아래 참조).

enter image description here enter image description here

문제는 내가 다시 빈 GUI를받을 수 있나요 있지만은, 'RESET'단추를 누르면, Game 여전히이 끝난 것을 '생각'승자의 선언을 인쇄 유지한다는 것입니다 :

enter image description here enter image description here

그것은 '다시 초기화'의 초기 값은 각각의 속성을 리셋하지 않고 클래스 수 있습니까?

+0

새로운 인스턴스를 만드시겠습니까? –

+2

'게임'인스턴스를 성공적으로 지우지 만 '승리 한'논리가 살아있는 '보드'는 지워지지 않습니다. – ballsatballsdotballs

답변

0

결국 나는 단순히 클래스를 '다시 인스턴스화'하지 않고 관련 속성을 '수동으로'재설정했습니다. 다음은 결과 코드입니다.

import numpy as np 
import Tkinter as tk 

class Game: 
    def __init__(self, master, player1, player2): 
     frame = tk.Frame() 
     frame.grid() 
     self.master = master 
     self.player1 = player1 
     self.player2 = player2 
     self.current_player = player1 
     self.empty_text = "" 
     self.board = Board() 

     self.buttons = [[None for _ in range(3)] for _ in range(3)] 
     for i in range(3): 
      for j in range(3): 
       self.buttons[i][j] = tk.Button(frame, height=3, width=3, text=self.empty_text, command=lambda i=i, j=j: self.callback(self.buttons[i][j])) 
       self.buttons[i][j].grid(row=i, column=j) 

     self.reset_button = tk.Button(text="Reset", command=self.reset) 
     self.reset_button.grid(row=3, column=0) 

     self.quit_button = tk.Button(text="Quit", command=self.quit) 
     # self.quit_button.grid(row=3, column=1) 

     self.setup_UI() 

    def setup_UI(self): 
     self.master.title="Tic Tac Toe" 


    def callback(self, button): 
     if self.board.over(): 
      pass 
     elif button["text"] == self.empty_text: 
      button.configure(text=self.current_player.mark) 
      info = button.grid_info() 
      move = (info["row"], info["column"]) 
      self.board.place_mark(move, self.current_player.mark) 
      if self.board.over(): 
       print "The game is over. The player with mark %s won!" % self.current_player.mark 
      else: 
       self.switch_players() 

    def reset(self): 
     print "Resetting..." 
     for i in range(3): 
      for j in range(3): 
       self.buttons[i][j].configure(text=self.empty_text) 
     self.board = Board(grid=np.ones((3,3))*np.nan) 
     self.current_player = self.player1 

    def quit(self): 
     self.master.destroy() 

    def switch_players(self): 
     if self.current_player == self.player1: 
      self.current_player = self.player2 
     else: 
      self.current_player = self.player1 


class Board: 
    def __init__(self, grid=np.ones((3,3))*np.nan): 
     self.grid = grid 

    def winner(self): 
     rows = [self.grid[i,:] for i in range(3)] 
     cols = [self.grid[:,j] for j in range(3)] 
     diag = [np.array([self.grid[i,i] for i in range(3)])] 
     cross_diag = [np.array([self.grid[2-i,i] for i in range(3)])] 
     lanes = np.concatenate((rows, cols, diag, cross_diag))  # A "lane" is defined as a row, column, diagonal, or cross-diagonal 

     any_lane = lambda x: any([np.array_equal(lane, x) for lane in lanes]) # Returns true if any lane is equal to the input argument "x" 
     if any_lane(np.ones(3)): 
      return 1 
     elif any_lane(np.zeros(3)): 
      return 0 

    def over(self): 
     return (not np.any(np.isnan(self.grid))) or (self.winner() is not None) 

    def place_mark(self, pos, mark): 
     num = self.mark2num(mark) 
     self.grid[tuple(pos)] = num 

    def mark2num(self, mark): 
     if mark == "X": 
      return 1 
     elif mark == "O": 
      return 0 
     else: 
      print "The player's mark must be either 'X' or 'O'." 


class HumanPlayer: 
    def __init__(self, mark): 
     self.mark = mark 


root = tk.Tk() 
root.title("Tic Tac Toe") 
app = Game(root, player1=HumanPlayer(mark="X"), player2=HumanPlayer(mark="O")) 
root.mainloop() 

아래의 그림은 내가 Tic Tac Toe을 여러 번 연주 한 방법을 보여줍니다.

enter image description here

관련 문제