I'm writing code in python for a tic tac toe game. I have ran into a problem. can any one help me out. thanks

# TIC TAC TOE
# Started: 10/19/09
# Ended: still in progress

#GLOBAL CONSTANTS
X = "X"
O = "O"
Empty = " "
TIE = "TIE"
NUM_SQUARES = 9

def display_instruct():
    """Display game instructions."""
    print \
    """
    Welcome to the intellectual challenge of all time: Tic-Tac-Toe.
    You will make your move know 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. 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 = 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 1 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."
        player1 = X
        computer = O
    else:
        print "\nComputer will go first."
        player2 = X
        computer = O
    return computer, player1

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 squares 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 player1_move(board, player1):
    """Get Player 1 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. Choose another.\n"
        print "Fine..."
        return move

def computer_move(board, computer, player1):
    """ 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, block that move
for move in legal_moves(board):
    board[move] = computer
    if winner(board) == computer:
        print move
        return move
    # done checking this move, undo it
    board[move] = EMPTY

# if player1 can win, block that move
for move in legal_moves(board):
    board[move] = player1
    if winner(board) == player1:
        print move
        return move
    # done checking this move, undo it
    board[move] = EMPTY

    # since no one can win on next move, pick open square
    for move in BEST_MOVES:
        if move in legal_moves(board):
            print move
            return move
        #done checking this move, undo it
        board[move] = EMPTY

def next_turn(turn):
    """Switch turns."""
    if turn == X:
        return O
    else:
        return X

def congrat_winner(The_winner, computer, player1):
    """Congratulate the winner."""
    if the_winner != TIE:
        print the_winner, "won\n"
    else:
        print "It's a tie!\n"
    if the_winner == computer:
        print " Computer is great.\n"
    elif the_winner == player1:
        print "Player 1 is great.\n"
    elif the_winner == TIE:
        print "You two try again.\n"

def main():
    display_instruct()
    computer, player1 = pieses()
    turn = X
    board = new_board()
    display_board(board)

    while not winner(board):
        if turn == player1:
            move = player1_move(board, player1)
            board[move] = player1

        else:
            turn == computer
            move = computer_move(board, player2)
            board[move] = computer

            display_board(board)
            turn = next_turn(turn)
            the_winner = winner(board)
            congrat_winner(the_winner , computer, player1)

# start the program
main()
raw_input("\n\nPress the enter key to quit.")

Editor's note:
If you have an error please state the error message.

Also, use code tags with your code to preserve the indentations. Otherwise the code is very difficult to read and not too many folks will help.

Recommended Answers

All 9 Replies

for move in legal_moves(board):
board[move] = computer
if winner(board) == computer:
print move
return move

# done checking this move, undo it
board[move] = EMPTY

Member Avatar for masterofpuppets

soooooo... what's your question :) ?
and Yes pls use code tags next time.... so much easier to read!

Just some obvious stuff:

Lines 124 to 140 have lost their indentations as a code block. They belong to function computer_move().

pieces is misspelled in line 172

You also need to do something about your globals (check case).

squares should be square in line 76

You will also discover some runtime problems.

Good luck with your project!

There's an error in your program:
***'return' outside function (line 129)

This code is straight out of the book. I was trying this before I changed it for a two player game. The book is "Python Programming, for the absolute beginner second edition"

There's an error in your program:
***'return' outside function (line 129)

You can not use return outside a function.

IDLE 2.6.2      
>>> def a(x, y):
	return x + y

>>> a(5, 8)
13
>>> x = 5
>>> y = 8
>>> return x + y #this you can not do because outside a function
SyntaxError: 'return' outside function
>>>

If you gone make change a code like this you have to understad the basic of python.
Make small changes and test it out.
Return outside a function will always give a error.

Did you download the code or retype it manually yourself?
There are some errors due to indentations and typos.

The return outside function error is really indentation error!

I retyped it out of the book. making sure that this one would work before I tried to make a two player game. I have already fixed my typos, but still get return outside function line 129

Read vegaseat's comment:

Lines 124 to 140 have lost their indentations as a code block. They belong to function computer_move().

You need to move all those lines to the right by 4 spaces.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.