HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythonMinor

Tic Tac Toe in Python

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
tacticpythontoe

Problem

I wrote a mediocre Tic Tac Toe game. Take a look.

```
# Tic-Tac-Toe

# Plays the game of tic-tac-toe against a human opponent

# global constants

X = "X"

O = "O"

EMPTY = " "

TIE = "TIE"

NUM_SQUARES = 9

def display_instruct():
"""Display game instructions."""

print(

"""
Welcome to the greatest intellectual challenge of all time: Tic-Tac-Toe.
This will be a showdown between your human brain and my silicon processor.
You will make your move known 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, human. 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 = 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(input(question))
return response

def pieces():

"""Determine if player 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. You will need it.")
human = X
computer = O
else:
print("\nYour bravery will be your undoing... I will go first.")
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 leg

Solution

WAYS_TO_WIN could be a global constant too, like the other variables you named with all caps.

X and O are not great names. Single-letter variable names are usually not great, and O is easy to mistake for 0 (zero). I'd recommend something like this instead:

MOVE_X = "X"
MOVE_O = "O"


Or, considering that EMPTY doesn't explain itself very much either, and all these represent possible tile values in the game:

TILE_X = "X"
TILE_O = "O"
TILE_EMPTY = " "


This is not very efficient:

while response not in range(low, high):
    response = int(input(question))


It generates a range every time, and if the value is not in the range, it iterates over all items every time. It would be better to check using comparisons with low and high:

while not low <= response < high:
    response = int(input(question))


legal_moves could be written much simpler using a list comprehension:

def legal_moves(board):    
    """Create list of legal moves."""
    return [x for x in range(NUM_SQUARES) if board[x] == EMPTY]


This code checks not in legal unnecessarily many times:

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, foolish human. Choose another.\n")
        print("Fine...")


It could be refactored to avoid wasted operations:

while True:
    move = ask_number("Where will you move? (0 - 8):", 0, NUM_SQUARES)
    if move not in legal:
        print("\nThat square is already occupied, foolish human. Choose another.\n")
        print("Fine...")
    else:
        break


You have several other similar loops with wasted operations that could be refactored similarly.

Code Snippets

MOVE_X = "X"
MOVE_O = "O"
TILE_X = "X"
TILE_O = "O"
TILE_EMPTY = " "
while response not in range(low, high):
    response = int(input(question))
while not low <= response < high:
    response = int(input(question))
def legal_moves(board):    
    """Create list of legal moves."""
    return [x for x in range(NUM_SQUARES) if board[x] == EMPTY]

Context

StackExchange Code Review Q#71521, answer score: 4

Revisions (0)

No revisions yet.