138 lines
4 KiB
Python
138 lines
4 KiB
Python
def clear_output():
|
|
print("\n"*100)
|
|
|
|
def print_banner():
|
|
print("TicTacToe - v1.0\n")
|
|
|
|
def play_again():
|
|
global board, marker, current_player
|
|
|
|
while True:
|
|
play_again = input("Do you want to play again? [Y/N]: ").upper()
|
|
|
|
if play_again == 'Y':
|
|
board = {1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9'}
|
|
marker = {'player1': 'A', 'player2': 'B'}
|
|
current_player = '1'
|
|
|
|
return True
|
|
elif play_again == 'N':
|
|
return False
|
|
|
|
def game_over():
|
|
winner = 'N'
|
|
|
|
# Check for X/O winner
|
|
for player, mark in marker.items():
|
|
# Horizontal
|
|
if board[7] == mark and board[8] == mark and board[9] == mark:
|
|
winner = (player, mark)
|
|
elif board[4] == mark and board[5] == mark and board[6] == mark:
|
|
winner = (player, mark)
|
|
elif board[1] == mark and board[2] == mark and board[3] == mark:
|
|
winner = (player, mark)
|
|
# Vertical
|
|
elif board[7] == mark and board[4] == mark and board[1] == mark:
|
|
winner = (player, mark)
|
|
elif board[8] == mark and board[5] == mark and board[2] == mark:
|
|
winner = (player, mark)
|
|
elif board[9] == mark and board[6] == mark and board[3] == mark:
|
|
winner = (player, mark)
|
|
|
|
# Diagonal
|
|
elif board[7] == mark and board[5] == mark and board[3] == mark:
|
|
winner = (player, mark)
|
|
elif board[9] == mark and board[5] == mark and board[1] == mark:
|
|
winner = (player, mark)
|
|
|
|
# Check if winner has been found
|
|
if winner != 'N':
|
|
clear_output()
|
|
print(f"*** THE WINNER IS {winner[0]}/{winner[1]} ***")
|
|
return not play_again()
|
|
|
|
# Check if it is a draw
|
|
elif not board[1].isdigit() and not board[2].isdigit() and not board[3].isdigit()\
|
|
and not board[4].isdigit() and not board[5].isdigit() and not board[6].isdigit()\
|
|
and not board[7].isdigit() and not board[8].isdigit() and not board[9].isdigit():
|
|
clear_output()
|
|
print(f"** THE GAME ENDS IN DRAW **")
|
|
return not play_again()
|
|
else:
|
|
return False
|
|
|
|
def print_board(board):
|
|
print(f" {board[7]} | {board[8]} | {board[9]} ")
|
|
print(f" {board[4]} | {board[5]} | {board[6]} ")
|
|
print(f" {board[1]} | {board[2]} | {board[3]} ")
|
|
print(f"\n P1 - {marker['player1']}")
|
|
print(f" P2 - {marker['player2']}")
|
|
|
|
|
|
def start_game():
|
|
while True:
|
|
player1 = input("(Player 1) What marker would you like to be? [X/O]: ").upper()
|
|
|
|
if player1 == 'X':
|
|
player2 = 'O'
|
|
break
|
|
elif player1 == 'O':
|
|
player2 = 'X'
|
|
break
|
|
else:
|
|
clear_output()
|
|
print("Invalid Marker! Please enter x or o")
|
|
|
|
return (player1, player2)
|
|
|
|
def select_position(playerid):
|
|
player = "player" + playerid
|
|
position = input(f"(Player {playerid}, [{marker[player]}]) Select Position (1-9): ")
|
|
|
|
if position == "q":
|
|
print("Exiting...")
|
|
exit()
|
|
|
|
if position.isdigit():
|
|
position = int(position)
|
|
|
|
# Verify position is in range
|
|
if position >= 1 and position <= 9:
|
|
|
|
# Position is available
|
|
if board[position].isdigit():
|
|
board[position] = marker[player]
|
|
|
|
if playerid == '1':
|
|
return '2'
|
|
else:
|
|
return '1'
|
|
# Position is taken
|
|
else:
|
|
print("Uh oh... already selected!")
|
|
|
|
return playerid
|
|
|
|
# Store board in key:value pairs, isnum = not taken
|
|
board = {1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9'}
|
|
|
|
# Current Player is either 1 or 2
|
|
current_player = '1'
|
|
|
|
# Store the Player Makers (X/O)
|
|
marker = {'player1': 'A', 'player2': 'B'}
|
|
|
|
# Start Game Loop
|
|
while not game_over():
|
|
if marker['player1'] == 'A' or marker['player2'] == 'B':
|
|
marker['player1'], marker['player2'] = start_game()
|
|
|
|
clear_output()
|
|
|
|
print_banner()
|
|
print_board(board)
|
|
current_player = select_position(current_player)
|
|
|
|
|
|
|