(self, force_recalculate=False)
| 174 | return h |
| 175 | |
| 176 | def game_over(self, force_recalculate=False): |
| 177 | # returns true if game over (a player has won or it's a draw) |
| 178 | # otherwise returns false |
| 179 | # also sets 'winner' instance variable and 'ended' instance variable |
| 180 | if not force_recalculate and self.ended: |
| 181 | return self.ended |
| 182 | |
| 183 | # check rows |
| 184 | for i in range(LENGTH): |
| 185 | for player in (self.x, self.o): |
| 186 | if self.board[i].sum() == player*LENGTH: |
| 187 | self.winner = player |
| 188 | self.ended = True |
| 189 | return True |
| 190 | |
| 191 | # check columns |
| 192 | for j in range(LENGTH): |
| 193 | for player in (self.x, self.o): |
| 194 | if self.board[:,j].sum() == player*LENGTH: |
| 195 | self.winner = player |
| 196 | self.ended = True |
| 197 | return True |
| 198 | |
| 199 | # check diagonals |
| 200 | for player in (self.x, self.o): |
| 201 | # top-left -> bottom-right diagonal |
| 202 | if self.board.trace() == player*LENGTH: |
| 203 | self.winner = player |
| 204 | self.ended = True |
| 205 | return True |
| 206 | # top-right -> bottom-left diagonal |
| 207 | if np.fliplr(self.board).trace() == player*LENGTH: |
| 208 | self.winner = player |
| 209 | self.ended = True |
| 210 | return True |
| 211 | |
| 212 | # check if draw |
| 213 | if np.all((self.board == 0) == False): |
| 214 | # winner stays None |
| 215 | self.winner = None |
| 216 | self.ended = True |
| 217 | return True |
| 218 | |
| 219 | # game is not over |
| 220 | self.winner = None |
| 221 | return False |
| 222 | |
| 223 | def is_draw(self): |
| 224 | return self.ended and self.winner is None |
no outgoing calls
no test coverage detected