Created
February 1, 2016 22:20
-
-
Save sgtsquiggs/e1ae673d5ace283d2568 to your computer and use it in GitHub Desktop.
TIC TAC TOE
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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