Skip to content

Instantly share code, notes, and snippets.

@sgtsquiggs
Created February 1, 2016 22:20
Show Gist options
  • Save sgtsquiggs/e1ae673d5ace283d2568 to your computer and use it in GitHub Desktop.
Save sgtsquiggs/e1ae673d5ace283d2568 to your computer and use it in GitHub Desktop.

Revisions

  1. sgtsquiggs created this gist Feb 1, 2016.
    176 changes: 176 additions & 0 deletions game.py
    Original 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