import os def _draw_game(dd): os.system('cls' if os.name == 'nt' else 'clear') d = ['X' if dd[i]==0 else 'O' if dd[i]==9 else i+1 for i in range(9)] print( f""" Tic Tac Toe Player 1 (X) - Player 2 (O) | | {d[0]} | {d[1]} | {d[2]} _____|_____|_____ | | {d[3]} | {d[4]} | {d[5]} _____|_____|_____ | | {d[6]} | {d[7]} | {d[8]} """) def _gen_win_pats(): wi = [ [0,1,2],[3,4,5],[6,7,8], [0,3,6],[1,4,7],[2,5,8], [0,4,8],[2,4,6] ] pats = [] for cb in wi: m = 0 for pos in cb: m |= (1 << pos) pats.append(m) return pats _win_pats = _gen_win_pats() def _is_winning(data, player_val): state = 0 for i in range(9): if data[i] == player_val: state |= (1 << i) for pat in _win_pats: if (state & pat) == pat: return True return False def handleKBI(lmbd): def runlambda(*args,**kwargs): try: return lmbd(*args,**kwargs) except KeyboardInterrupt: print("\n\nThanks for playing! Goodbye.") return runlambda @handleKBI def main(): while True: data = [-1] * 9 cpl = True while True: _draw_game(data) if _is_winning(data, 0): print("RESULT\nPlayer 1 Wins!") break if _is_winning(data, 9): print("RESULT\nPlayer 2 Wins!") break if sum(1 for x in data if x == -1) <= 1: for i in range(9): if data[i] == -1: data[i] = 0 if cpl else 9 if _is_winning(data, 0): print("RESULT\nPlayer 1 Wins!") break if _is_winning(data, 9): print("RESULT\nPlayer 2 Wins!") break print("RESULT\nGame Draw!") break op = input(f"Player {1 if cpl else 2}\nEnter a number: ") try: op = int(op) idx = op - 1 if idx < 0 or idx > 8: print("Invalid input. Please enter 1-9.") continue if data[idx] != -1: print("Position already taken. Try again.") continue data[idx] = 0 if cpl else 9 cpl = not cpl except ValueError: print("Invalid input. Please enter a number.") continue play_again = input("\nPlay again? (y/n): ").lower() if play_again != 'y': print("\n\nThanks for playing! Goodbye.") break if __name__ == '__main__': main()