Ищу способы улучшить свой код палача
-
05-09-2019 - |
Вопрос
Я только начал изучать Python и решил сделать игру про палача.Работает хорошо, но мне было интересно, можно ли сделать какую-нибудь оптимизацию или способы очистки кода.Кроме того, если бы кто-нибудь мог порекомендовать проект, которым я мог бы заняться в дальнейшем, это было бы здорово.
import sys
import codecs
import random
def printInterface(lst, attempts):
""" Prints user interface which includes:
- hangman drawing
- word updater """
for update in lst:
print (update, end = '')
if attempts == 1:
print ("\n\n\n\n\n\n\n\n\n\n\n\t\t _____________")
elif attempts == 2:
print ("""
|
|
|
|
|
|
|
|
|
______|______""")
elif attempts == 3:
print ("""
______
|
|
|
|
|
|
|
|
|
______|______""")
elif attempts == 4:
print ("""
______
| |
| |
(x_X) |
|
|
|
|
|
|
______|______""")
elif attempts == 5:
print ("""
______
| |
| |
(x_X) |
| |
| |
| |
|
|
|
______|______""")
elif attempts == 6:
print ("""
______
| |
| |
(x_X) |
| |
/| |
| |
|
|
|
______|______""")
elif attempts == 7:
print ("""
______
| |
| |
(x_X) |
| |
/|\ |
| |
|
|
|
______|______""")
elif attempts == 8:
print ("""
______
| |
| |
(x_X) |
| |
/|\ |
| |
/ |
|
|
______|______""")
elif attempts == 9:
print ("""
______
| |
| |
(x_X) |
| |
/|\ |
| |
/ \ |
|
|
______|______""")
def main():
try:
wordlist = codecs.open("words.txt", "r")
except Exception as ex:
print (ex)
print ("\n**Could not open file!**\n")
sys.exit(0)
rand = random.randint(1,5)
i = 0
for word in wordlist:
i+=1
if i == rand:
break
word = word.strip()
wordlist.close()
lst = []
for h in word:
lst.append('_ ')
attempts = 0
printInterface(lst,attempts)
while True:
guess = input("Guess a letter: ").strip()
i = 0
for letters in lst:
if guess not in word:
print ("No '{0}' in the word, try again!".format(guess))
attempts += 1
break
if guess in word[i] and lst[i] == "_ ":
lst[i] = (guess + ' ')
i+=1
printInterface(lst,attempts)
x = lst.count('_ ')
if x == 0:
print ("You win!")
break
elif attempts == 9:
print ("You suck! You iz ded!")
break
if __name__ == '__main__':
while True:
main()
again = input("Would you like to play again? (y/n): ").strip()
if again.lower() == "n":
sys.exit(1)
print ('\n')
Решение
Первая идея:ASCII-искусство
Особенностями Python являются синтаксис регулярных выражений и range()
функция, а также [xxx for yyy in zzz]
заполнитель массива.
import re
def ascii_art(attempt):
return re.sub(r'\d', '', re.sub('[0{0}].' \
.format(''.join([str(e) for e in range(attempt + 1, 10)])), ' ', """
3_3_3_3_3_3_
4| 2|
4| 2|
4(4x4_4X4) 2|
5| 2|
6/5|7\ 2|
5| 2|
8/ 9\ 2|
2|
2|
1_1_1_1_1_1_1|1_1_1_1_1_1_
"""))
for i in range(1, 10):
print(ascii_art(i))
Вторая идея:петли
Использовать enumerate
для цикла чтения слов.Использовать
for attempt in range(1, 10):
# inside main loop
...
print ('you suck!')
в качестве основного цикла.Оператор break
следует использовать с осторожностью, а не в качестве замены for
!
Если я что-то не упустил, структура
for letters in lst:
if guess not in word:
...
break
if guess in word[i]:
...
будет более прозрачным, так как
if guess not in word:
...
else:
index = word.find (guess)
...
Другие советы
Я не пробовал код, но вот несколько случайных советов:
Попробуйте отформатировать свой код в соответствии с ПКП 8 (использовать
i += 1
вместоi+=1
).PEP 8 — это стандартное руководство по стилю для Python.Использовать
lst = ['_ '] * len(word)
вместо цикла for.
Использовать перечислять как в:
for i, word in enumerate(wordlist)
вместо того, чтобы вручную отслеживать
i
в петле.Режим открытия файлов по умолчанию:
'r'
, нет необходимости это указывать.Ты используешьcodecs.open
вместо встроенногоopen
чтобы вернуть строки Unicode?Кроме того, попробуйте перехватить более конкретное исключение, котороеException
-- вероятноIOError
.
Я бы использовал список вместо if..оператор else в printInterface.