Главная страница
Навигация по странице:

  • Привет, мир!.upper() .>>> Привет, мир!.upper() ПРИВЕТ, МИР! Написание кода игры «Виселица» 137

  • Привет, мир!.upper().lower()

  • Привет, мир!.lower().upper()

  • Проверка допустимости предположения игрока

  • Предложение игроку сыграть заново

  • Обзор функций игры Это все функции, использованные в игре «Виселица». Вот их краткий обзор :• getRandomWord(wordList)

  • • displayBoard(missedLetters, correctLetters, secretWord)

  • • getGuess(alreadyGuessed)

  • Вызов функции displayBoard()

  • Ввод игроком угадываемой буквы

  • Проверка наличия буквы в секретном слове

  • Проверка — не победил ли игрок

  • Обработка ошибочных предположений

  • Проверка — не проиграл ли игрок

  • Завершение или перезагрузка игры

  • В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ

  • Увеличение числа угадываний

  • Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python


    Скачать 6.56 Mb.
    НазваниеInvent your owncomputer gameswith python
    Дата10.12.2022
    Размер6.56 Mb.
    Формат файлаpdf
    Имя файлаУчим Python, делая крутые игры 2018.pdf
    ТипДокументы
    #837554
    страница14 из 39
    1   ...   10   11   12   13   14   15   16   17   ...   39
    Строковые методы lower() и upper()
    Для иллюстрации действия, производимого методом, в интерактивной оболочке введите 'Привет, мир!'.lower() .
    >>>
    'Привет, мир!'.lower()
    'привет, мир!'
    Метод lower() возвращает строку, в которой все буквы строчные. Су- ществует также и обратный строковый метод upper(), который возвращает строку с прописными буквами. Попробуйте в интерактивной оболочке вве- сти 'Привет, мир!'.upper().
    >>>
    'Привет, мир!'.upper()
    'ПРИВЕТ, МИР!'

    Написание кода игры «Виселица»
    137
    Так как метод upper() возвращает строку, вызывать его следует строковой переменной.
    Теперь В интерактивной оболочке введите следующие команды:
    >>>
    'Привет, мир!'.upper().lower()
    'привет, мир!'
    Код 'Привет, мир!'upper() преобразуется в строку 'ПРИВЕТ, МИР!', а затем вызывается метод lower(). Он вернет строку 'привет, мир!', что и станет фи- налом преобразования.
    'Hello world!'.upper()
    .lower()
    'HELLO WORLD!'.lower()
    'hello world!'
    'привет, мир!'
    'ПРИВЕТ, МИР!'
    'Привет, мир!'
    Порядок следования методов важен. 'Привет, мир!'.lower().upper(), это не то же самое, что 'Привет, мир!'.upper().lower().
    >>>
    'Привет, мир!'.lower().upper()
    'ПРИВЕТ, МИР!'
    Преобразование будет выглядеть так:
    'Hello world!'.lower()
    .upper()
    'hello world!'.upper()
    'HELLO WORLD!'
    'Привет, мир!'
    привет, мир!
    'ПРИВЕТ, МИР!'
    Если строка хранится в переменной, то строковые методы можно вызы- вать следующим способом:
    >>>
    spam = 'Привет, мир!'
    >>>
    spam.upper()
    'ПРИВЕТ, МИР!'
    Этот код не изменяет значение переменной spam. Сама переменная spam сохраняет строку 'Привет, мир!'.

    138
    Глава 8
    Возвращаясь к программе «Виселица», метод lower() используется, когда игроку предлагается ввести предполагаемую букву.
    66. while True:
    67. print('Введите букву.')
    68. guess = input()
    69. guess = guess.lower()
    Теперь, если игрок введет прописную букву, функция getGuess() вернет эту букву в виде строчного символа.
    Завершение цикла while
    В строке 66 цикл while будет предлагать игроку ввести букву до тех пор, пока не будет введена ранее не предлагавшаяся буква.
    Условием цикла while выступает логическая переменная в значении True.
    Это значит, что единственным способом завершить цикл является выполне- ние инструкции break или выполнение инструкции return, которая обеспечи- вает выход не только из цикла, но и из функции.
    Внутренний код цикла предлагает игроку ввести букву, которая будет со- хранена в переменной guess. Если игрок ввел прописную букву, она будет пре- образована в строчную с помощью кода в строке 69.
    Инструкции elif
    Следующая часть кода игры «Виселица» содержит инструкции elif . Ин- струкция elif означает, что «Если это истинно, сделать так. А если выполня- ется другое условие, то сделать так. Если не выполняется ни одно условие, сделать вот так». Взгляните на следующий код:
    if catName == 'Пушок':
    print('Ваш котенок пушистенький.')
    elif catName == 'Рыжик':
    print('Ваш котенок рыженький.')
    else:
    print('Ваш котенок ни пушистенький и ни рыженький.')
    Если значение переменной catName эквивалентно строке 'Пушок', то усло- вие инструкции if истинно и блок if сообщает игроку, что его котенок пу-

    Написание кода игры «Виселица»
    139
    шистенький. Но, если условие ложно, Python проверяет следующее условие.
    Если переменной catName присвоено значение 'Рыжик', на экран выводится строка 'Ваш котенок рыженький.'. Если оба условия ложны, игроку сообщается, что его котенок ни пушистенький и ни рыженький.
    Инструкций elif может быть столько, сколько нужно.
    if catName == 'Пушок':
    print('Ваш котенок пушистенький.')
    elif catName == 'Рыжик':
    print('Ваш котенок рыженький.')
    elif catName == 'Лохматик':
    print('Ваш котенок лохматенький.')
    elif catName == 'Чудик':
    print('Ваш котенок чудной.')
    else:
    print('Ваш котенок ни пушистенький и ни рыженький и ни лохматенький и ни чудной.')
    Если условие одной инструкции elif истинно, выполняется код именно этой инструкции, затем происходит возврат к первой строке цикла. Таким об- разом, за один проход выполняется код одного и только одного программного блока конструкции if-elif-else. Инструкция else прекращает работу блока if
    , если больше нет необходимости проверять выполнение условий блока.
    Проверка допустимости предположения игрока
    Переменная guess содержит буквы, предложенные игроком. Программа должна удостовериться, что вводимые символы допустимы, это должна быть только одна буква, при этом не вводившаяся ранее. Если это условие не вы- полняется, цикл возвращается к началу и снова запрашивает букву.
    70. if len(guess) != 1:
    71. print('Пожалуйста, введите одну букву.')
    72. elif guess in alreadyGuessed:
    73. print('Вы уже называли эту букву. Назовите другую.')
    74. elif guess not in 'абвгдеежзийклмнопрстуфхцчшщъыьэюя':
    75. print('Пожалуйста, введите БУКВУ.')
    76. else:
    77. return guess

    140
    Глава 8
    В строке 70 проверяется, что введено не более одного символа, код в строке 72 проверяет, что предложенная буква не содержится в переменной alreadyGuessed
    , код в строке 74 проверяет, что введен символ стандартного русского алфавита.
    Если хотя бы одно условие не выполняется, игроку предлагается ввести другую букву.
    Если выполнены все условия, программа переходит к исполнению кода блока и возвращает значение предложенной буквы в строке 77.
    Напомню, что в конструкции if-elif-else исполняется только один про- граммный блок.
    Предложение игроку сыграть заново
    Функция playAgain() содержит лишь вызов функции print() и инструк- цию return.
    79. def playAgain():
    80. # Эта функция возвращает значение True, если игрок хочет сыграть заново; в противном случае возвращает False.
    81. print('Хотите сыграть еще? (да или нет)')
    82. return input().lower().startswith('д')
    Инструкция return завершает выполнение программы, но ее действие можно отменить. Рассмотрим подробнее, какие преобразования производит
    Python, если игрок ответил ДА.
    input()
    .lower().startswith('y')
    'YES'.lower()
    .startswith('y')
    'yes'.startswith('y')
    True д
    д д
    да
    ДА
    Функция playAgain() позволяет игроку ответить «Да» или «Нет» на пред- ложение еще одного раунда. Игрок должен ввести Да, да, Д или что-нибудь еще, начинающееся с буквы д, и это значение будет означать «Да». Если игрок ввел ДА, функция input() возвращает значение 'ДА'. Выражение 'ДА'.lower() возвращает строку в нижнем регистре (строчными буквами). То есть значе- ние 'ДА' превращается в 'да'.
    Но, кроме этого, производится еще и вызов метода startswith('д').
    Эта функция возвращает True, если вызывающая строка начинается с ука-

    Написание кода игры «Виселица»
    141
    занного параметра, или False, если это не так. Например, выражение 'да'.
    startwith('д')
    возвращает значение True.
    Вот и весь смысл этого выражения. Оно позволяет игроку ввести ответ, переводит его в строчную форму, проверяет, что ответ начинается с буквы д, и затем возвращает True или False.
    Замечу, что еще существует строковый метод endwith(
    некаяСтрока), кото- рый возвращает True, если вызывающая строка заканчивается строкой ука- занной в аргументе
    некаяСтрока, и False в противном случае. Метод endwith() в некотором смысле противоположен методу startwith().
    Обзор функций игры
    Это все функции, использованные в игре «Виселица». Вот их краткий обзор :
    • getRandomWord(wordList)
    случайным образом выбирает одну строку из списка. Так выбирается слово, которое будет угадывать игрок;
    • displayBoard(missedLetters, correctLetters, secretWord)
    отображает текущее состояние игры, показывает, сколько букв игрок уже пред- ложил для определения слова, и какие из них оказались ошибочными.
    Для корректной работы этой функции необходимы три параметра.
    Строковые переменные correctLetters и missedLetter для хранения букв, которые были предложены игроком и тех, которых не оказалось в секретом слове, а также строковая переменная secretWord, содержа- щая секретное слово, которое пытается угадать игрок. Функция не возвращает каких-либо значений;
    • getGuess(alreadyGuessed)
    проверяет, не содержится ли введенная игро- ком буква в строковой переменной alreadyGuessed. Функция возвра- щает букву, введенную игроком, если она допустима;
    • playAgain()
    спрашивает игрока, не хочет ли он сыграть еще раз. Функ- ция возвращает True, если игрок соглашается, или False, если отказы- вается.
    После описания функций со строки 85 начинается основная часть (тело) программы. Все, что выше этой строки, «всего лишь» описание функций и большой код инструкции присваивания для переменной HANGMAN_PICS.
    Игровой цикл
    Основная часть кода программы «Виселица» отображает на экране на- звание игры, содержит несколько переменных и запускает цикл while. В этом разделе рассмотрим пошаговое выполнение оставшейся части программного кода.

    142
    Глава 8 85. print('В И С Е Л И Ц А')
    86. missedLetters = ''
    87. correctLetters = ''
    88. secretWord = getRandomWord(words)
    89. gameIsDone = False
    Код в строке 85 вызывает функцию print(), которая выводит на экран за- головок игры в момент ее запуска. Затем строковой переменной missedLetters присваивается пустое значение, переменной correctLetters тоже присваива- ется пустое значение, так как игрок не предложил еще никаких букв.
    В строке 88 вызывается функция getRandomWord(words), которая выбирает случайным образом секретное слово из списка.
    Код в строке 89 присваивает переменной gameIsDone значение False. Код присвоит этой переменной значение True, когда поступит сигнал завершения игры, и предложит игроку сыграть заново.
    Вызов функции displayBoard()
    Оставшаяся часть программы состоит из цикла while. Условие цикла всег- да истинно, а это значит, что он будет выполняться бесконечно долго, до тех пор, пока не будет инициировано выполнение инструкции break. (Это проис- ходит в строке 126.)
    91. while True:
    92. displayBoard(missedLetters, correctLetters, secretWord)
    Код в строке 92 вызывает функцию displayBoard(), передавая ей значения трех переменных, установленных в строках 86, 87 и 88. В зависимости от того, сколько букв игрок угадал правильно и сколько раз ошибся, эта функция вы- водит на экран соответствующее изображение «повешенного».
    Ввод игроком угадываемой буквы
    Далее вызывается функция getGuess(), чтобы игрок мог ввести угадывае- мую букву.
    94. # Позволяет игроку ввести букву.
    95. guess = getGuess(missedLetters + correctLetters)

    Написание кода игры «Виселица»
    143
    В функцию передается параметр alreadyGuessed для определения — вво- дил игрок такую букву раньше или еще нет. Код в строке 95 конкатенирует строковые переменные missedLetters и correctLetters, а затем передает резуль- тат в качестве аргумента параметру alreadyGuessed.
    Проверка наличия буквы в секретном слове
    Если предложенная буква есть в секретном слове, она добавляется в ко- нец строковой переменной correctLetters.
    97. if guess in secretWord:
    98. correctLetters = correctLetters + guess
    Код в последней строке добавляет новое значение в переменную correctLetters
    Проверка — не победил ли игрок
    Как программе узнать, что игрок угадал все буквы, содержащиеся в секрет- ном слове? Итак, переменная correctLetters содержит все буквы, угаданные игроком правильно, а переменная secretWord — секретное слово. Но простую проверку missedLetters == correctLetters сделать невозможно. Если, например, секретное слово 'ворон', а correctLetters равно 'внро', значение выражения correctLetters == secretWord будет ложным, хотя игрок угадал все буквы .
    Единственно возможный путь — это произвести сравнение каждой бук- вы из correctLetters с буквами в переменной secretWord. Игрок побеждает тог- да и только тогда, если каждая буква из переменной secretWord содержится в переменной correctLetters.
    100. # Проверяет, выиграл ли игрок.
    101. foundAllLetters = True
    102. for i in range(len(secretWord)):
    103. if secretWord[i] not in correctLetters:
    104. foundAllLetters = False
    105. break
    Понятно, что если в переменной secretWord найдена буква, которой нет в переменной correctLetters, игрок не победил. Новая переменная foundAllLetters со значением True устанавливается в строке 101 до начала

    144
    Глава 8
    цикла. Цикл начинается в предположении, что все буквы секретного слова угаданы. Но в строке 104, в процессе выполнения цикла, значение перемен- ной foundAllLetters меняется на False, как только обнаружена первая буква из переменной secretWord, не содержащаяся в переменной correctLettrs.
    Если все буквы секретного слова обнаружены, игроку сообщается о его победе, а переменная gameIsDone принимает значение True.
    106. if foundAllLetters:
    107. print('ДА! Секретное слово - "' + secretWord + '"! Вы угадали!')
    108. gameIsDone = True
    Обработка ошибочных предположений
    В строке 109 начинается блок else.
    109. else:
    110. missedLetters = missedLetters + guess
    Напомним, что код этого блока выполняется, если условие цикла for лож- но. Но какое условие? Чтобы узнать это, наведите указатель на начало ключе- вого слова else и переместите его вверх. Вы увидите, что ключевое слово else располагается точно в той же позиции, что и if, в строке 97.
    97. if guess in secretWord:
    --
    пропуск--
    109. else:
    110. missedLetters = missedLetters + guess
    Таким образом, если условие в строке 97 (guess in secretWord) ложно, вы- полняется блок else.
    Неправильно угаданные буквы добавляются в строковую переменную missedLetters в строке 110. Это происходит также как в строке 98 с буквами, угаданными правильно.
    Проверка — не проиграл ли игрок
    Каждый раз, когда игрок вводит неправильную букву, она добавляет- ся в переменную missedLetters. Таким образом, длина значения переменной

    Написание кода игры «Виселица»
    145
    missedLetters
    (или в коде — len(missedLetters)) становится равна числу оши- бочных предположений.
    112. # Проверяет, превысил ли игрок лимит попыток и проиграл.
    113. if len(missedLetters) == len(HANGMAN_PICS) - 1:
    114. displayBoard(missedLetters, correctLetters, secretWord)
    115. print('Вы исчерпали все попытки!\nНе угадано букв: ' + str(len(missedLetters)) + ' и угадано букв: ' + str(len(correctLetters)) + '. Было загадано слово "' + secretWord + '".')
    116. gameIsDone = True
    Переменная HANGMAN_PICS содержит семь строк с ASCII-символами рисун- ка. Таким образом, если длина строки missedLetters равна len(HANGMAN_PICS) —
    1
    (то есть 6), игрок исчерпал лимит предположений. Если рисунок «пове- шенного» завершен — игрок проиграл. Напомню, HANGMAN_PICS[0] — первый элемент списка, а HANGMAN_PICS[6] — последний.
    Код в строке 115 выводит секретное слово, а строка 116 присваивает пе- ременной gameIsDone значение True.
    118. # Запрашивает, хочет ли игрок сыграть заново (только если игра завершена).
    119. if gameIsDone:
    120. if playAgain():
    121. missedLetters = ''
    122. correctLetters = ''
    123. gameIsDone = False
    124. secretWord = getRandomWord(words)
    Завершение или перезагрузка игры
    Вне зависимости от победы или проигрыша игра должна спросить игро- ка — хочет ли он сыграть снова. Функция playAgain() обрабатывает получен- ный ответ («Да» или «Нет») в строке 120.
    Если игрок хочет начать игру заново, значения переменных missedLetters и correctLetters надо обнулить, переменной gameIsDone присвоить значение
    False и выбрать новое секретное слово. После того как выполнение цикла while возвращается к началу, к строке 91, игровой интерфейс, отображаемый на экране, перезагружается и готов к новой игре.
    Если игрок не ввел ничего, что начинается с буквы д, при запросе — хочет ли он сыграть заново, условие в строке 120 становится ложным и выполня- ется блок else.

    125. else:
    126. break
    Инструкция break приводит к выполнению первой инструкции после цикла. Но, так как после цикла нет исполняемых инструкций, происходит завершение работы программы.
    Заключение
    «Виселица» — наиболее продвинутая игра из числа рассмотренных. В про- цессе ее создания вы изучили несколько новых понятий. По мере усложнения игр неплохо было бы составлять наброски блок-схем того, что должно вы- полняться в программе.
    Список — это программный объект, который может содержать другие объекты. Методы — это функции, привязанные к какому-либо объекту. Спи- ски содержат встроенный метод append(). Для строк существуют следующие методы: lower(), upper(), split(), startswith() и endswith(). Остальная часть книги познакомит вас со многими другими методами и типами данных.
    Инструкция elif позволяет добавить условия выполнения «или-еще- если» в середину конструкции if-else.

    Доработка игры «Виселица»
    147
    9
    ДОРАБОТКА ИГРЫ «ВИСЕЛИЦА»
    Теперь, когда готова основа игры «Ви- селица» , давайте рассмотрим некото- рые возможности расширения ее функ- циональности. В этой главе вы создадите несколько групп секретных слов и добавите возможность изменения уровня сложности игры.
    В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ:
    • Тип данных «Словарь»
    • Пары ключ-значение
    • Методы словаря keys()
    и values()
    • Множественное назначение переменных
    Увеличение числа угадываний
    После того как вы сыграли в игру «Виселица» несколько раз, вы, возмож- но, подумали, что шесть попыток для угадывания недостаточно для разгадки многих слов.
    Число попыток можно легко увеличить, добавив строки в список HANGMAN_
    PICS
    Сохраните файл hangman.py под именем hangman2.py. Для расширения списка, содержащего ASCII-символы для прорисовки «висельника», добавьте следующие строки, начиная со строки 37:

    148
    Глава 9 37. ===''', '''
    38. +---+
    39. [O |
    40. /|\ |
    41. / \ |
    42. ===''', '''
    43. +---+
    44. [O] |
    45. /|\ |
    46. / \ |
    47. ===''']
    Этот код добавляет два новых многострочных значения в список HANGMAN_
    PICS
    , одна строка служит для прорисовки левого уха «висельника», другая для прорисовки обоих ушей. Программа сообщает игроку о его проигрыше на основании значения выражения len(missedLetters ) == len(HANGMAN_PICS) — 1, поэтому в других изменениях необходимости нет. Остальная часть програм- мы будет прекрасно работать с новым списком.
    1   ...   10   11   12   13   14   15   16   17   ...   39


    написать администратору сайта