{
 "metadata": {
  "name": ""
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 6.1 page no : 188"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "\n",
      "#Note : python does not have reference variable.\n",
      "\n",
      "myScore = 1000;\n",
      "mikesScore = myScore; #create a reference\n",
      "print \"myScore is: \" , myScore\n",
      "print \"mikesScore is: \" , mikesScore \n",
      "print \"Adding 500 to myScore\\n\";\n",
      "myScore += 500;\n",
      "print \"myScore is: \" , myScore\n",
      "print \"mikesScore is: \" , mikesScore\n",
      "print \"Adding 500 to mikesScore\";\n",
      "mikesScore += 500;\n",
      "print \"myScore is: \" , myScore \n",
      "print \"mikesScore is: \" , mikesScore"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "myScore is:  1000\n",
        "mikesScore is:  1000\n",
        "Adding 500 to myScore\n",
        "\n",
        "myScore is:  1500\n",
        "mikesScore is:  1000\n",
        "Adding 500 to mikesScore\n",
        "myScore is:  1500\n",
        "mikesScore is:  1500\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 6.2 page no : 192"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "\n",
      "def badSwap(x,y):\n",
      "    x,y = y,x\n",
      "\n",
      "def goodSwap(x, y):\n",
      "    x[0],y[0] = y[0],x[0]\n",
      "\n",
      "myScore = [1500];\n",
      "yourScore = [1000];\n",
      "print \"Original values\";\n",
      "print \"myScore: \" , myScore[0] \n",
      "print \"yourScore: \" , yourScore[0]\n",
      "print \"Calling badSwap()\\n\";\n",
      "badSwap(myScore[0], yourScore[0]);\n",
      "print \"myScore: \" , myScore[0] \n",
      "print \"yourScore: \" , yourScore[0]\n",
      "print \"Calling goodSwap()\\n\";\n",
      "goodSwap(myScore, yourScore);\n",
      "print \"myScore: \" , myScore[0] \n",
      "print \"yourScore: \" , yourScore[0] ,"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Original values\n",
        "myScore:  1500\n",
        "yourScore:  1000\n",
        "Calling badSwap()\n",
        "\n",
        "myScore:  1500\n",
        "yourScore:  1000\n",
        "Calling goodSwap()\n",
        "\n",
        "myScore:  1000\n",
        "yourScore:  1500\n"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 6.3 page no : 196"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "\n",
      "\n",
      "def display(vec):\n",
      "    print \"Your items:\";\n",
      "    for i in vec:\n",
      "        print i\n",
      "\n",
      "inventory = []\n",
      "inventory.append(\"sword\");\n",
      "inventory.append(\"armor\");\n",
      "inventory.append(\"shield\");\n",
      "display(inventory);"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Your items:\n",
        "sword\n",
        "armor\n",
        "shield\n"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example : 6.4 page no : 199"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "\n",
      "#returns a reference to a string\n",
      "\n",
      "def refToElement(vec,i):\n",
      "    return vec[i]\n",
      "\n",
      "inventory = []\n",
      "inventory.append(\"sword\");\n",
      "inventory.append(\"armor\");\n",
      "inventory.append(\"shield\");\n",
      "\n",
      "#displays string that the returned reference refers to\n",
      "print \"Sending the returned reference to cout:\"\n",
      "print refToElement(inventory, 0) \n",
      "#assigns one reference to another -- inexpensive assignment\n",
      "print \"Assigning the returned reference to another reference.\";\n",
      "rStr = refToElement(inventory, 1);\n",
      "print \"Sending the new reference to cout:\";\n",
      "print rStr\n",
      "#copies a string object -- expensive assignment\n",
      "print \"Assigning the returned reference to a string object.\";\n",
      "s = refToElement(inventory, 2);\n",
      "print \"Sending the new string object to cout:\";\n",
      "print s\n",
      "#altering the string object through a returned reference\n",
      "print \"Altering an object through a returned reference.\";\n",
      "rStr = \"Healing Potion\";\n",
      "print \"Sending the altered object to cout:\";\n",
      "print inventory[1] "
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Sending the returned reference to cout:\n",
        "sword\n",
        "Assigning the returned reference to another reference.\n",
        "Sending the new reference to cout:\n",
        "armor\n",
        "Assigning the returned reference to a string object.\n",
        "Sending the new string object to cout:\n",
        "shield\n",
        "Altering an object through a returned reference.\n",
        "Sending the altered object to cout:\n",
        "armor\n"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 6.5 page no : 205"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# global constants\n",
      "X = 'X'\n",
      "O = 'O'\n",
      "EMPTY = ' ';\n",
      "TIE = 'T';\n",
      "NO_ONE = 'N';\n",
      "\n",
      "def instructions():\n",
      "    print \"Welcome to the ultimate man-machine showdown: Tic-Tac-Toe.\";\n",
      "    print \"--where human brain is pit against silicon processor\";\n",
      "    print \"Make your move known by entering a number, 0 - 8. The number\";\n",
      "    print \"corresponds to the desired board position, as illustrated:\";\n",
      "    print \"0 | 1 | 2\";\n",
      "    print \"---------\";\n",
      "    print \"3 | 4 | 5\\n\";   \n",
      "    print \"---------\";\n",
      "    print \"6 | 7 | 8\\n\\n\";\n",
      "    print \"Prepare yourself, human. The battle is about to begin.\";\n",
      "\n",
      "def askYesNo(question):\n",
      "    response =''\n",
      "    while (response != 'y' and response != 'n'):\n",
      "        print question , \" (y/n): \",\n",
      "        response = raw_input()\n",
      "    return response;\n",
      "\n",
      "def askNumber( question, high, low):\n",
      "    while True:\n",
      "        print question , \" (\" , low , \" - \" , high , \"): \",\n",
      "        number = int(raw_input())\n",
      "        if (number > high or number < low):\n",
      "            pass\n",
      "        else:\n",
      "            break\n",
      "    return number;\n",
      "\n",
      "def humanPiece():\n",
      "    global X,O,EMPTY,TIE,NO_ONE\n",
      "    go_first = askYesNo(\"Do you require the first move?\");\n",
      "    if (go_first == 'y'):\n",
      "        print \"Then take the first move. You will need it.\"\n",
      "        return X;\n",
      "    else:\n",
      "        print \"Your bravery will be your undoing. . . I will go first.\";\n",
      "        return O;\n",
      "\n",
      "def opponent( piece):\n",
      "    global X,O,EMPTY,TIE,NO_ONE\n",
      "    if (piece == X):\n",
      "        return O;\n",
      "    else:\n",
      "        return X;\n",
      "\n",
      "def displayBoard( board):\n",
      "    print \"\\n\\t\" , board[0] , \" | \" , board[1] , \" | \" , board[2];\n",
      "    print \"\\t\" , \"---------\";\n",
      "    print \"\\t\" , board[3] , \" | \" , board[4] , \" | \" , board[5];\n",
      "    print \"\\t\" , \"---------\";\n",
      "    print \"\\t\" , board[6] , \" | \" , board[7] , \" | \" , board[8];\n",
      "    print \"\\n\";\n",
      "\n",
      "def winner(board):\n",
      "    global X,O,EMPTY,TIE,NO_ONE\n",
      "    # all possible winning rows\n",
      "    WINNING_ROWS = [ [0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]\n",
      "    TOTAL_ROWS = 8;\n",
      "    # if any winning row has three values that are the same (and not EMPTY),\n",
      "    # then we have a winner\n",
      "    for row in range (TOTAL_ROWS):\n",
      "        if ( (board[WINNING_ROWS[row][0]] != EMPTY) and\n",
      "            (board[WINNING_ROWS[row][0]] == board[WINNING_ROWS[row][1]]) and\n",
      "            (board[WINNING_ROWS[row][1]] == board[WINNING_ROWS[row][2]]) ):\n",
      "            return board[WINNING_ROWS[row][0]];\n",
      "    # since nobody has won, check for a tie (no empty squares left)\n",
      "    if EMPTY not in board:\n",
      "        return TIE;\n",
      "    return NO_ONE;\n",
      "\n",
      "def isLegal(move,board):\n",
      "    global X,O,EMPTY,TIE,NO_ONE\n",
      "    return (board[move] == EMPTY);\n",
      "\n",
      "def humanMove(board,human):\n",
      "    global X,O,EMPTY,TIE,NO_ONE\n",
      "    move = askNumber(\"Where will you move?\", len(board),0);\n",
      "    \n",
      "    while (not isLegal(move, board)):\n",
      "        print \"\\nThat square is already occupied, foolish human.\\n\";\n",
      "        move = askNumber(\"Where will you move?\", len(board),0);\n",
      "            \n",
      "    print \"Fine. . .\\n\";\n",
      "    return move;\n",
      "\n",
      "def computerMove(board, computer):\n",
      "    global X,O,EMPTY,TIE,NO_ONE\n",
      "    move = 0;\n",
      "    found = False;\n",
      "    #if computer can win on next move, that's the move to make\n",
      "    while (not found and move < len(board)):\n",
      "        if (isLegal(move, board)):\n",
      "            board[move] = computer;\n",
      "            found = winner(board) == computer;\n",
      "            board[move] = EMPTY;\n",
      "        if (not found):\n",
      "            move += 1\n",
      "    #otherwise, if human can win on next move, that's the move to make\n",
      "    if (not found):\n",
      "        move = 0;\n",
      "        human = opponent(computer);\n",
      "        while (not found and move < len(board)):\n",
      "            if (isLegal(move, board)):\n",
      "                board[move] = human;\n",
      "                found = winner(board) == human;\n",
      "                board[move] = EMPTY;\n",
      "            if (not found):\n",
      "                move += 1\n",
      "    #otherwise, moving to the best open square is the move to make\n",
      "    if (not found):\n",
      "        move = 0;\n",
      "        i = 0;\n",
      "        BEST_MOVES = [4, 0, 2, 6, 8, 1, 3, 5, 7] #pick best open square\n",
      "        while (not found and i < len(board)):\n",
      "            move = BEST_MOVES[i];\n",
      "            if (isLegal(move, board)):\n",
      "                found = True;\n",
      "            i += 1\n",
      "    print \"I shall take square number \" , move \n",
      "    return move;\n",
      "\n",
      "def announceWinner( winner, computer, human):\n",
      "    if (winner == computer):\n",
      "        print winner , \"'s won!\";\n",
      "        print \"As I predicted, human, I am triumphant once more -- proof\";\n",
      "        print \"that computers are superior to humans in all regards.\";\n",
      "    elif (winner == human):\n",
      "        print winner , \"'s won!\";\n",
      "        print \"No, no! It cannot be! Somehow you tricked me, human.\";\n",
      "        print \"But never again! I, the computer, so swear it!\";\n",
      "    else:\n",
      "        print \"It's a tie.\\n\";\n",
      "        print \"You were most lucky, human, and somehow managed to tie me.\\n\";\n",
      "        print \"Celebrate. . . for this is the best you will ever achieve.\\n\";\n",
      "\n",
      "\n",
      "NUM_SQUARES = 9;\n",
      "board = [EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY]\n",
      "instructions();\n",
      "human = humanPiece();\n",
      "computer = opponent(human);\n",
      "turn = X;\n",
      "displayBoard(board);\n",
      "while (winner(board) == NO_ONE):\n",
      "    if (turn == human):\n",
      "        move = humanMove(board, human);\n",
      "        board[move] = human;\n",
      "    else:\n",
      "        move = computerMove(board, computer);\n",
      "        board[move] = computer;\n",
      "    displayBoard(board);\n",
      "    turn = opponent(turn);\n",
      "\n",
      "announceWinner(winner(board), computer, human);\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Welcome to the ultimate man-machine showdown: Tic-Tac-Toe.\n",
        "--where human brain is pit against silicon processor\n",
        "Make your move known by entering a number, 0 - 8. The number\n",
        "corresponds to the desired board position, as illustrated:\n",
        "0 | 1 | 2\n",
        "---------\n",
        "3 | 4 | 5\n",
        "\n",
        "---------\n",
        "6 | 7 | 8\n",
        "\n",
        "\n",
        "Prepare yourself, human. The battle is about to begin.\n",
        "Do you require the first move?  (y/n): "
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "y\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Then take the first move. You will need it.\n",
        "\n",
        "\t   |     |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\n",
        "\n",
        "Where will you move?  ( 0  -  9 ): "
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "0\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Fine. . .\n",
        "\n",
        "\n",
        "\tX  |     |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\n",
        "\n",
        "I shall take square number  4\n",
        "\n",
        "\tX  |     |   \n",
        "\t---------\n",
        "\t   |  O  |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\n",
        "\n",
        "Where will you move?  ( 0  -  9 ): "
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Fine. . .\n",
        "\n",
        "\n",
        "\tX  |     |  X\n",
        "\t---------\n",
        "\t   |  O  |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\n",
        "\n",
        "I shall take square number  1\n",
        "\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\t   |  O  |   \n",
        "\t---------\n",
        "\t   |     |   \n",
        "\n",
        "\n",
        "Where will you move?  ( 0  -  9 ): "
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "7\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Fine. . .\n",
        "\n",
        "\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\t   |  O  |   \n",
        "\t---------\n",
        "\t   |  X  |   \n",
        "\n",
        "\n",
        "I shall take square number  6\n",
        "\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\t   |  O  |   \n",
        "\t---------\n",
        "\tO  |  X  |   \n",
        "\n",
        "\n",
        "Where will you move?  ( 0  -  9 ): "
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "5\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Fine. . .\n",
        "\n",
        "\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\t   |  O  |  X\n",
        "\t---------\n",
        "\tO  |  X  |   \n",
        "\n",
        "\n",
        "I shall take square number  8\n",
        "\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\t   |  O  |  X\n",
        "\t---------\n",
        "\tO  |  X  |  O\n",
        "\n",
        "\n",
        "Where will you move?  ( 0  -  9 ): "
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "3\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " Fine. . .\n",
        "\n",
        "\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\tX  |  O  |  X\n",
        "\t---------\n",
        "\tO  |  X  |  O\n",
        "\n",
        "\n",
        "It's a tie.\n",
        "\n",
        "You were most lucky, human, and somehow managed to tie me.\n",
        "\n",
        "Celebrate. . . for this is the best you will ever achieve.\n",
        "\n"
       ]
      }
     ],
     "prompt_number": 2
    }
   ],
   "metadata": {}
  }
 ]
}