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와 박하 사탕 발가락 게임을 쓰고 있어요, 구체적인 예를 제공합니다 승자가 선언됩니다 (아래 참조).문제는 내가 다시 빈 GUI를받을 수 있나요 있지만은, 'RESET'단추를 누르면, Game
여전히이 끝난 것을 '생각'승자의 선언을 인쇄 유지한다는 것입니다 :
새로운 인스턴스를 만드시겠습니까? –
'게임'인스턴스를 성공적으로 지우지 만 '승리 한'논리가 살아있는 '보드'는 지워지지 않습니다. – ballsatballsdotballs