Skip to content

Instantly share code, notes, and snippets.

@sgtsquiggs
Created February 1, 2016 22:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgtsquiggs/e1ae673d5ace283d2568 to your computer and use it in GitHub Desktop.
Save sgtsquiggs/e1ae673d5ace283d2568 to your computer and use it in GitHub Desktop.
TIC TAC TOE
import random
def draw_board(board):
print(' | |')
print(' %s | %s | %s' % (board[1], board[2], board[3]))
print(' | |')
print('---+---+---')
print(' | |')
print(' %s | %s | %s' % (board[4], board[5], board[6]))
print(' | |')
print('---+---+---')
print(' | |')
print(' %s | %s | %s' % (board[7], board[8], board[9]))
print(' | |')
def input_player_letter():
letter = ''
while not (letter == 'X' or letter == 'O'):
print('Choose X or O:')
letter = input().upper()
# the first element in the lsit is the player's letter
if letter == 'X':
return ['X', 'O']
else:
return ['O', 'X']
def who_goes_first():
if random.randint(0, 1) == 0:
return 'computer'
else:
return 'player'
def play_again():
print('Play again?')
return input().lower().startswith('y')
def make_move(board, letter, move):
board[move] = letter
def is_winner(board, letter):
return ((board[1] == board[2] == board[3] == letter) or
(board[4] == board[5] == board[6] == letter) or
(board[7] == board[8] == board[9] == letter) or
(board[1] == board[4] == board[7] == letter) or
(board[2] == board[5] == board[8] == letter) or
(board[3] == board[6] == board[9] == letter) or
(board[1] == board[5] == board[9] == letter) or
(board[7] == board[5] == board[3] == letter))
def get_board_copy(board):
dupe_board = []
for i in board:
dupe_board.append(i)
return dupe_board
def is_space_free(board, move):
return board[move] == ' '
def get_player_move(board):
move = ' '
while move not in '1 2 3 4 5 6 7 8 9'.split() or not is_space_free(board, int(move)):
print('Move?')
move = input()
return int(move)
def choose_random_move_from_list(board, moves_list):
possible_moves = []
for i in moves_list:
if is_space_free(board, i):
possible_moves.append(i)
if len(possible_moves) > 0:
return random.choice(possible_moves)
else:
return None
def get_computer_move(board, computer_letter):
if computer_letter == 'X':
player_letter = 'O'
else:
player_letter = 'X'
# if this move wins the game for the computer
for i in range(1, 10):
copy = get_board_copy(board)
if is_space_free(copy, i):
make_move(copy, computer_letter, i)
if is_winner(copy, computer_letter):
return i
# if this move wins the game for the player
for i in range(1, 10):
copy = get_board_copy(board)
if is_space_free(copy, i):
make_move(copy, player_letter, i)
if is_winner(copy, player_letter):
return i
# random corner
move = choose_random_move_from_list(board, [1, 3, 7, 9])
if move is not None:
return move
# center
if is_space_free(board, 5):
return 5
# random side
move = choose_random_move_from_list(board, [2, 4, 6, 8])
if move is not None:
return move
def is_board_full(board):
for i in range(1, 10):
if is_space_free(board, i):
return False
return True
print('Welcome!')
while True:
the_board = [' '] * 10
player_letter, computer_letter = input_player_letter()
turn = who_goes_first()
print('The', turn, 'will go first!')
game_is_playing = True
while game_is_playing:
if turn == 'player':
draw_board(the_board)
move = get_player_move(the_board)
make_move(the_board, player_letter, move)
if is_winner(the_board, player_letter):
draw_board(the_board)
print('YOU WIN!')
game_is_playing = False
elif is_board_full(the_board):
draw_board(the_board)
print('YOU TIE!')
break
else:
turn = 'computer'
else:
move = get_computer_move(the_board, computer_letter)
make_move(the_board, computer_letter, move)
if is_winner(the_board, computer_letter):
draw_board(the_board)
print('YOU LOSE!')
game_is_playing = False
elif is_board_full(the_board):
draw_board(the_board)
print('YOU TIE!')
break
else:
turn = 'player'
if not play_again():
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment