21 декември 2008

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

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

hangman.py:


#!/usr/bin/env python
#-*- coding: utf-8 -*-

from random import choice
from hangman_lib import hang,wordlist

def find_index(word,char):
"""find all the positions of char in word"""
index_list=[]
for i in range(len(word)):
if word[i]==char:
index_list.append(i)
return index_list

def replace_letter(blank,word,char):
"""insert char in the positions, where char apears in word"""
index_list=find_index(word,char)
for i in index_list:
blank[i]=char
return blank

def inp():
"""validate input, only 1 letter per turn.
Also, some recurtion-foo at the end :D"""
i=raw_input(u"вход=>".encode('utf-8'))
if len(i)==1:
return i
else:
print "one letter at a time"
return inp()

def win(blank, word):
"""check if we win"""
if blank == word:
return True
else:
return False

def main(blank,word,lives):
"""main function, some more recurtion-foo here :D"""
print blank
if lives >0:
char=inp()
if char in word:
blank=replace_letter(blank,word,char)
if win(blank,word):
print "you win"
print word
else:
main(blank,word,lives) #recurse with new blank
else:
print hang[lives-1] #hang is the dict with the graphics
print 'you have %s lives left' %(lives-1)
main(blank,word,lives-1) #recurse with one live less
else:
print hang[0]
print "you lose!"
print word

if __name__=='__main__':
print hang[9]
word=choice(wordlist) #choice chooses a random item from a list
main(['_']*len(word),list(word),9) #blank is initialy only
# ["-"]*len(word)
#word is list(word),
#because blank is list
#and word must be list
#to compare them


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


wordlist=["boy","man","kid","worm","word","disk",
"hello","phone","desck","camera","python",
"marker","notepad","hangman","piramid",
"bullshit","hardcore","octopuss"]

hang={
0:
"""
_____
| |
| o
| /|\
| |
| /\\
|__________""",

1:
"""
_____
| |
| o
| /|\
| |
| /
|__________""",

2:
"""
_____
| |
| o
| /|\
| |
|
|__________""",

3:
"""
_____
| |
| o
| |\
| |
|
|__________""",

4:
"""
_____
| |
| o
| |
| |
|
|__________""",

5:
"""
_____
| |
| o
|
|
|
|__________""",

6:
"""
_____
| |
|
|
|
|
|__________""",

7:
"""
_____
|
|
|
|
|
|__________""",

8:
"""

|
|
|
|
|
|__________""",

9:
"""






__________""",
}

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