117 lines
3.0 KiB
Python
117 lines
3.0 KiB
Python
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()
|