Hey I am obviously new here, but would love to get better at programming. I currently am using Michael Dawson's "Python Programming, Second Edition (for the absolute beginner)" to try and learn it. Anyway he gives code on how to make a very basic tic-tac-toe game inside the cmd prompt window. As a challenge at the end of the chapter he says try to make an unbeatable computer, the one given just goes with what the typically best move would be, starting with middle then going to corners etc. I have spent 3+ hours trying to figure out how to make the computer do something specific based on a human move and cant figure it out. Now I realize this is kinda useless, but I do want to learn programming and don't want to move on in the book if I can't do something I should be able to. Please help me out, here is my current code for computer 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) # [COLOR="Red"]Only part determining computer moves[/COLOR]
print "I shall take square number"
# 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 checkin this move, undo 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, undo it
board[move] = EMPTY
# since no one can win on next move, pick best open square
for move in BEST_MOVES:
if move in legal_moves(board):
print move
return move
Kk now here is entire code for program
# Tic-Tac-Toe
# Play the game of ttt against a computer opponent
# global constants
X = "X"
O = "O"
EMPTY = " "
TIE = "TIE"
NUM_SQUARES = 9
def display_instructions():
"""Display Game Instructions."""
print \
"""
Welcome to Tic-Tac-Toe.
You will make a move by entering a number 0-8.
The number will correspond to the one on this board.
0 | 1 | 2
-----------
3 | 4 | 5
-----------
6 | 7 | 8
"""
def ask_yes_no(question):
"""Ask a yes or no question."""
response = None
while response not in ("y", "n"):
response = raw_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(raw_input(question))
return response
def pieces():
"""Determine if player or computer goes first."""
go_first = ask_yes_no("Would you like to go first? (y/n): ")
if go_first == "y":
print "\nAlright human goes first."
human = X
computer = O
else:
print "Computer will go first then."
computer = X
human = O
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 "\t", board[3], "|", board[4], "|", board[5]
print "\t", "---------"
print "\t", board[6], "|", board[7], "|", board[8], "\n"
def legal_moves(board):
"""Create list of legal moves."""
moves = []
for square in range(NUM_SQUARES):
if board[square] == EMPTY:
moves.append(square)
return moves
def winner(board):
"""Determine 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."""
humanmoves = []
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 "\nInvalid Move, That square is already occupied, Choose another. \n"
humanmoves.append(move)
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"
# 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 checkin this move, undo 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, undo it
board[move] = EMPTY
# since no one can win on next move, pick best open square
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 congrat_winner(the_winner, computer, human):
"""Congratulate the winner."""
if the_winner != TIE:
print the_winner, "won!\n"
else:
print "It's a tie!"
if the_winner == computer:
print "Ha you really think you could beat a computer?"
elif the_winner == human:
print "Bet you couldn't do it again!"
elif the_winner == TIE:
print "You were lucky, somehow you managed to not lose..."
def main():
display_instructions()
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)
turn = next_turn(turn)
the_winner = winner(board)
congrat_winner(the_winner, computer, human)
# start the program
main()
raw_input("Press the Enter Key to Exit.")
Thanks in advance for any help