#Tic-Tac-Toe #Plays the game of Tic-Tac-Toe against a human player #Global constants X = 'X' O = 'O' EMPTY = ' ' TIE = 'TIE' NUM_SQUARES = 9 def display_instruction(): '''Display Game instructions''' print (''' Welcome to the greatest intellectual challenge of all time: Tic-Tac-Toe. This will be a showdown between your human brain and my silicon processor. You will make your move known by entering a number, 0 - 8. The number will correspond to the board position as illustrated: 0 | 1 | 2 - - - - - - - 3 | 4 | 5 - - - - - - - 6 | 7 | 8 Prepare yourself, human. The ultimate battle is about to begin. \n ''' ) def ask_yes_no(question): '''ask a yes or no question.''' response = None while response not in ('y','n'): response = input(question).lower() return response def ask_number(question,low,high): '''Ask for a number within a range.''' response = None while response not in range (low,high): response = int(input(question)) return response def pieces(): '''Determines if a player or computer goes first''' go_first = ask_yes_no('Do you require the first move? (y,n): ') if go_first == 'y': print('\nThen take the first move. You will need it.') human = X computer = O else: print ('\nYour bravery will be your undoing. I will go first') human = O computer = X return computer,human def new_board(): '''Create new game board''' board = [] for square in range(NUM_SQUARES): board.append(EMPTY) return board def display_board(board): '''display game board on screen''' print ('\n\t', board[0],'|', board[1], '|', board[2]) print ('\t', '--------') print ('\n\t', board[3],'|', board[4], '|', board[5]) print ('\t', '--------') print ('\n\t', board[6],'|', board[7], '|', board[8],'\n') def legal_moves(board): '''Creates a legal list of moves''' moves = [] for square in range(NUM_SQUARES): if board[square] == EMPTY: moves.append(square) def winner(board): '''determines the game winner''' WAYS_TO_WIN = ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6)) for row in WAYS_TO_WIN: if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY: winner = board[row[0]] return winner if EMPTY not in board: return TIE return None def human_move(board,human): '''Get human move''' legal = legal_moves(board) move = None while move not in legal: move = ask_number('Where will you move? (0-8): ',0, NUM_SQUARES) if move not in legal: print ('\nThat square is already occupied, foolish human. Choose another.\n') print('Fine...') return move def computer_move(board,computer,human): '''Make computer move''' # Make a copy to work with since function will be changing list board = board [:] #The best positions to have in order BEST_MOVES = (4,0,2,6,8,1,3,5,7) print ('I shall take square number', end = ' ') #If computer can win, take that move for move in legal_moves(board): board[move] = computer if winner(board) == computer: print (move) return move #Done checking this move, return it board[move] = EMPTY #if human can win, block that move for move in legal_moves(board): board[move] = human if winner(board) == human: print (move) return move #Done checking this move, return it board[move] = EMPTY #Since no square is open, take next best move for move in BEST_MOVES: if move in legal_moves(board): print(move) return move def next_turn(turn): '''switch turns''' if turn == X: return O else: return X def congrats_winner(the_winner, computer, human): '''Congratulate the winner''' if the_winner != TIE: print (the_winner, 'Won!\n') else: print ('It\'s a tie!\n') if the_winner == computer: print('As I predicted, human, I am triumphant once more. \n' \ 'Proof that computers are superior to humans in all regards.') elif the_winner == human: print ('No, no! It cannot be! somehow you tricked me, human. \n'\ 'But never again! I, the computer, so swear it!') elif the_winner == TIE: print ('You were most lucky, human, and somehow managed to tie me. \n'\ 'Celebrate today... for this is the best you will ever achieve.') def main(): display_instruction() computer,human = pieces() turn = X board = new_board() display_board(board) while not winner(board): if turn == human: move = human_move(board, human) board[move] == human else: move = computer_move(board,computer,human) board[move] == computer display_board(board) congrats_winner(the_winner,computer, human) #Start the program main() input('\nPress enter to exit')
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question