Created
February 1, 2016 22:20
-
-
Save sgtsquiggs/e1ae673d5ace283d2568 to your computer and use it in GitHub Desktop.
Revisions
-
sgtsquiggs created this gist
Feb 1, 2016 .There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,176 @@ 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