Вопрос

Я только начал изучать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top