21 декември 2008

Бесеница в ~60 реда python код

Една от първите програми които бях написал докато учех python беше игра на бесеница. Мъчих се върху нея със дни и накрая се отказах. Вчера докато наливах бира и водка(голяма грешка) се сетих къде съм cгрешил преди толкова време и днес от скука написах кода. Сега ще го споделя, макар да е доста "бърз" и да съдържа някой доста не-елегантни части, работи и дори е забавно :D

hangman.py:

  1. #!/usr/bin/env python  
  2. #-*- coding: utf-8 -*-   
  3.   
  4. from random import choice  
  5. from hangman_lib import hang,wordlist  
  6.   
  7. def find_index(word,char):  
  8.     """find all the positions of char in word"""  
  9.     index_list=[]  
  10.     for i in range(len(word)):  
  11.         if word[i]==char:  
  12.             index_list.append(i)  
  13.     return index_list  
  14.   
  15. def replace_letter(blank,word,char):  
  16.     """insert char in the positions, where char apears in word"""  
  17.     index_list=find_index(word,char)  
  18.     for i in index_list:  
  19.         blank[i]=char  
  20.     return blank  
  21.   
  22. def inp():  
  23.     """validate input, only 1 letter per turn. 
  24.        Also, some recurtion-foo at the end :D"""  
  25.     i=raw_input(u"вход=>".encode('utf-8'))  
  26.     if len(i)==1:  
  27.         return i  
  28.     else:  
  29.         print "one letter at a time"  
  30.         return inp()  
  31.   
  32. def win(blank, word):  
  33.     """check if we win"""  
  34.     if blank == word:  
  35.         return True  
  36.     else:  
  37.         return False  
  38.   
  39. def main(blank,word,lives):  
  40.     """main function, some more recurtion-foo here :D"""  
  41.     print blank  
  42.     if lives >0:  
  43.         char=inp()  
  44.         if char in word:  
  45.             blank=replace_letter(blank,word,char)  
  46.             if win(blank,word):  
  47.                 print "you win"  
  48.                 print word  
  49.             else:  
  50.                 main(blank,word,lives) #recurse with new blank  
  51.         else:  
  52.             print hang[lives-1#hang is the dict with the graphics  
  53.             print 'you have %s lives left' %(lives-1)  
  54.             main(blank,word,lives-1#recurse with one live less  
  55.     else:  
  56.         print hang[0]  
  57.         print "you lose!"  
  58.         print word  
  59.   
  60. if __name__=='__main__':  
  61.     print hang[9]  
  62.     word=choice(wordlist) #choice chooses a random item from a list  
  63.     main(['_']*len(word),list(word),9#blank is initialy only  
  64.                                       # ["-"]*len(word)  
  65.                                       #word is list(word),  
  66.                                       #because blank is list  
  67.                                       #and word must be list  
  68.                                       #to compare them  


а ето и другия файл hangman_lib.py(излъгах че е само в 60 реда, но лесно мога да събера целия файл на 2 много дълги реда:

  1. wordlist=["boy","man","kid","worm","word","disk",  
  2.           "hello","phone","desck","camera","python",  
  3.           "marker","notepad","hangman","piramid",  
  4.           "bullshit","hardcore","octopuss"]  
  5.   
  6. hang={  
  7.     0:  
  8. """ 
  9. _____ 
  10. |   | 
  11. |   o 
  12. |  /|\  
  13. |   | 
  14. |  /\\ 
  15. |__________""",  
  16.   
  17.     1:  
  18. """ 
  19. _____ 
  20. |   | 
  21. |   o 
  22. |  /|\  
  23. |   | 
  24. |  /  
  25. |__________""",  
  26.   
  27.     2:  
  28. """ 
  29. _____ 
  30. |   | 
  31. |   o 
  32. |  /|\  
  33. |   | 
  34. |   
  35. |__________""",  
  36.   
  37.     3:  
  38. """ 
  39. _____ 
  40. |   | 
  41. |   o 
  42. |   |\  
  43. |   | 
  44. |   
  45. |__________""",  
  46.   
  47.     4:  
  48. """ 
  49. _____ 
  50. |   | 
  51. |   o 
  52. |   |   
  53. |   | 
  54. |   
  55. |__________""",  
  56.   
  57.     5:  
  58. """ 
  59. _____ 
  60. |   | 
  61. |   o 
  62. |       
  63. |     
  64. |     
  65. |__________""",  
  66.   
  67.     6:  
  68. """ 
  69. _____ 
  70. |   | 
  71. |     
  72. |       
  73. |     
  74. |     
  75. |__________""",  
  76.   
  77.     7:  
  78. """ 
  79. _____ 
  80.  
  81. |   
  82. |    
  83. |    
  84. |   
  85. |__________""",  
  86.   
  87.     8:  
  88. """ 
  89.  
  90. |    
  91. |   
  92. |    
  93. |    
  94. |   
  95. |__________""",  
  96.   
  97.     9:  
  98. """ 
  99.  
  100.  
  101.  
  102.   
  103.  
  104.  
  105.  __________""",  
  106.  }  

Няма коментари: