Tic Tac Toe game
Tags: replit, python
Published: 2020-05-04 00:43:41

using classes

class TTTBoard:
    def __init__(self):
        self.cells = ["*", "*", "*", "*", "*", "*", "*", "*", "*"]

    def __str__(self):
        s = self.cells[0] + self.cells[1] + self.cells[2] + "\n"
        s += self.cells[3] + self.cells[4] + self.cells[5] + "\n"
        s += self.cells[6] + self.cells[7] + self.cells[8] + "\n"
        return s

    def make_move(self, player, posn):
        posn = int(posn)
        player = str(player)

        if 0 <= posn <= 8 and self.cells[posn] == "*":
            self.cells[posn] = player
            return ("True: move made")
        elif posn > 8 or posn < 0:
            return ("False: posn should be between 1 and 8")

        elif self.cells[posn] != "*":
            return ("posn occupied")

    def has_won(self, player):
        # 3 in a row/column/diagonal
        if self.cells[0] == player and self.cells[1] == player and self.cells[
                2] == player:
            return True
        elif self.cells[3] == player and self.cells[
                4] == player and self.cells[5] == player:
            return True
        elif self.cells[6] == player and self.cells[
                7] == player and self.cells[8] == player:
            return True
        #columns
        elif self.cells[0] == player and self.cells[
                3] == player and self.cells[6] == player:
            return True
        elif self.cells[1] == player and self.cells[
                4] == player and self.cells[7] == player:
            return True
        elif self.cells[2] == player and self.cells[
                5] == player and self.cells[8] == player:
            return True
        #diagonals
        elif self.cells[0] == player and self.cells[
                4] == player and self.cells[8] == player:
            return True
        elif self.cells[2] == player and self.cells[
                4] == player and self.cells[6] == player:
            return True
        else:
            return False

    def game_over(self):
        if self.has_won("X") == True or self.has_won("O") == True:
            return True
        else:
            return False

        def check(i):
            if i == "*":
                return True

        y = list(filter(check, self.cells))
        if len(y) == 0:
            result = True
            return result
        else:
            return False

    def clear(self):
        self.cells = ["*", "*", "*", "*", "*", "*", "*", "*", "*"]
        return print(self)


def play_tic_tac_toe() -> None:
    """Uses your class to play TicTacToe"""

    def is_int(maybe_int: str):
        """Returns True if val is int, False otherwise

        Args:
            maybe_int - string to check if it's an int

        Returns:
            True if maybe_int is an int, False otherwise
        """
        try:
            int(maybe_int)
            return True
        except ValueError:
            return False

    brd = TTTBoard()
    players = ["X", "O"]
    turn = 0

    while not brd.game_over():
        print(brd)
        move: str = input(f"Player {players[turn]} what is your move? ")

        if not is_int(move):
            raise ValueError(
                f"Given invalid position {move}, "
                "position must be integer between 0 and 8 inclusive")

        if brd.make_move(players[turn], int(move)):
            turn = not turn

    print(f"\nGame over!\n\n{brd}")
    if brd.has_won(players[0]):
        print(f"{players[0]} wins!")
    elif brd.has_won(players[1]):
        print(f"{players[1]} wins!")
    else:
        print(f"Board full, that's game!")


if __name__ == "__main__":
    # here are some tests. These are not at all exhaustive tests. You will
    # DEFINITELY need to write some more tests to make sure that your TTTBoard class
    # is behaving properly.
    brd = TTTBoard()
    brd.make_move("X", 8)
    brd.make_move("O", 7)

    assert brd.game_over() == False

    brd.make_move("X", 5)
    brd.make_move("O", 6)
    brd.make_move("X", 2)

    assert brd.has_won("X") == True
    assert brd.has_won("O") == False
    assert brd.game_over() == True

    brd.clear()

    assert brd.game_over() == False

    brd.make_move("O", 3)
    brd.make_move("O", 4)
    brd.make_move("O", 5)

    assert brd.has_won("X") == False
    assert brd.has_won("O") == True
    assert brd.game_over() == True

    print("All tests passed!")

    # uncomment to play!
    # play_tic_tac_toe()