from os import system class TicTacToe: def __init__(self, playerSymbols=['0', 'X']): self.board = [0 for _ in range(9)] name1, name2 = self.getUsernames() self.players = [ { 'name': name1, 'sym': playerSymbols[0], 'num': 1 }, { 'name': name2, 'sym': playerSymbols[1], 'num': 4 } ] def getUsernames(self): return [input(f'Spiller {i+1} sitt navn: ') for i in range(2)] def toPieceArray(self): return \ [ self.players[0]['sym'] if i==self.players[0]['num'] else \ self.players[1]['sym'] if i==self.players[1]['num'] else \ ' ' for i in self.board ] def pieceExistAt(self, pos): return self.board[pos] == self.players[0]['num'] or self.board[pos] == self.players[1]['num'] def hasWon(self, userId): getPiecesFromIndexes = lambda indexes: [self.board[i] for i in indexes] indexesList = [[0,4,8], [1,4,7], [2,4,6], [3,4,5], [0,3,6], [0,1,2], [2,5,8], [6,7,8]] winningSum = self.players[userId]['num'] * 3 return any([sum(getPiecesFromIndexes(indexes)) == winningSum for indexes in indexesList]) def __str__(self): pieces = self.toPieceArray() return """╭───┬───┬───╮ │ {} │ {} │ {} │ ├───┼───┼───┤ │ {} │ {} │ {} │ ├───┼───┼───┤ │ {} │ {} │ {} │ ╰───┴───┴───╯""".format(*pieces) def selectedBoardAt(self, x, y) -> str: characterMap = { '─': '═', '│': '║', '┼': '╬', '╰': '╚', '╯': '╝', '╭': '╔', '╮': '╗', '├': '╠', '┴': '╩', '┤': '╣', '┬': '╦', } pointsToChange = \ [(0 + x * 4, i + y * 2) for i in range(3)] + \ [(4 + x * 4, i + y * 2) for i in range(3)] + \ [(i + x * 4, 0 + y * 2) for i in range(1,4)] + \ [(i + x * 4, 2 + y * 2) for i in range(1,4)] board = [list(line) for line in str(self).split('\n')] for x,y in pointsToChange: board[y][x] = characterMap[board[y][x]] return '\n'.join([''.join(line) for line in board]) def drawBoard(self, userId, x=-1, y=-1): system('clear') print(f'({self.players[userId]["sym"]}) - {self.players[userId]["name"].upper()}\'S TURN\n') print(self.selectedBoardAt(x,y) if (x,y) != (-1,-1) else str(self)) def selectPiece(self, userId) -> int: x, y = 0, 0 while True: self.drawBoard(userId, x,y) key = input(f" W E\n A S D <- Enter : ")[0] if key in ['s', 'j'] and y!=2: y+=1 elif key in ['w', 'k'] and y!=0: y-=1 elif key in ['d', 'l'] and x!=2: x+=1 elif key in ['a', 'h'] and x!=0: x-=1 elif key == 'e' and not self.pieceExistAt(3*y + x): return 3*y + x def youWinTheGameItsHalloweenBois(self, userId): print(f""" ▓██ ██▓ ▒█████ █ ██ █ █░ ██▓ ███▄ █ ▒██ ██▒▒██▒ ██▒ ██ ▓██▒ ▓█░ █ ░█░▓██▒ ██ ▀█ █ ▒██ ██░▒██░ ██▒▓██ ▒██░ ▒█░ █ ░█ ▒██▒▓██ ▀█ ██▒ ░ ▐██▓░▒██ ██░▓▓█ ░██░ ░█░ █ ░█ ░██░▓██▒ ▐▌██▒ ░ ██▒▓░░ ████▓▒░▒▒█████▓ ░░██▒██▓ ░██░▒██░ ▓██░ ██▒▒▒ ░ ▒░▒░▒░ ░▒▓▒ ▒ ▒ ░ ▓░▒ ▒ ░▓ ░ ▒░ ▒ ▒ ▓██ ░▒░ ░ ▒ ▒░ ░░▒░ ░ ░ ▒ ░ ░ ▒ ░░ ░░ ░ ▒░ ▒ ▒ ░░ ░ ░ ░ ▒ ░░░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ {self.players[userId]['name']} """) def spookyTie(self): print(""" ███▄ █ ▒█████ ▄▄▄▄ ▒█████ ▓█████▄▓██ ██▓ █ █░ ██▓ ███▄ █ ██████ ██ ▀█ █ ▒██▒ ██▒▓█████▄ ▒██▒ ██▒▒██▀ ██▌▒██ ██▒ ▓█░ █ ░█░▓██▒ ██ ▀█ █ ▒██ ▒ ▓██ ▀█ ██▒▒██░ ██▒▒██▒ ▄██▒██░ ██▒░██ █▌ ▒██ ██░ ▒█░ █ ░█ ▒██▒▓██ ▀█ ██▒░ ▓██▄ ▓██▒ ▐▌██▒▒██ ██░▒██░█▀ ▒██ ██░░▓█▄ ▌ ░ ▐██▓░ ░█░ █ ░█ ░██░▓██▒ ▐▌██▒ ▒ ██▒ ▒██░ ▓██░░ ████▓▒░░▓█ ▀█▓░ ████▓▒░░▒████▓ ░ ██▒▓░ ░░██▒██▓ ░██░▒██░ ▓██░▒██████▒▒ ░ ▒░ ▒ ▒ ░ ▒░▒░▒░ ░▒▓███▀▒░ ▒░▒░▒░ ▒▒▓ ▒ ██▒▒▒ ░ ▓░▒ ▒ ░▓ ░ ▒░ ▒ ▒ ▒ ▒▓▒ ▒ ░ ░ ░░ ░ ▒░ ░ ▒ ▒░ ▒░▒ ░ ░ ▒ ▒░ ░ ▒ ▒ ▓██ ░▒░ ▒ ░ ░ ▒ ░░ ░░ ░ ▒░░ ░▒ ░ ░ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ▒ ▒ ░░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ """) def checkGameStatus(self,userId): if self.hasWon(userId): self.drawBoard(userId) # print(self.players[userId]['name'], 'has won!') self.youWinTheGameItsHalloweenBois(userId) exit(0) elif not 0 in self.board: self.drawBoard(userId) self.spookyTie() exit(0) def loop(self): while True: piece = self.selectPiece(0) self.board[piece] = self.players[0]['num'] self.checkGameStatus(0) piece = self.selectPiece(1) self.board[piece] = self.players[1]['num'] self.checkGameStatus(1) if __name__ == "__main__": game = TicTacToe() game.loop() print(game)