{
 "metadata": {
  "name": "",
  "signature": "sha256:44071c1a95bc0678534109dd2aa9b1d6318c87aa5048ca952603795efd142b14"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import re\n",
      "import random"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "WORDS = [w.strip() for w in open('/usr/share/dict/british-english').readlines() \n",
      "         if re.match(r'^[a-z]*$', w.strip())]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "STARTING_LIVES = 10"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Game:\n",
      "    def __init__(self, target, lives=STARTING_LIVES):\n",
      "        self.lives = lives\n",
      "        self.target = target\n",
      "        self.discovered = list('_' * len(target))\n",
      "        self.wrong_letters = []\n",
      "        self.game_finished = False\n",
      "        self.game_won = False\n",
      "        self.game_lost = False\n",
      "    \n",
      "    def find_all(self, letter):\n",
      "        locations = []\n",
      "        starting=0\n",
      "        location = self.target.find(letter)\n",
      "        while location > -1:\n",
      "            locations += [location]\n",
      "            starting = location + 1\n",
      "            location = self.target.find(letter, starting)\n",
      "        return locations\n",
      "    \n",
      "    def update_discovered_word(self, guessed_letter):\n",
      "        locations = self.find_all(guessed_letter)\n",
      "        for location in locations:\n",
      "            self.discovered[location] = guessed_letter\n",
      "        return self.discovered\n",
      "    \n",
      "    def do_turn(self):\n",
      "        print('Word:', ' '.join(self.discovered), \n",
      "              ' : Lives =', self.lives, \n",
      "              ', wrong guesses:', ' '.join(sorted(self.wrong_letters)))\n",
      "        guess = input('Enter letter: ').strip().lower()[0]\n",
      "        if guess in self.target:\n",
      "            self.update_discovered_word(guess)\n",
      "        else:\n",
      "            self.lives -= 1\n",
      "            if guess not in self.wrong_letters:\n",
      "                self.wrong_letters += [guess]\n",
      "        if self.lives == 0:\n",
      "            self.game_finished = True\n",
      "            self.game_lost = True\n",
      "        if '_' not in self.discovered:\n",
      "            self.game_finished = True\n",
      "            self.game_won = True\n",
      "    \n",
      "    def play_game(self):\n",
      "        self.do_turn()\n",
      "        while not self.game_finished:\n",
      "            self.do_turn()\n",
      "        return self.game_won\n",
      "    \n",
      "    def report_on_game(self):\n",
      "        if self.game_won:\n",
      "            print('You won! The word was', self.target)\n",
      "        else:\n",
      "            print('You lost. The word was', self.target)\n",
      "        return self.game_won\n",
      "    \n",
      "    def play_game_with_report(self):\n",
      "        self.play_game()\n",
      "        self.report_on_game()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 35
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g = Game(random.choice(WORDS))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 22
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.target"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 23,
       "text": [
        "'cooing'"
       ]
      }
     ],
     "prompt_number": 23
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.discovered"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 24,
       "text": [
        "['_', '_', '_', '_', '_', '_']"
       ]
      }
     ],
     "prompt_number": 24
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.do_turn()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ _ _ _  : Lives = 10 , wrong guesses: \n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: x\n"
       ]
      }
     ],
     "prompt_number": 25
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.lives"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 26,
       "text": [
        "9"
       ]
      }
     ],
     "prompt_number": 26
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.wrong_letters"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 27,
       "text": [
        "['x']"
       ]
      }
     ],
     "prompt_number": 27
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.do_turn()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ _ _ _  : Lives = 9 , wrong guesses: x\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: o\n"
       ]
      }
     ],
     "prompt_number": 28
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.lives"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 29,
       "text": [
        "9"
       ]
      }
     ],
     "prompt_number": 29
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.discovered"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 30,
       "text": [
        "['_', 'o', 'o', '_', '_', '_']"
       ]
      }
     ],
     "prompt_number": 30
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.wrong_letters"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 31,
       "text": [
        "['x']"
       ]
      }
     ],
     "prompt_number": 31
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g = Game(random.choice(WORDS))\n",
      "g.play_game_with_report()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ _ _ _ _ _ _ _  : Lives = 10 , wrong guesses: \n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: e\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ _ _ _ _ _ _ _  : Lives = 9 , wrong guesses: e\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: a\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ _ _  : Lives = 9 , wrong guesses: e\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: t\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ t _  : Lives = 9 , wrong guesses: e\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: o\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ t _  : Lives = 8 , wrong guesses: e o\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: h\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ t _  : Lives = 7 , wrong guesses: e h o\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: s\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ t s  : Lives = 7 , wrong guesses: e h o\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: r\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ t s  : Lives = 6 , wrong guesses: e h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: d\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a _ _ _ _ a _ t s  : Lives = 5 , wrong guesses: d e h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: l\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a l l _ _ a _ t s  : Lives = 5 , wrong guesses: d e h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: f\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a l l _ _ a _ t s  : Lives = 4 , wrong guesses: d e f h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: n\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ a l l _ _ a n t s  : Lives = 4 , wrong guesses: d e f h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: g\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: g a l l _ _ a n t s  : Lives = 4 , wrong guesses: d e f h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: i\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: g a l l i _ a n t s  : Lives = 4 , wrong guesses: d e f h o r\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: v\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "You won! The word was gallivants\n"
       ]
      }
     ],
     "prompt_number": 37
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g = Game(random.choice(WORDS))\n",
      "g.play_game()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ _ _ _ _ _  : Lives = 10 , wrong guesses: \n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: e\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ e e _ _ _  : Lives = 10 , wrong guesses: \n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: a\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ e e _ _ _  : Lives = 9 , wrong guesses: a\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: i\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ e e i _ _  : Lives = 9 , wrong guesses: a\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: n\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ e e i n _  : Lives = 9 , wrong guesses: a\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: g\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ e e i n g  : Lives = 9 , wrong guesses: a\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: u\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: _ _ _ e e i n g  : Lives = 8 , wrong guesses: a u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: s\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: s _ _ e e i n g  : Lives = 8 , wrong guesses: a u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: h\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: s _ _ e e i n g  : Lives = 7 , wrong guesses: a h u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: c\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: s _ _ e e i n g  : Lives = 6 , wrong guesses: a c h u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: t\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: s _ _ e e i n g  : Lives = 5 , wrong guesses: a c h t u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: r\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: s _ r e e i n g  : Lives = 5 , wrong guesses: a c h t u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: c\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Word: s _ r e e i n g  : Lives = 4 , wrong guesses: a c h t u\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter letter: p\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 38,
       "text": [
        "True"
       ]
      }
     ],
     "prompt_number": 38
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "g.target"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 39,
       "text": [
        "'spreeing'"
       ]
      }
     ],
     "prompt_number": 39
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}