board = [' ',' ',' ',' ',' ',' ',' ',' ',' '] board def makeBoard(): # A 3x3 board is represented as a list of 9 elements. # We will use the following numbering to locate a square # 0 | 1 | 2 # ---|---|--- # 3 | 4 | 5 # ---|---|--- # 6 | 7 | 8 return [' ',' ',' ',' ',' ',' ',' ',' ',' '] def display(board): for i in range(0, 9, 3): if i > 0: print ('---|---|---') print (" %c | %c | %c "%(board[i],board[i+1],board[i+2])) print() board = makeBoard() display(board) def opponent(player): if player == "X": return "O" else: return "X" from random import choice You = 'X' Me = 'O' def move(board, player): if player == You: # user's move? square = ask("Enter your move: ") - 1 else: # my turn # player is the computer, make a random choice square = choice(possibleMoves(board, player)) # place player's piece on the chosen square applyMove(board, player, square) def possibleMoves(board): return [i for i in range(9) if board[i] == ' '] def possibleMoves(board): moves = [] for i in range(9): if board[i] == ' ': moves.append(i) return moves # These square triples represent wins (three in a row). WINS = [[0, 1, 2],[3, 4, 5],[6, 7, 8], # the rows [0, 3, 6],[1, 4, 7],[2, 5, 8], # the columns [0, 4, 8],[2, 4, 6]] # diagonals def winner(board): for win in WINS: posWinner = board[win[0]] if (posWinner != ' ' and posWinner == board[win[1]] and posWinner == board[win[2]]): return posWinner # No winner yet, are there empty squares left? for i in range(9): if board[i] == ' ': return ' ' # The board is full and no one has three in a row return 'Tie' def gameOver(board): return len(possibleMoves(board)) == 0 INFINITY = 10 def evaluate(board): # if board is a win for player, return INFINITY piece = winner(board) if piece == Me: return INFINITY elif piece == You: return -INFINITY else: return openWins(board,Me) - openWins(board,You) def openWins(board, player): possWins = 0 for position in WINS: n = 0 for i in range(3): if (board[position[i]] == player) or (board[position[i]] == ' '): n += 1 if n == 3: possWins += 1 return possWins def bestMove(board, player, moves): scores = [] for move in moves: b = copy(board) applyMove(b, player, move) scores.append(evaluate(b)) return moves[scores.index(max(scores))] def lookahead(board, player, MAX, level): moves = possibleMoves(board) if level <= 0 or len(moves)==0: # limit of look ahead return evaluate(board) if MAX: # computer’s move V = -INFINITY for m in moves: b = copy(board) b[m] = player V =max(V,lookahead(b,opponent(player),1-MAX,level-1)) else: # opponent’s move V = INFINITY for m in moves: b = copy(board) b[m] = player V =min(V,lookahead(b,opponent(player),1-MAX,level-1)) return V LEVEL = 9 def bestMove(board, player, moves): scores = [] for m in moves: b = copy(board) b[m] = player scores.append(lookahead(b,opponent(player),0,LEVEL-1)) return moves[scores.index(max(scores))] from random import randrange def mySelection(): # First generate a random number in the range 0..99 n = randrange(0, 100) # If the n is in range 0..29, select Scissors if n <= 29: return "Scissors" elif n <= 63: # if n in range 30..63, select Rock return "Rock" else: return "Paper" mySelection()