Exemplo n.º 1
0
 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'], [])
Exemplo n.º 2
0
 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})
Exemplo n.º 3
0
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')