In [86]:
# For using the same code in either Python 2 or 3
from __future__ import print_function
## Note: Python 2 users, use raw_input() to get player input. Python 3 users, use input()
Step 1: Write a function that can print out a board. Set up your board as a list, where each index 1-9 corresponds with a number on a number pad, so you get a 3 by 3 board representation.
In [87]:
from IPython.display import clear_output
def display_board(board):
clear_output()
# implementation is really janky in tut
Step 2: Write a function that can take in a player input and assign their marker as 'X' or 'O'. Think about using while loops to continually ask until you get a correct answer.
In [3]:
def player_input():
marker = ''
while not (marker == 'O' or marker == 'X'):
marker = raw_input('Player 1: Do you want to be O or X? ').upper()
if marker == 'X':
return ('X', 'O')
else:
return ('O','X')
In [4]:
player_input()
Out[4]:
Step 3: Write a function that takes, in the board list object, a marker ('X' or 'O'), and a desired position (number 1-9) and assigns it to the board.
In [89]:
def place_marker(board, marker, position):
board[position] = marker
Step 4: Write a function that takes in a board and a mark (X or O) and then checks to see if that mark has won.
In [90]:
def win_check(board,mark):
# lots of manual checks in tut
pass
Step 5: Write a function that uses the random module to randomly decide which player goes first. You may want to lookup random.randint() Return a string of which player went first.
In [8]:
import random
def choose_first(): # janky
if random.randint(0, 1) == 0:
return 'Player 1'
else:
return 'Player 2'
Step 6: Write a function that returns a boolean indicating whether a space on the board is freely available.
In [7]:
def space_check(board, position):
return board[position] == ' ' # janky
Step 7: Write a function that checks if the board is full and returns a boolean value. True if full, False otherwise.
In [5]:
def full_board_check(board):
# janky implement using a 1D array
for i in range(1, 10):
if space_check(board, i):
return False
return True
Step 8: Write a function that asks for a player's next position (as a number 1-9) and then uses the function from step 6 to check if its a free position. If it is, then return the position for later use.
In [9]:
def player_choice(board):
position = ''
while position not in '1 2 3 4 5 6 7 8 9'.split() or not space_check(board[int(position)]):
position = raw_input('Choose your next position: (1-9)')
return position
Step 9: Write a function that asks the player if they want to play again and returns a boolean True if they do want to play again.
In [10]:
def replay():
# what's interesting is the str func chaining
return raw_input('Do you want to play again? Enter Yes or No').lower().startswith('y')
Step 10: Here comes the hard part! Use while loops and the functions you've made to run the game!
In [7]:
print('Welcome to Tic Tac Toe!')
while True:
# Set the game up here
theBoard = [' '] * 10
player1_marker, player2_marker = player_input() #tuple unpacking
turn = choose_first()
print(turn + 'will go first!')
game_on = True
while game_on:
#Player 1 Turn
if turn == 'Player 1': # janky
display_board(theBoard)
position = player_choice(theBoard)
place_marker(theBoard, player1_marker, position)
if win_check(theBoard, player1_marker):
display_board(theBoard)
print('Congrats, {pl}, has won the game!'.format(pl=turn))
game_on = False
else:
turn = 'Player 2' # janky
# Player2's turn.
if turn == 'Player 2':
display_board(theBoard)
position = player_choice(theBoard)
place_marker(theBoard, player2_marker, position)
if win_check(theBoard, player2_marker):
display_board(theBoard)
print('Congrats, {pl}, has won the game!'.format(pl=turn))
game_on = False
else:
turn = 'Player 1' # janky
if not replay():
break