Added OO version of hangman, tweaked original.
[cas-master-teacher-training.git] / hangman-setter-oo.ipynb
1 {
2 "metadata": {
3 "name": "",
4 "signature": "sha256:44071c1a95bc0678534109dd2aa9b1d6318c87aa5048ca952603795efd142b14"
5 },
6 "nbformat": 3,
7 "nbformat_minor": 0,
8 "worksheets": [
9 {
10 "cells": [
11 {
12 "cell_type": "code",
13 "collapsed": false,
14 "input": [
15 "import re\n",
16 "import random"
17 ],
18 "language": "python",
19 "metadata": {},
20 "outputs": [],
21 "prompt_number": 1
22 },
23 {
24 "cell_type": "code",
25 "collapsed": false,
26 "input": [
27 "WORDS = [w.strip() for w in open('/usr/share/dict/british-english').readlines() \n",
28 " if re.match(r'^[a-z]*$', w.strip())]"
29 ],
30 "language": "python",
31 "metadata": {},
32 "outputs": [],
33 "prompt_number": 2
34 },
35 {
36 "cell_type": "code",
37 "collapsed": false,
38 "input": [
39 "STARTING_LIVES = 10"
40 ],
41 "language": "python",
42 "metadata": {},
43 "outputs": [],
44 "prompt_number": 3
45 },
46 {
47 "cell_type": "code",
48 "collapsed": false,
49 "input": [
50 "class Game:\n",
51 " def __init__(self, target, lives=STARTING_LIVES):\n",
52 " self.lives = lives\n",
53 " self.target = target\n",
54 " self.discovered = list('_' * len(target))\n",
55 " self.wrong_letters = []\n",
56 " self.game_finished = False\n",
57 " self.game_won = False\n",
58 " self.game_lost = False\n",
59 " \n",
60 " def find_all(self, letter):\n",
61 " locations = []\n",
62 " starting=0\n",
63 " location = self.target.find(letter)\n",
64 " while location > -1:\n",
65 " locations += [location]\n",
66 " starting = location + 1\n",
67 " location = self.target.find(letter, starting)\n",
68 " return locations\n",
69 " \n",
70 " def update_discovered_word(self, guessed_letter):\n",
71 " locations = self.find_all(guessed_letter)\n",
72 " for location in locations:\n",
73 " self.discovered[location] = guessed_letter\n",
74 " return self.discovered\n",
75 " \n",
76 " def do_turn(self):\n",
77 " print('Word:', ' '.join(self.discovered), \n",
78 " ' : Lives =', self.lives, \n",
79 " ', wrong guesses:', ' '.join(sorted(self.wrong_letters)))\n",
80 " guess = input('Enter letter: ').strip().lower()[0]\n",
81 " if guess in self.target:\n",
82 " self.update_discovered_word(guess)\n",
83 " else:\n",
84 " self.lives -= 1\n",
85 " if guess not in self.wrong_letters:\n",
86 " self.wrong_letters += [guess]\n",
87 " if self.lives == 0:\n",
88 " self.game_finished = True\n",
89 " self.game_lost = True\n",
90 " if '_' not in self.discovered:\n",
91 " self.game_finished = True\n",
92 " self.game_won = True\n",
93 " \n",
94 " def play_game(self):\n",
95 " self.do_turn()\n",
96 " while not self.game_finished:\n",
97 " self.do_turn()\n",
98 " return self.game_won\n",
99 " \n",
100 " def report_on_game(self):\n",
101 " if self.game_won:\n",
102 " print('You won! The word was', self.target)\n",
103 " else:\n",
104 " print('You lost. The word was', self.target)\n",
105 " return self.game_won\n",
106 " \n",
107 " def play_game_with_report(self):\n",
108 " self.play_game()\n",
109 " self.report_on_game()"
110 ],
111 "language": "python",
112 "metadata": {},
113 "outputs": [],
114 "prompt_number": 35
115 },
116 {
117 "cell_type": "code",
118 "collapsed": false,
119 "input": [
120 "g = Game(random.choice(WORDS))"
121 ],
122 "language": "python",
123 "metadata": {},
124 "outputs": [],
125 "prompt_number": 22
126 },
127 {
128 "cell_type": "code",
129 "collapsed": false,
130 "input": [
131 "g.target"
132 ],
133 "language": "python",
134 "metadata": {},
135 "outputs": [
136 {
137 "metadata": {},
138 "output_type": "pyout",
139 "prompt_number": 23,
140 "text": [
141 "'cooing'"
142 ]
143 }
144 ],
145 "prompt_number": 23
146 },
147 {
148 "cell_type": "code",
149 "collapsed": false,
150 "input": [
151 "g.discovered"
152 ],
153 "language": "python",
154 "metadata": {},
155 "outputs": [
156 {
157 "metadata": {},
158 "output_type": "pyout",
159 "prompt_number": 24,
160 "text": [
161 "['_', '_', '_', '_', '_', '_']"
162 ]
163 }
164 ],
165 "prompt_number": 24
166 },
167 {
168 "cell_type": "code",
169 "collapsed": false,
170 "input": [
171 "g.do_turn()"
172 ],
173 "language": "python",
174 "metadata": {},
175 "outputs": [
176 {
177 "output_type": "stream",
178 "stream": "stdout",
179 "text": [
180 "Word: _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
181 ]
182 },
183 {
184 "name": "stdout",
185 "output_type": "stream",
186 "stream": "stdout",
187 "text": [
188 "Enter letter: x\n"
189 ]
190 }
191 ],
192 "prompt_number": 25
193 },
194 {
195 "cell_type": "code",
196 "collapsed": false,
197 "input": [
198 "g.lives"
199 ],
200 "language": "python",
201 "metadata": {},
202 "outputs": [
203 {
204 "metadata": {},
205 "output_type": "pyout",
206 "prompt_number": 26,
207 "text": [
208 "9"
209 ]
210 }
211 ],
212 "prompt_number": 26
213 },
214 {
215 "cell_type": "code",
216 "collapsed": false,
217 "input": [
218 "g.wrong_letters"
219 ],
220 "language": "python",
221 "metadata": {},
222 "outputs": [
223 {
224 "metadata": {},
225 "output_type": "pyout",
226 "prompt_number": 27,
227 "text": [
228 "['x']"
229 ]
230 }
231 ],
232 "prompt_number": 27
233 },
234 {
235 "cell_type": "code",
236 "collapsed": false,
237 "input": [
238 "g.do_turn()"
239 ],
240 "language": "python",
241 "metadata": {},
242 "outputs": [
243 {
244 "output_type": "stream",
245 "stream": "stdout",
246 "text": [
247 "Word: _ _ _ _ _ _ : Lives = 9 , wrong guesses: x\n"
248 ]
249 },
250 {
251 "name": "stdout",
252 "output_type": "stream",
253 "stream": "stdout",
254 "text": [
255 "Enter letter: o\n"
256 ]
257 }
258 ],
259 "prompt_number": 28
260 },
261 {
262 "cell_type": "code",
263 "collapsed": false,
264 "input": [
265 "g.lives"
266 ],
267 "language": "python",
268 "metadata": {},
269 "outputs": [
270 {
271 "metadata": {},
272 "output_type": "pyout",
273 "prompt_number": 29,
274 "text": [
275 "9"
276 ]
277 }
278 ],
279 "prompt_number": 29
280 },
281 {
282 "cell_type": "code",
283 "collapsed": false,
284 "input": [
285 "g.discovered"
286 ],
287 "language": "python",
288 "metadata": {},
289 "outputs": [
290 {
291 "metadata": {},
292 "output_type": "pyout",
293 "prompt_number": 30,
294 "text": [
295 "['_', 'o', 'o', '_', '_', '_']"
296 ]
297 }
298 ],
299 "prompt_number": 30
300 },
301 {
302 "cell_type": "code",
303 "collapsed": false,
304 "input": [
305 "g.wrong_letters"
306 ],
307 "language": "python",
308 "metadata": {},
309 "outputs": [
310 {
311 "metadata": {},
312 "output_type": "pyout",
313 "prompt_number": 31,
314 "text": [
315 "['x']"
316 ]
317 }
318 ],
319 "prompt_number": 31
320 },
321 {
322 "cell_type": "code",
323 "collapsed": false,
324 "input": [
325 "g = Game(random.choice(WORDS))\n",
326 "g.play_game_with_report()"
327 ],
328 "language": "python",
329 "metadata": {},
330 "outputs": [
331 {
332 "output_type": "stream",
333 "stream": "stdout",
334 "text": [
335 "Word: _ _ _ _ _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
336 ]
337 },
338 {
339 "name": "stdout",
340 "output_type": "stream",
341 "stream": "stdout",
342 "text": [
343 "Enter letter: e\n"
344 ]
345 },
346 {
347 "output_type": "stream",
348 "stream": "stdout",
349 "text": [
350 "Word: _ _ _ _ _ _ _ _ _ _ : Lives = 9 , wrong guesses: e\n"
351 ]
352 },
353 {
354 "name": "stdout",
355 "output_type": "stream",
356 "stream": "stdout",
357 "text": [
358 "Enter letter: a\n"
359 ]
360 },
361 {
362 "output_type": "stream",
363 "stream": "stdout",
364 "text": [
365 "Word: _ a _ _ _ _ a _ _ _ : Lives = 9 , wrong guesses: e\n"
366 ]
367 },
368 {
369 "name": "stdout",
370 "output_type": "stream",
371 "stream": "stdout",
372 "text": [
373 "Enter letter: t\n"
374 ]
375 },
376 {
377 "output_type": "stream",
378 "stream": "stdout",
379 "text": [
380 "Word: _ a _ _ _ _ a _ t _ : Lives = 9 , wrong guesses: e\n"
381 ]
382 },
383 {
384 "name": "stdout",
385 "output_type": "stream",
386 "stream": "stdout",
387 "text": [
388 "Enter letter: o\n"
389 ]
390 },
391 {
392 "output_type": "stream",
393 "stream": "stdout",
394 "text": [
395 "Word: _ a _ _ _ _ a _ t _ : Lives = 8 , wrong guesses: e o\n"
396 ]
397 },
398 {
399 "name": "stdout",
400 "output_type": "stream",
401 "stream": "stdout",
402 "text": [
403 "Enter letter: h\n"
404 ]
405 },
406 {
407 "output_type": "stream",
408 "stream": "stdout",
409 "text": [
410 "Word: _ a _ _ _ _ a _ t _ : Lives = 7 , wrong guesses: e h o\n"
411 ]
412 },
413 {
414 "name": "stdout",
415 "output_type": "stream",
416 "stream": "stdout",
417 "text": [
418 "Enter letter: s\n"
419 ]
420 },
421 {
422 "output_type": "stream",
423 "stream": "stdout",
424 "text": [
425 "Word: _ a _ _ _ _ a _ t s : Lives = 7 , wrong guesses: e h o\n"
426 ]
427 },
428 {
429 "name": "stdout",
430 "output_type": "stream",
431 "stream": "stdout",
432 "text": [
433 "Enter letter: r\n"
434 ]
435 },
436 {
437 "output_type": "stream",
438 "stream": "stdout",
439 "text": [
440 "Word: _ a _ _ _ _ a _ t s : Lives = 6 , wrong guesses: e h o r\n"
441 ]
442 },
443 {
444 "name": "stdout",
445 "output_type": "stream",
446 "stream": "stdout",
447 "text": [
448 "Enter letter: d\n"
449 ]
450 },
451 {
452 "output_type": "stream",
453 "stream": "stdout",
454 "text": [
455 "Word: _ a _ _ _ _ a _ t s : Lives = 5 , wrong guesses: d e h o r\n"
456 ]
457 },
458 {
459 "name": "stdout",
460 "output_type": "stream",
461 "stream": "stdout",
462 "text": [
463 "Enter letter: l\n"
464 ]
465 },
466 {
467 "output_type": "stream",
468 "stream": "stdout",
469 "text": [
470 "Word: _ a l l _ _ a _ t s : Lives = 5 , wrong guesses: d e h o r\n"
471 ]
472 },
473 {
474 "name": "stdout",
475 "output_type": "stream",
476 "stream": "stdout",
477 "text": [
478 "Enter letter: f\n"
479 ]
480 },
481 {
482 "output_type": "stream",
483 "stream": "stdout",
484 "text": [
485 "Word: _ a l l _ _ a _ t s : Lives = 4 , wrong guesses: d e f h o r\n"
486 ]
487 },
488 {
489 "name": "stdout",
490 "output_type": "stream",
491 "stream": "stdout",
492 "text": [
493 "Enter letter: n\n"
494 ]
495 },
496 {
497 "output_type": "stream",
498 "stream": "stdout",
499 "text": [
500 "Word: _ a l l _ _ a n t s : Lives = 4 , wrong guesses: d e f h o r\n"
501 ]
502 },
503 {
504 "name": "stdout",
505 "output_type": "stream",
506 "stream": "stdout",
507 "text": [
508 "Enter letter: g\n"
509 ]
510 },
511 {
512 "output_type": "stream",
513 "stream": "stdout",
514 "text": [
515 "Word: g a l l _ _ a n t s : Lives = 4 , wrong guesses: d e f h o r\n"
516 ]
517 },
518 {
519 "name": "stdout",
520 "output_type": "stream",
521 "stream": "stdout",
522 "text": [
523 "Enter letter: i\n"
524 ]
525 },
526 {
527 "output_type": "stream",
528 "stream": "stdout",
529 "text": [
530 "Word: g a l l i _ a n t s : Lives = 4 , wrong guesses: d e f h o r\n"
531 ]
532 },
533 {
534 "name": "stdout",
535 "output_type": "stream",
536 "stream": "stdout",
537 "text": [
538 "Enter letter: v\n"
539 ]
540 },
541 {
542 "output_type": "stream",
543 "stream": "stdout",
544 "text": [
545 "You won! The word was gallivants\n"
546 ]
547 }
548 ],
549 "prompt_number": 37
550 },
551 {
552 "cell_type": "code",
553 "collapsed": false,
554 "input": [
555 "g = Game(random.choice(WORDS))\n",
556 "g.play_game()"
557 ],
558 "language": "python",
559 "metadata": {},
560 "outputs": [
561 {
562 "output_type": "stream",
563 "stream": "stdout",
564 "text": [
565 "Word: _ _ _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
566 ]
567 },
568 {
569 "name": "stdout",
570 "output_type": "stream",
571 "stream": "stdout",
572 "text": [
573 "Enter letter: e\n"
574 ]
575 },
576 {
577 "output_type": "stream",
578 "stream": "stdout",
579 "text": [
580 "Word: _ _ _ e e _ _ _ : Lives = 10 , wrong guesses: \n"
581 ]
582 },
583 {
584 "name": "stdout",
585 "output_type": "stream",
586 "stream": "stdout",
587 "text": [
588 "Enter letter: a\n"
589 ]
590 },
591 {
592 "output_type": "stream",
593 "stream": "stdout",
594 "text": [
595 "Word: _ _ _ e e _ _ _ : Lives = 9 , wrong guesses: a\n"
596 ]
597 },
598 {
599 "name": "stdout",
600 "output_type": "stream",
601 "stream": "stdout",
602 "text": [
603 "Enter letter: i\n"
604 ]
605 },
606 {
607 "output_type": "stream",
608 "stream": "stdout",
609 "text": [
610 "Word: _ _ _ e e i _ _ : Lives = 9 , wrong guesses: a\n"
611 ]
612 },
613 {
614 "name": "stdout",
615 "output_type": "stream",
616 "stream": "stdout",
617 "text": [
618 "Enter letter: n\n"
619 ]
620 },
621 {
622 "output_type": "stream",
623 "stream": "stdout",
624 "text": [
625 "Word: _ _ _ e e i n _ : Lives = 9 , wrong guesses: a\n"
626 ]
627 },
628 {
629 "name": "stdout",
630 "output_type": "stream",
631 "stream": "stdout",
632 "text": [
633 "Enter letter: g\n"
634 ]
635 },
636 {
637 "output_type": "stream",
638 "stream": "stdout",
639 "text": [
640 "Word: _ _ _ e e i n g : Lives = 9 , wrong guesses: a\n"
641 ]
642 },
643 {
644 "name": "stdout",
645 "output_type": "stream",
646 "stream": "stdout",
647 "text": [
648 "Enter letter: u\n"
649 ]
650 },
651 {
652 "output_type": "stream",
653 "stream": "stdout",
654 "text": [
655 "Word: _ _ _ e e i n g : Lives = 8 , wrong guesses: a u\n"
656 ]
657 },
658 {
659 "name": "stdout",
660 "output_type": "stream",
661 "stream": "stdout",
662 "text": [
663 "Enter letter: s\n"
664 ]
665 },
666 {
667 "output_type": "stream",
668 "stream": "stdout",
669 "text": [
670 "Word: s _ _ e e i n g : Lives = 8 , wrong guesses: a u\n"
671 ]
672 },
673 {
674 "name": "stdout",
675 "output_type": "stream",
676 "stream": "stdout",
677 "text": [
678 "Enter letter: h\n"
679 ]
680 },
681 {
682 "output_type": "stream",
683 "stream": "stdout",
684 "text": [
685 "Word: s _ _ e e i n g : Lives = 7 , wrong guesses: a h u\n"
686 ]
687 },
688 {
689 "name": "stdout",
690 "output_type": "stream",
691 "stream": "stdout",
692 "text": [
693 "Enter letter: c\n"
694 ]
695 },
696 {
697 "output_type": "stream",
698 "stream": "stdout",
699 "text": [
700 "Word: s _ _ e e i n g : Lives = 6 , wrong guesses: a c h u\n"
701 ]
702 },
703 {
704 "name": "stdout",
705 "output_type": "stream",
706 "stream": "stdout",
707 "text": [
708 "Enter letter: t\n"
709 ]
710 },
711 {
712 "output_type": "stream",
713 "stream": "stdout",
714 "text": [
715 "Word: s _ _ e e i n g : Lives = 5 , wrong guesses: a c h t u\n"
716 ]
717 },
718 {
719 "name": "stdout",
720 "output_type": "stream",
721 "stream": "stdout",
722 "text": [
723 "Enter letter: r\n"
724 ]
725 },
726 {
727 "output_type": "stream",
728 "stream": "stdout",
729 "text": [
730 "Word: s _ r e e i n g : Lives = 5 , wrong guesses: a c h t u\n"
731 ]
732 },
733 {
734 "name": "stdout",
735 "output_type": "stream",
736 "stream": "stdout",
737 "text": [
738 "Enter letter: c\n"
739 ]
740 },
741 {
742 "output_type": "stream",
743 "stream": "stdout",
744 "text": [
745 "Word: s _ r e e i n g : Lives = 4 , wrong guesses: a c h t u\n"
746 ]
747 },
748 {
749 "name": "stdout",
750 "output_type": "stream",
751 "stream": "stdout",
752 "text": [
753 "Enter letter: p\n"
754 ]
755 },
756 {
757 "metadata": {},
758 "output_type": "pyout",
759 "prompt_number": 38,
760 "text": [
761 "True"
762 ]
763 }
764 ],
765 "prompt_number": 38
766 },
767 {
768 "cell_type": "code",
769 "collapsed": false,
770 "input": [
771 "g.target"
772 ],
773 "language": "python",
774 "metadata": {},
775 "outputs": [
776 {
777 "metadata": {},
778 "output_type": "pyout",
779 "prompt_number": 39,
780 "text": [
781 "'spreeing'"
782 ]
783 }
784 ],
785 "prompt_number": 39
786 },
787 {
788 "cell_type": "code",
789 "collapsed": false,
790 "input": [],
791 "language": "python",
792 "metadata": {},
793 "outputs": []
794 }
795 ],
796 "metadata": {}
797 }
798 ]
799 }