2 # A thread that runs the game
3 class GameThread(StoppableThread):
4 def __init__(self, board, players):
5 StoppableThread.__init__(self)
8 self.state = {"turn" : None} # The game state
9 self.error = 0 # Whether the thread exits with an error
10 self.lock = threading.RLock() #lock for access of self.state
11 self.cond = threading.Condition() # conditional for some reason, I forgot
12 self.final_result = ""
14 # Run the game (run in new thread with start(), run in current thread with run())
17 while not self.stopped():
19 for p in self.players:
21 if isinstance(p, NetworkSender):
22 self.state["turn"] = p.base_player # "turn" contains the player who's turn it is
24 self.state["turn"] = p
27 [x,y] = p.select() # Player selects a square
34 result = self.board.select(x, y, colour = p.colour)
35 for p2 in self.players:
36 p2.update(result) # Inform players of what happened
40 target = self.board.grid[x][y]
41 if isinstance(graphics, GraphicsThread):
43 graphics.state["moves"] = self.board.possible_moves(target)
44 graphics.state["select"] = target
46 time.sleep(turn_delay)
49 if len(self.board.possible_moves(target)) == 0:
50 #print "Piece cannot move"
52 if isinstance(graphics, GraphicsThread):
54 graphics.state["moves"] = None
55 graphics.state["select"] = None
56 graphics.state["dest"] = None
60 [x2,y2] = p.get_move() # Player selects a destination
67 result = self.board.update_move(x, y, x2, y2)
68 for p2 in self.players:
69 p2.update(str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2)) # Inform players of what happened
71 if isinstance(graphics, GraphicsThread):
73 graphics.state["moves"] = [[x2,y2]]
75 time.sleep(turn_delay)
77 if isinstance(graphics, GraphicsThread):
79 graphics.state["select"] = None
80 graphics.state["dest"] = None
81 graphics.state["moves"] = None
83 # Commented out exception stuff for now, because it makes it impossible to tell if I made an IndentationError somewhere
85 #result = "ILLEGAL " + e.message
86 #sys.stderr.write(result + "\n")
90 # self.final_result = self.state["turn"].colour + " " + "ILLEGAL"
92 if self.board.king["black"] == None:
93 if self.board.king["white"] == None:
95 self.final_result = "DRAW"
98 self.final_result = "white"
100 elif self.board.king["white"] == None:
102 self.final_result = "black"
110 for p2 in self.players:
111 p2.quit(self.final_result)
118 def opponent(colour):
119 if colour == "white":