{
 "metadata": {
  "name": "ch10"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Chapter 10 : Inheritance and Polymorphism: Blackjack"
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 10.1 page no: 334"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "'''\n",
      "//Simple Boss\n",
      "//Demonstrates inheritance\n",
      "'''\n",
      "\n",
      "class Enemy:\n",
      "    def __init__(self):\n",
      "        self.m_Damage = 10\n",
      "\n",
      "    def Attack(self):\n",
      "        print \"An enemy attacks and inflicts \" , self.m_Damage , \" damage points!\";\n",
      "        \n",
      "    def __del__(self):\n",
      "        print  \"In Enemy destructor, deleting m_pDamage.\\n\";\n",
      "\n",
      "class Boss(Enemy):\n",
      "    def __init__(self):\n",
      "        Enemy.__init__(self)\n",
      "        self.m_DamageMultiplier = 3\n",
      "\n",
      "    def SpecialAttack(self):\n",
      "        print \"A boss attacks and inflicts \" , (self.m_DamageMultiplier * self.m_Damage),\n",
      "        print \" damage points!\";\n",
      "\n",
      "print \"Creating an enemy.\\n\";\n",
      "enemy1 = Enemy()\n",
      "enemy1.Attack();\n",
      "print \"\\nCreating a boss.\\n\";\n",
      "boss1 = Boss()\n",
      "boss1.Attack();\n",
      "boss1.SpecialAttack();"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Creating an enemy.\n",
        "\n",
        "An enemy attacks and inflicts  10  damage points!\n",
        "\n",
        "Creating a boss.\n",
        "\n",
        "An enemy attacks and inflicts  10  damage points!\n",
        "A boss attacks and inflicts  30  damage points!\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 10.2 page no : 338"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "'''\n",
      "//Simple Boss 2.0\n",
      "//Demonstrates access control under inheritance\n",
      "'''\n",
      "\n",
      "\n",
      "class Enemy:\n",
      "    def __init__(self):\n",
      "        self.m_Damage = 10\n",
      "\n",
      "    def Attack(self):\n",
      "        print \"Attack inflicts \" , self.m_Damage , \" damage points!\";\n",
      "\n",
      "class Boss(Enemy):\n",
      "    def __init__(self):\n",
      "        Enemy.__init__(self)\n",
      "        self.m_DamageMultiplier = 3\n",
      "\n",
      "    def SpecialAttack(self):\n",
      "        print \"Special Attack inflicts \" , (self.m_DamageMultiplier * self.m_Damage),\n",
      "        print \" damage points!\";\n",
      "\n",
      "print \"Creating an enemy.\\n\";\n",
      "enemy1 = Enemy()\n",
      "enemy1.Attack();\n",
      "print \"\\nCreating a boss.\\n\";\n",
      "boss1 = Boss()\n",
      "boss1.Attack();\n",
      "boss1.SpecialAttack();"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Creating an enemy.\n",
        "\n",
        "Attack inflicts  10  damage points!\n",
        "\n",
        "Creating a boss.\n",
        "\n",
        "Attack inflicts  10  damage points!\n",
        "Special Attack inflicts  30  damage points!\n"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 10.3 page no : 343"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "'''\n",
      "//Overriding Boss\n",
      "//Demonstrates calling and overriding base member functions\n",
      "'''\n",
      "class Enemy:\n",
      "    def __init__(self,d=10):\n",
      "        self.m_Damage = d\n",
      "\n",
      "    def Attack(self):\n",
      "        print \"Attack inflicts \" , self.m_Damage , \" damage points!\";\n",
      "\n",
      "    def Taunt(self):\n",
      "        print \"The enemy says he will fight you.\";\n",
      "    __Attack = Attack    \n",
      "\n",
      "\n",
      "class Boss(Enemy):\n",
      "    def __init__(self,d=30):\n",
      "        Enemy.__init__(self)\n",
      "        self.m_DamageMultiplier = d\n",
      "\n",
      "    def SpecialAttack(self):\n",
      "        print \"Special Attack inflicts \" , (self.m_DamageMultiplier * self.m_Damage),\n",
      "        print \" damage points!\";\n",
      "\n",
      "    def Taunt(self): #override base class member function\n",
      "        print \"The boss says he will end your pitiful existence.\"\n",
      "\n",
      "    def Attack(self): #override base class member function\n",
      "        #call base class member function\n",
      "        Enemy.Attack(self)\n",
      "        print \" And laughs heartily at you.\\n\";\n",
      "\n",
      "\n",
      "print \"Enemy object :\";\n",
      "enemy1 = Enemy()\n",
      "enemy1.Taunt()\n",
      "enemy1.Attack();\n",
      "print \"\\n boss object.\\n\";\n",
      "boss1 = Boss()\n",
      "boss1.Taunt()\n",
      "boss1.Attack();\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enemy object :\n",
        "The enemy says he will fight you.\n",
        "Attack inflicts  10  damage points!\n",
        "\n",
        " boss object.\n",
        "\n",
        "The boss says he will end your pitiful existence.\n",
        "Attack inflicts  10  damage points!\n",
        " And laughs heartily at you.\n",
        "\n"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 10.4 page no : 341,348"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "'''\n",
      "//Polymorphic Bad Guy\n",
      "//Demonstrates calling member functions dynamically\n",
      "'''\n",
      "\n",
      "class Enemy:\n",
      "    def __init__(self,d=10):\n",
      "        self.m_Damage = d\n",
      "\n",
      "    def Attack(self):\n",
      "        print \"Attack inflicts \" , self.m_Damage , \" damage points!\";\n",
      "\n",
      "    def __del__(self):\n",
      "        print \"In Enemy destructor, deleting m_pDamage.\";\n",
      "        \n",
      "class Boss(Enemy):\n",
      "    def __init__(self,d=30):\n",
      "        Enemy.__init__(self)\n",
      "        self.m_DamageMultiplier = d\n",
      "\n",
      "    def SpecialAttack(self):\n",
      "        print \"Special Attack inflicts \" , (self.m_DamageMultiplier * self.m_Damage),\n",
      "        print \" damage points!\";\n",
      "\n",
      "    def Taunt(self): #override base class member function\n",
      "        print \"The boss says he will end your pitiful existence.\"\n",
      "\n",
      "    def Attack(self): #override base class member function\n",
      "        #call base class member function\n",
      "        Enemy.Attack(self)\n",
      "        print \" And laughs heartily at you.\\n\";\n",
      "\n",
      "    def __del__(self):\n",
      "        Enemy.__del__(self)\n",
      "        print \"In Boss destructor, deleting m_pMultiplier.\";\n",
      "        self.m_pMultiplier = 0;\n",
      "\n",
      "print \"Calling Attack() on Boss object through pointer to Enemy:\"\n",
      "pBadGuy = Boss();\n",
      "pBadGuy.Attack();\n",
      "print \"\\nDeleting pointer to Enemy:\\n\";\n",
      "pBadGuy = 0;"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Calling Attack() on Boss object through pointer to Enemy:\n",
        "Attack inflicts  10  damage points!\n",
        " And laughs heartily at you.\n",
        "\n",
        "\n",
        "Deleting pointer to Enemy:\n",
        "\n",
        "In Enemy destructor, deleting m_pDamage.\n",
        "In Boss destructor, deleting m_pMultiplier.\n"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 10.5 page no : 353"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "'''\n",
      "//Abstract Creature\n",
      "//Demonstrates abstract classes\n",
      "'''\n",
      "class Creature :\n",
      "    def __init__(self,h=100):\n",
      "        self.m_Health = h\n",
      "        \n",
      "    def Greet(self): # pure virtual member function\n",
      "        pass\n",
      "\n",
      "    def DisplayHealth(self):\n",
      "        print \"Health: \" , self.m_Health\n",
      "\n",
      "\n",
      "class Orc(Creature):\n",
      "    def __init__(self,h=120):\n",
      "        Creature.__init__(self,h)\n",
      "\n",
      "    def Greet(self):\n",
      "        print \"The orc grunts hello.\\n\";\n",
      "\n",
      "pCreature =  Orc();\n",
      "pCreature.Greet();\n",
      "pCreature.DisplayHealth();"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "The orc grunts hello.\n",
        "\n",
        "Health:  120\n"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "example 10.6, page no : 361-379"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "'''\n",
      "defining game class.\n",
      "Note : this would give error as we have not initialized player class here.\n",
      "'''\n",
      "\n",
      "ACE = 1\n",
      "TWO = 2\n",
      "THREE = 3\n",
      "FOUR = 4\n",
      "FIVE = 5\n",
      "SIX = 6\n",
      "SEVEN = 7\n",
      "EIGHT = 8\n",
      "NINE = 9\n",
      "TEN = 10\n",
      "JACK = 11\n",
      "QUEEN = 12\n",
      "KING = 13\n",
      "\n",
      "CLUBS = 0\n",
      "DIAMONDS = 1\n",
      "HEARTS = 2\n",
      "SPADES = 3\n",
      "\n",
      "   \n",
      "class Card:\n",
      "    def __init__(self,r = ACE,s = SPADES,ifu = True): #returns the value of a card, 1 - 11\n",
      "        self.m_Rank = r\n",
      "        self.m_Suit = s\n",
      "        self.m_IsFaceUp =ifu\n",
      "\n",
      "    def GetValue(self):\n",
      "        #if a cards is face down, its value is 0\n",
      "        value = 0;\n",
      "        if (m_IsFaceUp):\n",
      "            #value is number showing on card\n",
      "            value = m_Rank;\n",
      "            #value is 10 for face cards\n",
      "            if (value > 10):\n",
      "                value = 10;\n",
      "        return value;\n",
      "\n",
      "    def Flip(self):\n",
      "        self.m_IsFaceUp = not (m_IsFaceUp);\n",
      "\n",
      "class Hand:\n",
      "    def __init__(self):\n",
      "        self.m_Cards = []\n",
      "\n",
      "    def __del__(self):\n",
      "        self.Clear()    \n",
      "\n",
      "    def Add(self,pCard):\n",
      "        self.m_Cards.append(pCard);\n",
      "\n",
      "    def Clear(self):\n",
      "        #iterate through vector, freeing all memory on the heap\n",
      "        self.m_Cards = []\n",
      "\n",
      "    def GetTotal(self):\n",
      "        #if no cards in hand, return 0\n",
      "        if (self.m_Cards.empty()):\n",
      "            return 0;\n",
      "        #if a first card has value of 0, then card is face down; return 0\n",
      "        if (m_Cards[0].GetValue() == 0):\n",
      "            return 0;\n",
      "        #add up card values, treat each ace as 1\n",
      "        total = 0;\n",
      "        for i in self.m_Cards:\n",
      "            total += i.GetValue()\n",
      "        #determine if hand contains an ace\n",
      "        containsAce = False;\n",
      "        for i in self.m_Cards:\n",
      "            if i.GetValue() == Card.ACE:\n",
      "                containsAce = True;\n",
      "\n",
      "        #if hand contains ace and total is low enough, treat ace as 11\n",
      "        if (containsAce and total <= 11):\n",
      "            #add only 10 since we've already added 1 for the ace\n",
      "            total += 10;\n",
      "        return total;\n",
      "\n",
      "\n",
      "class GenericPlayer(Hand):\n",
      "    def __init__(self,name):\n",
      "        self.m_Name = name\n",
      "\n",
      "    def __del__(self):\n",
      "        pass\n",
      "\n",
      "    def IsBusted(self):\n",
      "        return (self.GetTotal() > 21);\n",
      "\n",
      "    def Bust(self):\n",
      "        print self.m_Name , \" busts.\";\n",
      "\n",
      "class Player(GenericPlayer):\n",
      "   def _init_(self,name):\n",
      "       GenericPlayer.__init__(self,name)\n",
      "   \n",
      "   def _del_(self):\n",
      "       pass\n",
      "\n",
      "   def IsHitting(self):\n",
      "       print self.m_Name , \", do you want a hit? (Y/N): \",\n",
      "       response = raw_input()\n",
      "       return (response == 'y' or response == 'Y');\n",
      "\n",
      "   def Win(self):\n",
      "       print self.m_Name , \" wins.\";\n",
      "\n",
      "   def Lose(self):\n",
      "       print self.m_Name , \" loses.\";\n",
      "\n",
      "   def Push(self):\n",
      "       print self.m_Name , \" pushes.\";\n",
      "\n",
      "class House(GenericPlayer):\n",
      "    def __init__(self,name):\n",
      "        GenericPlayer.__init__(self,name)\n",
      "\n",
      "    def __del__(self):\n",
      "        pass\n",
      "\n",
      "    def IsHitting(self):\n",
      "        return (self.GetTotal() <= 16)\n",
      "\n",
      "    def FlipFirstCard(self):\n",
      "        if (not self.m_Cards):\n",
      "            m_Cards[0].Flip();\n",
      "        else:\n",
      "            print \"No card to flip!\";\n",
      "        \n",
      "class Deck(Hand):\n",
      "    def __init__(self):\n",
      "        self.m_Cards = []\n",
      "        self.Populate();\n",
      "    \n",
      "    def __del__(self):\n",
      "        pass\n",
      "        \n",
      "    def Populate(self):\n",
      "        self.Clear();\n",
      "        #create standard deck\n",
      "        for s in range(Card.CLUBS,Card.SPADES+1):\n",
      "            for r in range(Card.ACE,Card.KING+1):\n",
      "                self.Add(Card(r,s))\n",
      "\n",
      "    def Shuffle(self):\n",
      "        pass\n",
      "\n",
      "    def Deal(self, aHand):\n",
      "        if (not m_Cards):\n",
      "            aHand.Add(self.m_Cards[-1]);\n",
      "            self.m_Cards.pop();\n",
      "        else:\n",
      "            print \"Out of cards. Unable to deal.\";\n",
      "\n",
      "    def AdditionalCards(self,aGenericPlayer):\n",
      "        print ''\n",
      "        #continue to deal a card as long as generic player isn't busted and\n",
      "        #wants another hit\n",
      "        while ( not (aGenericPlayer.IsBusted()) and aGenericPlayer.IsHitting() ):\n",
      "            self.Deal(aGenericPlayer);\n",
      "            print  aGenericPlayer\n",
      "            if (aGenericPlayer.IsBusted()):\n",
      "                aGenericPlayer.Bust();\n",
      "        \n",
      "\n",
      "class Game:\n",
      "    def __init__(self,names):\n",
      "        #create a vector of players from a vector of names\n",
      "        self.pName = []\n",
      "        for i in names:\n",
      "            self.pName.append(Player(i))\n",
      "        self.m_Deck.Populate();\n",
      "        self.m_Deck.Shuffle();\n",
      "\n",
      "    def __del__(self):\n",
      "        pass\n",
      "        \n",
      "    def Play(self):\n",
      "        # deal initial 2 cards to everyone\n",
      "        for i in range(2):\n",
      "            for pPlayer in self.m_Players:\n",
      "                self.m_Deck.Deal(*pPlayer);\n",
      "            self.m_Deck.Deal(m_House);\n",
      "        #hide house's first card\n",
      "        self.m_House.FlipFirstCard();\n",
      "        for pPlayer in self.m_Players:\n",
      "            print pPlayer \n",
      "\n",
      "        print self.m_House\n",
      "        #deal additional cards to players\n",
      "    \n",
      "        for pPlayer in self.m_Players:\n",
      "            self.m_Deck.AdditionalCards(pPlayer);\n",
      "\n",
      "        #reveal house's first card\n",
      "        self.m_House.FlipFirstCard();\n",
      "        print self.m_House;\n",
      "        #deal additional cards to house\n",
      "        self.m_Deck.AdditionalCards(m_House);\n",
      "        if (self.m_House.IsBusted()):\n",
      "            #everyone still playing wins\n",
      "            for pPlayer in self.m_Players:\n",
      "                if ( not (pPlayer.IsBusted()) ):\n",
      "                    pPlayer.Win();\n",
      "        else:\n",
      "            #compare each player still playing to house\n",
      "            for pPlayer in self.m_Players:\n",
      "                if ( not (pPlayer.IsBusted()) ):\n",
      "                    if (pPlayer.GetTotal() > self.m_House.GetTotal()):\n",
      "                        pPlayer.Win();\n",
      "                elif (pPlayer.GetTotal() < self.m_House.GetTotal()):\n",
      "                    pPlayer.Lose();\n",
      "                else:\n",
      "                    pPlayer.Push();\n",
      "\n",
      "        #remove everyones cards\n",
      "        for pPlayer in self.m_Players:\n",
      "            pPlayer.Clear();\n",
      "\n",
      "        self.m_House.Clear();\n",
      "\n",
      "print \"\\t\\tWelcome to Blackjack!\\n\";\n",
      "numPlayers = 0;\n",
      "while (numPlayers < 1 or numPlayers > 7):\n",
      "    print \"How many players? (1 - 7): \";\n",
      "    numPlayers = int(raw_input())\n",
      "\n",
      "names = []\n",
      "name = ''\n",
      "for i in range(numPlayers):\n",
      "    print \"Enter player name: \";\n",
      "    name = raw_input()\n",
      "    names.append(name);  \n",
      "\n",
      "print ''\n",
      "#the game loop\n",
      "aGame = Game(names);\n",
      "again = 'y'\n",
      "while (again != 'n' and again != 'N'):\n",
      "    aGame.Play();\n",
      "    print \"\\nDo you want to play again? (Y/N): \",\n",
      "    again = raw_input()\n",
      "\n",
      "#overloads << operator so Card object can be sent to cout\n",
      "def print_(aCard):\n",
      "    RANKS = [\"0\", \"A\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\",\"10\", \"J\", \"Q\", \"K\"]\n",
      "    SUITS = [\"c\", \"d\", \"h\", \"s\"]\n",
      "    if (aCard.m_IsFaceUp):\n",
      "        print RANKS[aCard.m_Rank] , SUITS[aCard.m_Suit];\n",
      "    else:\n",
      "        print \"XX\";\n",
      "    \n",
      "\n",
      "def print__(aGenericPlayer):\n",
      "    print aGenericPlayer.m_Name\n",
      "    pCard = []\n",
      "    if (not aGenericPlayer.m_Cards):\n",
      "        for pCard in aGenericPlayer.m_Cards:\n",
      "            print pCard\n",
      "    \n",
      "    if (aGenericPlayer.GetTotal() != 0):\n",
      "        print \"(\" , aGenericPlayer.GetTotal() , \")\";\n",
      "    else:\n",
      "        print \"<empty>\";"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "ename": "StdinNotImplementedError",
       "evalue": "raw_input was called, but this frontend does not support stdin.",
       "output_type": "pyerr",
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mStdinNotImplementedError\u001b[0m                  Traceback (most recent call last)",
        "\u001b[1;32m<ipython-input-11-33b9c51ff816>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     63\u001b[0m \u001b[1;32mwhile\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mnumPlayers\u001b[0m \u001b[1;33m<\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mnumPlayers\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     64\u001b[0m     \u001b[1;32mprint\u001b[0m \u001b[1;34m\"How many players? (1 - 7): \"\u001b[0m\u001b[1;33m;\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 65\u001b[1;33m     \u001b[0mnumPlayers\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mraw_input\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     66\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     67\u001b[0m \u001b[0mnames\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/jay/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/zmq/ipkernel.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(prompt)\u001b[0m\n\u001b[0;32m    343\u001b[0m             \u001b[0mraw_input\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mprompt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m''\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_raw_input\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprompt\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mident\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparent\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    344\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 345\u001b[1;33m             \u001b[0mraw_input\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mprompt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m''\u001b[0m \u001b[1;33m:\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_no_raw_input\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    346\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    347\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mpy3compat\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mPY3\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/jay/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/zmq/ipkernel.pyc\u001b[0m in \u001b[0;36m_no_raw_input\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    686\u001b[0m         \"\"\"Raise StdinNotImplentedError if active frontend doesn't support\n\u001b[0;32m    687\u001b[0m         stdin.\"\"\"\n\u001b[1;32m--> 688\u001b[1;33m         raise StdinNotImplementedError(\"raw_input was called, but this \"\n\u001b[0m\u001b[0;32m    689\u001b[0m                                        \"frontend does not support stdin.\") \n\u001b[0;32m    690\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;31mStdinNotImplementedError\u001b[0m: raw_input was called, but this frontend does not support stdin."
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\t\tWelcome to Blackjack!\n",
        "\n",
        "How many players? (1 - 7): \n"
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}