That looks interesting! Would you mind posting your entire tic-tac-toe program?
This was my home version; the one at school is a bit different and profited more directly from theelse at the end of the loop; I just threw it in here for illustration.
The functions isint() and get_valid_int() were also intended for my students, who haven't learned 'try' yet.
[php]
# tictactoe
# 2006.11.03
# imports
import random
# Functions
def print_board(board):
"""
print_board(board) --> None
prints board.
"""
print ' | '.join(board[:3])
print '-'*9
print ' | '.join(board[3:6])
print '-'*9
print ' | '.join(board[6:])
print
def isint(s):
"""
isint(s) --> Bool
Returns True if s can be converted into an integer.
"""
if s.startswith('-'):
return isint(s[1:])
else:
return s.isdigit()
def get_valid_int(prompt, Min = None, Max = None):
"""
get_valid_int(prompt, Min, Max) --> int
Prints prompt and returns an integer in [Min,Max].
"""
if Min > Max:
Min, Max = Max, Min
while True:
s = raw_input(prompt)
if isint(s):
s = int(s)
else:
print "Enter an integer, please"
continue
if Min and s < Min:
print "Must be at least %d" % (Min)
continue
if Max and s > Max:
print "Must be at most %d" % (Max)
continue
return s
def get_valid_moves(board):
"""
get_valid_moves(board) --> list
Returns list of empty squares on board.
"""
return [x for x in range(len(board)) if board[x] == ' ']
def player_turn(board):
"""
player_turn(board) --> board
Gets players (valid) move and returns new board with move taken.
"""
valid_moves = get_valid_moves(board)
new_board = board[:]
print valid_moves
while True:
move = get_valid_int("Enter a square number to play in: ",0,8)
if move in valid_moves:
new_board[move] = 'X'
return new_board
else:
print "That square is filled!"
def computer_turn(board):
"""
computer_turn(board) --> board
Gets computer's move and returns new board with move taken.
"""
valid_moves = get_valid_moves(board)
new_board = board[:]
if not valid_moves:
return board
move = random.choice(valid_moves)
new_board[move] = 'O'
print "The computer chooses square %d" % (move)
return new_board
def is_winner(board, player, combos):
"""
is_winner(board,player,combos) --> winner
Returns player token if player is a winner; else returns ""
"""
for i in combos:
l = [board[j] for j in i]
if l == [player,player,player]:
return player
return ""
# Main
board = [' ']*9
winner = ''
winning_combos = [[0,1,2],[3,4,5],[6,7,8], \
[0,3,6],[1,4,7],[2,5,8], \
[0,4,8],[2,4,6]]
while ' ' in board:
print_board(board)
board = player_turn(board)
winner = is_winner(board, 'X', winning_combos)
if winner:
break
print_board(board)
board = computer_turn(board)
winner = is_winner(board, 'O', winning_combos)
if winner:
break
else:
winner = None
print "\n\nThe Decision\n"
print_board(board)
if winner:
print "%s Wins!" % winner
else:
print "A Tie!"
[/php]