{ "metadata": { "name": "", "signature": "sha256:5e9f030b42097ebbcce2654cdb1d9370fde38b61bdbfa85a0cc700e76d5a8a71" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "import re\n", "import random\n", "import string\n", "import collections" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 71 }, { "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": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "STARTING_LIVES = 10" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 73 }, { "cell_type": "code", "collapsed": false, "input": [ "class Game:\n", " def __init__(self, target, player=None, lives=STARTING_LIVES):\n", " self.lives = lives\n", " self.player = player\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", " return [p for p, l in enumerate(self.target) if l == letter]\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", " if self.player:\n", " guess = self.player.guess(self.discovered, self.wrong_letters, self.lives)\n", " else:\n", " guess = self.ask_for_guess()\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 ask_for_guess(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", " return guess\n", " \n", " def play_game(self):\n", " self.do_turn()\n", " while not self.game_finished:\n", " self.do_turn()\n", " if not self.player:\n", " self.report_on_game()\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" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 74 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "g.target" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 76, "text": [ "'strife'" ] } ], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "g.discovered" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 77, "text": [ "['_', '_', '_', '_', '_', '_']" ] } ], "prompt_number": 77 }, { "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: e\n" ] } ], "prompt_number": 78 }, { "cell_type": "code", "collapsed": false, "input": [ "g.lives" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 79, "text": [ "10" ] } ], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [ "g.wrong_letters" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 80, "text": [ "[]" ] } ], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "g.do_turn()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ _ e : Lives = 10 , wrong guesses: \n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: d\n" ] } ], "prompt_number": 81 }, { "cell_type": "code", "collapsed": false, "input": [ "g.lives" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 82, "text": [ "9" ] } ], "prompt_number": 82 }, { "cell_type": "code", "collapsed": false, "input": [ "g.discovered" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 83, "text": [ "['_', '_', '_', '_', '_', 'e']" ] } ], "prompt_number": 83 }, { "cell_type": "code", "collapsed": false, "input": [ "g.wrong_letters" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 84, "text": [ "['d']" ] } ], "prompt_number": 84 }, { "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: d\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ _ _ d : 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 d : Lives = 10 , wrong guesses: \n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: f\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 9 , wrong guesses: f\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: e\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 9 , wrong guesses: f\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: s\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 8 , wrong guesses: f s\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: t\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 7 , wrong guesses: f s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: n\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 6 , wrong guesses: f n s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: m\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 5 , wrong guesses: f m n s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: h\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 4 , wrong guesses: f h m n s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: o\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ _ _ e d : Lives = 3 , wrong guesses: f h m n o s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: i\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ e _ i _ e d : Lives = 3 , wrong guesses: f h m n o s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: r e _ i r e d : Lives = 3 , wrong guesses: f h m n o s t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: w\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "You won! The word was rewired\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 85, "text": [ "True" ] } ], "prompt_number": 85 }, { "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: _ _ _ _ _ : Lives = 9 , wrong guesses: e\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: s\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ s : 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: _ _ _ _ s : Lives = 8 , wrong guesses: e t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: o\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ s : Lives = 7 , wrong guesses: e o t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: i\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ s : Lives = 6 , wrong guesses: e i o t\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: u\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ s : Lives = 5 , wrong guesses: e i o t u\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: a\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ _ _ _ s : Lives = 4 , wrong guesses: a e i o t u\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: y\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ y _ _ s : Lives = 4 , wrong guesses: a e i o t u\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: w\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: _ y _ _ s : Lives = 3 , wrong guesses: a e i o t u w\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: h\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: h y _ _ s : Lives = 3 , wrong guesses: a e i o t u w\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: m\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Word: h y m _ s : Lives = 3 , wrong guesses: a e i o t u w\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Enter letter: n\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "You won! The word was hymns\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 86, "text": [ "True" ] } ], "prompt_number": 86 }, { "cell_type": "code", "collapsed": false, "input": [ "g.target" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 108, "text": [ "'six'" ] } ], "prompt_number": 108 }, { "cell_type": "code", "collapsed": false, "input": [ "class PlayerAlphabetical:\n", " def guess(self, discovered, missed, lives):\n", " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n", " return [l for l in string.ascii_lowercase if l not in guessed_letters][0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 109 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerAlphabetical())" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 110 }, { "cell_type": "code", "collapsed": false, "input": [ "g.play_game()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 111, "text": [ "False" ] } ], "prompt_number": 111 }, { "cell_type": "code", "collapsed": false, "input": [ "g.discovered" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 112, "text": [ "['l', 'e', 'g', 'a', 'l', 'l', '_']" ] } ], "prompt_number": 112 }, { "cell_type": "code", "collapsed": false, "input": [ "g.target" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 113, "text": [ "'legally'" ] } ], "prompt_number": 113 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: cavalry ; Discovered: ['c', 'a', '_', 'a', 'l', '_', '_'] ; Lives remaining: 0\n" ] } ], "prompt_number": 114 }, { "cell_type": "code", "collapsed": false, "input": [ "LETTER_COUNTS = collections.Counter(l.lower() for l in open('sherlock-holmes.txt').read() if l in string.ascii_letters)\n", "LETTERS_IN_ORDER = [p[0] for p in LETTER_COUNTS.most_common()]\n", "\n", "class PlayerFreqOrdered:\n", " def guess(self, discovered, missed, lives):\n", " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n", " return [l for l in LETTERS_IN_ORDER if l not in guessed_letters][0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 115 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: deathblow ; Discovered: ['d', 'e', 'a', 't', 'h', '_', 'l', 'o', 'w'] ; Lives remaining: 0\n" ] } ], "prompt_number": 116 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: littered ; Discovered: ['l', 'i', 't', 't', 'e', 'r', 'e', 'd'] ; Lives remaining: 5\n" ] } ], "prompt_number": 117 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: licenced ; Discovered: ['l', 'i', 'c', 'e', 'n', 'c', 'e', 'd'] ; Lives remaining: 1\n" ] } ], "prompt_number": 118 }, { "cell_type": "code", "collapsed": false, "input": [ "class PlayerFixedOrder:\n", " def __init__(self, ordered_letters):\n", " self.ordered_letters = ordered_letters\n", " \n", " def guess(self, discovered, missed, lives):\n", " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n", " return [l for l in self.ordered_letters if l not in guessed_letters][0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 119 }, { "cell_type": "code", "collapsed": false, "input": [ "class PlayerAlphabetical(PlayerFixedOrder):\n", " def __init__(self):\n", " super().__init__(string.ascii_lowercase)\n", "\n", "class PlayerFreqOrdered(PlayerFixedOrder):\n", " def __init__(self):\n", " super().__init__(LETTERS_IN_ORDER)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 120 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: unworthier ; Discovered: ['u', 'n', 'w', 'o', 'r', 't', 'h', 'i', 'e', 'r'] ; Lives remaining: 5\n" ] } ], "prompt_number": 121 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: kneel ; Discovered: ['_', 'n', 'e', 'e', 'l'] ; Lives remaining: 0\n" ] } ], "prompt_number": 122 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: provisoes ; Discovered: ['_', '_', '_', '_', 'i', '_', '_', 'e', '_'] ; Lives remaining: 0\n" ] } ], "prompt_number": 123 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: invincible ; Discovered: ['_', '_', 'v', '_', '_', '_', '_', '_', '_', '_'] ; Lives remaining: 0\n" ] } ], "prompt_number": 124 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n", "g.play_game()\n", "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Target: clogging ; Discovered: ['_', '_', '_', '_', '_', '_', '_', '_'] ; Lives remaining: 0\n" ] } ], "prompt_number": 125 }, { "cell_type": "code", "collapsed": false, "input": [ "wins = 0\n", "for _ in range(1000):\n", " g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n", " g.play_game()\n", " if g.game_won:\n", " wins += 1\n", "print(wins)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "44\n" ] } ], "prompt_number": 126 }, { "cell_type": "code", "collapsed": false, "input": [ "wins = 0\n", "for _ in range(1000):\n", " g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n", " g.play_game()\n", " if g.game_won:\n", " wins += 1\n", "print(wins)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "320\n" ] } ], "prompt_number": 127 }, { "cell_type": "code", "collapsed": false, "input": [ "wins = 0\n", "for _ in range(1000):\n", " g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n", " g.play_game()\n", " if g.game_won:\n", " wins += 1\n", "print(wins)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "7\n" ] } ], "prompt_number": 128 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 128 } ], "metadata": {} } ] }