{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Milestone Project 1: Full Walk-through Code Solution\n", "\n", "Below is the filled in code that goes along with the complete walk-through video. Check out the corresponding lecture videos for more information on this code!" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For using the same code in either Python 2 or 3\n", "from __future__ import print_function \n", "\n", "## Note: Python 2 users, use raw_input() to get player input. Python 3 users, use input()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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.**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from IPython.display import clear_output\n", "def display_board(board):\n", " \n", " clear_output()\n", " print(' | |')\n", " print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])\n", " print(' | |')\n", " print('-----------')\n", " print(' | |')\n", " print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])\n", " print(' | |')\n", " print('-----------')\n", " print(' | |')\n", " print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])\n", " print(' | |')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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.**" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def player_input():\n", " \n", " marker = ''\n", " while not (marker == 'X' or marker == 'O'):\n", " marker = raw_input('Player 1: Do you want to be X or O?').upper()\n", "\n", " if marker == 'X':\n", " return ('X', 'O')\n", " else:\n", " return ('O', 'X')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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.**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def place_marker(board, marker, position):\n", " board[position] = marker" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 4: Write a function that takes in a board and checks to see if someone has won. **" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def win_check(board,mark):\n", " \n", " return ((board[7] == mark and board[8] == mark and board[9] == mark) or # across the top\n", " (board[4] == mark and board[5] == mark and board[6] == mark) or # across the middle\n", " (board[1] == mark and board[2] == mark and board[3] == mark) or # across the bottom\n", " (board[7] == mark and board[4] == mark and board[1] == mark) or # down the middle\n", " (board[8] == mark and board[5] == mark and board[2] == mark) or # down the middle\n", " (board[9] == mark and board[6] == mark and board[3] == mark) or # down the right side\n", " (board[7] == mark and board[5] == mark and board[3] == mark) or # diagonal\n", " (board[9] == mark and board[5] == mark and board[1] == mark)) # diagonal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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.**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import random\n", "def choose_first():\n", " if random.randint(0, 1) == 0:\n", " return 'Player 2'\n", " else:\n", " return 'Player 1'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 6: Write a function that returns a boolean indicating whether a space on the board is freely available.**" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def space_check(board, position):\n", " \n", " return board[position] == ' '" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 7: Write a function that checks if the board is full and returns a boolean value. True if full, False otherwise.**" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def full_board_check(board):\n", " for i in range(1,10):\n", " if space_check(board, i):\n", " return False\n", " return True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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. **" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def player_choice(board):\n", " # Using strings because of raw_input\n", " position = ' '\n", " while position not in '1 2 3 4 5 6 7 8 9'.split() or not space_check(board, int(position)):\n", " \n", " position = raw_input('Choose your next position: (1-9) ')\n", " return int(position)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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.**" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def replay():\n", " \n", " return raw_input('Do you want to play again? Enter Yes or No: ').lower().startswith('y')" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "**Step 10: Here comes the hard part! Use while loops and the functions you've made to run the game!**" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " | |\n", " O | X | O\n", " | |\n", "-----------\n", " | |\n", " O | X | X\n", " | |\n", "-----------\n", " | |\n", " X | O | X\n", " | |\n", "The game is a draw!\n", "Do you want to play again? Enter Yes or No: n\n" ] } ], "source": [ "print('Welcome to Tic Tac Toe!')\n", "\n", "while True:\n", " # Reset the board\n", " theBoard = [' '] * 10\n", " player1_marker, player2_marker = player_input()\n", " turn = choose_first()\n", " print(turn + ' will go first.')\n", " game_on = True\n", "\n", " while game_on:\n", " if turn == 'Player 1':\n", " # Player1's turn.\n", " \n", " display_board(theBoard)\n", " position = player_choice(theBoard)\n", " place_marker(theBoard, player1_marker, position)\n", "\n", " if win_check(theBoard, player1_marker):\n", " display_board(theBoard)\n", " print('Congratulations! You have won the game!')\n", " game_on = False\n", " else:\n", " if full_board_check(theBoard):\n", " display_board(theBoard)\n", " print('The game is a draw!')\n", " break\n", " else:\n", " turn = 'Player 2'\n", "\n", " else:\n", " # Player2's turn.\n", " \n", " display_board(theBoard)\n", " position = player_choice(theBoard)\n", " place_marker(theBoard, player2_marker, position)\n", "\n", " if win_check(theBoard, player2_marker):\n", " display_board(theBoard)\n", " print('Player 2 has won!')\n", " game_on = False\n", " else:\n", " if full_board_check(theBoard):\n", " display_board(theBoard)\n", " print('The game is a tie!')\n", " break\n", " else:\n", " turn = 'Player 1'\n", "\n", " if not replay():\n", " break" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Good Job!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }