Tic Tac Toe
-
# Tic Tac Toe
-
import random
-
-
def drawBoard(board):
-
# This function prints out the board that is was passed.
-
# "board" is a list of 10 strings representing the board
-
print ' | |'
-
print ' ' + board[7] + ' | ' + board[8] + ' | ' + board[9]
-
print ' | |'
-
print '------------'
-
print ' | |'
-
print ' ' + board[4] + ' | ' + board[5] + ' | ' + board[6]
-
print ' | |'
-
print '------------'
-
print ' | |'
-
print ' ' + board[1] + ' | ' + board[2] + ' | ' + board[3]
-
print ' | |'
-
-
def inputPlayerLetter():
-
# Let's the player type which letter they want to be.
-
# Returns a list with the player's letter as the first
-
# item, and the computer's letter as the second.
-
letter = ''
-
while not (letter == 'X' or letter == 'O'):
-
print 'Do you want to be X or O?'
-
letter = raw_input().upper()
-
-
if letter == 'X':
-
return ['X', 'O']
-
else:
-
return ['O', 'X']
-
-
def whoGoesFirst():
-
# Randomly choose the player who goes first.
-
if random.randint(0, 1) == 0:
-
return 'computer'
-
else:
-
return 'player'
-
-
def playAgain():
-
print 'Do you want to play again?'
-
return raw_input().lower().startswith('y')
-
-
def makeMove(board, letter, move):
-
board[move] = letter
-
-
def isWinner(bo, le):
-
# Given a board and a player's letter, this function returns
-
# True if that player has won.
-
return ((bo[7] == le and bo[8] == le and bo[9] == le) or
-
(bo[4] == le and bo[5] == le and bo[6] == le) or
-
(bo[1] == le and bo[2] == le and bo[3] == le) or
-
(bo[7] == le and bo[5] == le and bo[3] == le) or
-
(bo[9] == le and bo[5] == le and bo[1] == le) or
-
(bo[7] == le and bo[4] == le and bo[1] == le) or
-
(bo[8] == le and bo[5] == le and bo[2] == le) or
-
(bo[9] == le and bo[6] == le and bo[3] == le))
-
-
def getBoardCopy(board):
-
# Make a duplicate of the board
-
dupBoard = []
-
-
for i in board:
-
dupBoard.append(i)
-
return dupBoard
-
-
def isSpaceFree(board, move):
-
return board[move] == ' '
-
-
def getPlayerMove(board):
-
move = ' '
-
while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board,
-
int(move)):
-
print 'What is your next move?(1-9)'
-
move = raw_input()
-
return int(move)
-
-
def chooseRandomMoveFromList(board, moveList):
-
# Returns a valid move from the passed list on the passed board
-
# return None if there is no valid move
-
possibleMoves = []
-
for i in moveList:
-
if isSpaceFree(board, i):
-
possibleMoves.append(i)
-
-
if len(possibleMoves) != 0:
-
return random.choice(possibleMoves)
-
else:
-
return None
-
-
def getComputerMove(board, computerLetter):
-
# Given a board and the computer's letter, determine
-
# where to move and return that move.
-
if computerLetter == 'X':
-
playerLetter = 'O'
-
else:
-
playerLetter = 'X'
-
-
-
# Here is our algorithm for our Tic Tac Toe AI:
-
# First, check if we can win in the next move.
-
for i in range(1, 9):
-
copy = getBoardCopy(board)
-
if isSpaceFree(copy, i):
-
makeMove(copy, computerLetter, i)
-
if isWinner(copy, computerLetter):
-
return i
-
# Check if the player could win on their next move, and block them.
-
for i in range(1, 9):
-
copy = getBoardCopy(board)
-
if isSpaceFree(copy, i):
-
makeMove(copy, playerLetter, i)
-
if isWinner(copy, playerLetter):
-
return i
-
-
# Try to take one of the corners, if they are free.
-
move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
-
if move != None:
-
return move
-
-
# Try to take the center, if it is free.
-
if isSpaceFree(board, 5):
-
return 5
-
# Move on one of the sides.
-
return chooseRandomMoveFromList(board, [2, 4, 6, 8])
-
-
def isBoardFull(board):
-
# Return True if every space on the board has been
-
# taken.Otherwise return False.
-
for i in range(1, 10):
-
if isSpaceFree(board, i):
-
return False
-
return True
-
-
print 'Welcome to the Hell of Tic Tac Toe!'
-
-
while True:
-
# Reset the board
-
theBoard = [' '] * 10
-
playerLetter, computerLetter = inputPlayerLetter()
-
turn = whoGoesFirst()
-
print 'The ' + turn + ' will go first.'
-
gameIsPlaying = True
-
-
while gameIsPlaying:
-
if turn == 'player':
-
# Player's turn.
-
drawBoard(theBoard)
-
move = getPlayerMove(theBoard)
-
makeMove(theBoard, playerLetter, move)
-
#drawBoard(theBoard)
-
-
if isWinner(theBoard, playerLetter):
-
drawBoard(theBoard)
-
print 'Hooray! you have won the game!'
-
gameIsPlaying = False
-
else:
-
if isBoardFull(theBoard):
-
drawBoard(theBoard)
-
print 'The game is a tie!'
-
break
-
else:
-
turn = 'computer'
-
#drawBoard(theBoard)
-
-
else:
-
# Computer's turn.
-
#drawBoard(theBoard)
-
move = getComputerMove(theBoard, computerLetter)
-
makeMove(theBoard, computerLetter, move)
-
print 'Computer is moving'
-
if isWinner(theBoard, computerLetter):
-
drawBoard(theBoard)
-
print 'The computer has beaten you!You lose.'
-
gameIsPlaying = False
-
else:
-
if isBoardFull(theBoard):
-
drawBoard(theBoard)
-
print 'The game is a tie!'
-
break
-
else:
-
turn = 'player'
-
#drawBoard(theBoard)
-
if not playAgain():
-
break
-
Algo -> Python so convenient !
Multiplication a la Francais. |
Python implementation |
|
function multiply(x; y)
Input: Two n-bit integers x and y, where y >= 0
Output: Their product
if y = 0: return 0
z = multiply(x; by=2c)
if y is even:
return 2z
else:
return x + 2z
|
|
Source: P24, Algorithms, Dasgupta, C. H. Papadimitriou, and U. V. Vazirani, 2006