def test_showavailmoves(self): move = Moves() self.assertEqual(move.showAvailMoves(), {'topRow':['l','m','r'], 'midRow':['l','m','r'], 'botRow':['l','m','r']}) move.acceptMove({'mid': 'm', 'player': 2}) self.assertEqual(move.showAvailMoves()['midRow'], ['l','r']) move.acceptMove({'mid': 'l', 'player': 1}) move.acceptMove({'mid': 'r', 'player': 2}) self.assertEqual(move.showAvailMoves()['midRow'], [])
def test_acceptmove(self): move = Moves() move.acceptMove({'top': 'l', 'player': 1}) self.assertEqual(move.state['top'], {'l': 1, 'm':0, 'r':0}) self.assertRaises(InputError, move.acceptMove, {'top': 'l', 'player': 2}) move.acceptMove({'mid': 'm', 'player': 2}) self.assertEqual(move.state['mid'], {'l': 0, 'm':2, 'r':0}) move.acceptMove({'bot': 'r', 'player': 2}) self.assertEqual(move.state['bot'], {'l': 0, 'm':0, 'r':2}) move.acceptMove({'bot': 'm', 'player': 1}) self.assertEqual(move.state['bot'], {'l': 0, 'm':1, 'r':2})
class GameLogic(): """Class to control: * Player creation * Order in which players make moves * Send moves to board * Keep score and determine winners """ def __init__(self): self.board = Board() self.moves = Moves() self.getPlayers() self.active_player = 1 def startGame(self): # ask player_1 to make a move # accept player_1's move and validate that it is acceptable? # check if that move resulted in a win? This can't happen at the very least till 3 moves are made by a player # ask player_2 to make a move while not self.check_winner(): self.clear() print("Player {} turn".format(self.active_player)) self.board.printBoard(self.moves) self.player_turn() print("Player {} wins".format(self.check_winner())) def getPlayers(self): print('Player 1') self.player_1 = Player(1) print('Player 2') self.player_2 = Player(2) def check_winner(self): rows = [self.check_row_win(row) for row in self.moves.state.keys()] cols = [self.check_col_win(col) for col in ['l', 'm', 'r']] diag = self.check_diag_win() if diag is not None: return diag for item in rows: if item is not None: return item for item in cols: if item is not None: return item def check_row_win(self, row): cntr = list(self.moves.state[row].values()) if cntr.count(1) == 3: return 1 elif cntr.count(2) == 3: return 2 def check_col_win(self, col): cntr = [self.moves.state[x][col] for x in self.moves.state.keys()] if cntr.count(1) == 3: return 1 elif cntr.count(2) == 3: return 2 def check_diag_win(self): cntr1 = [ self.moves.state['top']['l'], self.moves.state['mid']['m'], self.moves.state['bot']['r'] ] cntr2 = [ self.moves.state['top']['r'], self.moves.state['mid']['m'], self.moves.state['bot']['l'] ] if cntr1.count(1) == 3 or cntr2.count(1) == 3: return 1 elif cntr1.count(2) == 3 or cntr2.count(2) == 3: return 2 def player_turn(self): player = self.player_1 if self.active_player == 1 else self.player_2 try: self.moves.acceptMove(player.getMove()) except InputError as e: print('Error: ', e.message) if self.active_player == 1: self.active_player = 2 else: self.active_player = 1 def clear(self): os.system('clear')