Главная страница

Учим 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
страница15 из 39
1   ...   11   12   13   14   15   16   17   18   ...   39
Словари
В первой версии программы «Виселица» мы использовали список с на- званиями животных, но вы можете изменить список слов в строке 48. Напри- мер, вместо животных можно использовать цвета.
48. words = 'красный оранжевый желтый зеленый синий голубой фиолетовый белый черный коричневый'.
split()
Или геометрические фигуры.
48. words = 'квадрат треугольник прямоугольник круг эллипс ромб трапеция параллелограмм пятиугольник шестиугольник восьмиугольник'.split()
Или фрукты.
48. words = 'яблоко апельсин лимон лайм груша мандарин виноград грейпфрут персик банан абрикос манго банан нектарин'.split()

Доработка игры «Виселица»
149
Внеся некоторые изменения, вы можете доработать код так, что игра «Ви- селица» будет использовать несколько наборов слов, таких как животные, цвета, фигуры или фрукты.
Программа будет сообщать игроку, какой набор использован для выбора секретного слова.
Чтобы произвести эти изменения, понадобится новый тип данных, кото- рый называется словарем . Словарь, также как и список, — это набор значе- ний. Но вместо доступа к элементам по целочисленным индексам в словаре возможен доступ к элементам по индексам произвольного типа. В словаре эти индексы называются ключами .
При работе со словарем используются фигурные скобки {} вместо ква- дратных [].
В качестве примера в интерактивной оболочке наберите следующее:
>>>
spam = {'привет':'Привет всем, как дела?', 4:'бекон', 'курс':9999 }
Пара величин, разделенная двоеточием внутри фигурных скобок, на- зывается парой ключ-значение. Левая часть пары (перед двоеточием) — это
ключ, правая часть (после двоеточия) — значение ключа. Получить доступ к отдельным значениям можно с помощью ключей.
Чтобы попрактиковаться, выполните в интерактивной оболочке следую- щий пример:
>>>
spam = {'привет':'Привет всем, как дела?', 4:'бекон', 'курс':9999 }
>>>
spam['привет']
'Привет всем, как дела?'
>>>
spam[4]
'бекон'
>>>
spam['курс']
9999
Внутри квадратных скобок можно помещать не только целочисленные значения, но и строковые. В приведенном примере, в качестве ключей слова- ря spam, использованы величины целого типа — 4 и строкового — 'курс'.
Определение размера словаря с помощью функции len()
С помощью функции len() можно определить количество пар ключ- значение, сохраненных в словаре.

150
Глава 9
Для примера наберите в интерактивной оболочке следующее:
>>>
stuff = {'привет':'Привет всем, как дела?', 4:'бекон', 'курс':9999 }
>>>
len(stuff)
3
Функция len() вернула целочисленное значение 3, равное количеству пар ключ-значение в словаре.
Различия между списком и словарем
Одно отличие словаря от списка уже было рассмотрено — это возмож- ность использования в качестве ключей значений произвольного типа, а не только целых чисел. Напомню, что 0 и '0' — разные величины, т.е. это будут разные ключи.
Введите в интерактивной оболочке следующий код:
>>>
spam = {'0':'строка', 0:'число'}
>>>
spam[0]
'число'
>>>
spam['0']
spam['0']
Словари, подобно спискам, можно обрабатывать циклически, используя ключи в цикле for.
Чтобы посмотреть, как это работает, введите в интерактивной оболочке следующие команды:
>>>
favorites = {'фрукты':'апельсины', 'животные':'коты', 'число':42}
>>>
for k in favorites:
print(k)
фрукты животные число
>>>
for k in favorites:
print(favorites[k])
апельсины коты
42

Доработка игры «Виселица»
151
Ключи и значения могут выводиться в различном порядке, потому что слова- ри, в отличие от списков, не упорядочены (не ранжированы). Первым элементом списка с именем listStuff, будет listStuf[0]. Но в словаре нет первого элемента, потому что нет какого-нибудь порядка расположения элементов. В приведенном коде Python просто выбрал тот порядок, в котором элементы хранились в памя- ти, нет никаких гарантий, что в следующий раз порядок будет тем же.
В интерактивной оболочке наберите следующее:
>>>
favorites1 = {'фрукт':'апельсины', 'число':42, 'животное':'кот'}
>>>
favorites2 = {'животное':'кот', 'число':42, 'фрукт':'апельсины'}
>>>
favorites1 == favorites2
True
Выражение favorites1 == favorites2 истинно потому, что словари не упо- рядочены и считаются эквивалентными, если состоят из одинаковых пар ключ-значение. А списки с одинаковыми значениями элементов, но разным порядком их следования, равны не будут.
Для демонстрации этих различий наберите в интерактивной оболочке следующее:
>>>
listFavs1 = ['апельсины', 'коты', 42]
>>>
listFavs2 = ['коты', 42, 'апельсины']
>>>
listFavs1 == listFavs2
False
Выражение listFavs1 == listFavs2 ложно, так как содержимое списков расположено в разном порядке.
Методы словаря keys() и values()
Словари содержат два полезных метода — keys() и values() . Эти методы возвращают значения, тип которых называется dict_keys и dict_values, соот- ветственно. Подобно большинству ранжированных объектов, данные этих типов возвращаются в форме списка функцией list().
Наберите следующий код:
>>>
favorites = {'фрукт':'апельсин', 'животное':'кот', 'число':42}
>>>
list(favorites.keys())
['фрукт', 'животное', 'число']

152
Глава 9
>>>
list(favorites.values())
['апельсин', 'кот', 42]
Используя методы keys() или values() в функции len(), можно получить список ключей или значений словаря.
Использование словаря слов в игре «Виселица»
Давайте изменим код в новой версии игры «Виселица», добавив поддерж- ку разных наборов секретных слов. Во-первых, заменим значение перемен- ной words, создав словарь, в котором ключи представлены строками, а зна- чения — списками строк. Строковый метод split() вернет список строк, по одному слову в каждой строке.
48. words = {'Цвета':'красный оранжевый желтый зеленый синий голубой фиолетовый белый черный коричневый'.split(),
49. 'Фигуры':'квадрат треугольник прямоугольник круг эллипс ромб трапеция параллелограмм пятиугольник шестиугольник восьмиугольник'.split(),
50. 'Фрукты':'яблоко апельсин лимон лайм груша мандарин виноград грейпфрут персик банан абрикос манго банан нектарин'.split(),
51. 'Животные':'аист бабуин баран барсук бык волк зебра кит коза корова кошка кролик крыса лев лиса лось медведь мул мышь норка носорог обезьяна овца олень осел панда пума скунс собака сова тигр тюлень хорек ящерица'.split()}
Строки 48–51 — все еще одна инструкция присваивания. Инструкция за- канчивается закрывающей фигурной скобкой в строке 51.
Случайный выбор из списка
Функция choice() модуля random принимает в качестве аргумента список и возвращает из него случайное значение. Это похоже на то, что ранее делала функция getRandomWord().
В новой версии функции getRandomWord() будет использована функция choice()
Чтобы увидеть, как работает функция choice(), В интерактивной оболоч- ке введите следующие команды:
>>>
import random
>>>
random.choice(['кот', 'собака', 'мышь'])

Доработка игры «Виселица»
153
'мышь'
>>>
random.choice(['кот', 'собака', 'мышь'])
'кот'
Подобно тому, как функция randint() возвращает случайное целое число, функция choice() возвращает случайное значение из списка.
Изменения функции getRandomWord() таковы, что теперь ее параметр — словарь, состоящий из списков строк, а не просто список строк.
Вот как выглядела оригинальная функция:
40. def getRandomWord(wordList):
41. # Эта функция возвращает случайную строку из переданного списка.
42. wordIndex = random.randint(0, len(wordList) - 1)
43. return wordList[wordIndex]
А вот как выглядит код этой функции после изменения:
53. def getRandomWord(wordDict):
54. # Эта функция возвращает случайную строку из переданного словаря списков строк, а также ключ.
55. # Во-первых, случайным образом выбираем ключ из словаря:
56. wordKey = random.choice(list(wordDict.keys()))
57.
58. # Во-вторых, случайным образом выбираем слово из списка ключей в словаре:
59. wordIndex = random.randint(0, len(wordDict[wordKey]) - 1)
Имя wordList изменено на wordDict для большей наглядности.
Теперь вместо случайного выбора слова из списка строк сначала слу- чайно выбирается ключ из словаря wordDict посредством вызова random.
choice()
И вместо возвращения строки wordList[wordIndex] функция возвращает список с двумя элементами.
Первый элемент — это wordDict[wordKey][wordIndex].
Второй элемент — wordKey.
Выражение wordDict[wordKey][wordIndex] в строке 61 может выглядеть сложным, но его действие понять очень просто.
Во-первых, представим, что переменной wordKey присвоено значе- ние 'Фрукты', а переменной wordIndex — значение 5. Тогда преобразование wordDict[wordKey][wordIndex]
будет выглядеть так:

154
Глава 9
wordDict[wordKey][wordIndex]
wordDict['Fruits'][wordIndex]
['apple', 'orange', 'lemon', 'lime', 'pear', 'watermelon', 'grape', 'grapefruit',
'cherry', 'banana', 'cantaloupe', 'mango', 'strawberry', 'tomato'][wordIndex]
['apple', 'orange', 'lemon', 'lime', 'pear', 'watermelon', 'grape', 'grapefruit',
'cherry', 'banana', 'cantaloupe', 'mango', 'strawberry', 'tomato'][5]
'watermelon'
'Фрукты'
'мандарин'
['яблоко', 'апельсин', 'лимон', 'лайм', 'груша', 'мандарин', 'виноград', 'грейпфрут',
'персик', 'банан', 'абрикос', 'манго', 'банан', 'нектарин'][wordIndex]
['яблоко', 'апельсин', 'лимон', 'лайм', 'груша', 'мандарин', 'виноград', 'грейпфрут',
'персик', 'банан', 'абрикос', 'манго', 'банан', 'нектарин'][5]
В этом случае элемент списка, возвращенный функцией, — это строка 'мандарин'
. (Напомню, что индексы начинаются с 0, поэтому индекс [5] от- сылает к шестому элементу списка, а не к пятому.)
Так как функция getRandomWord() теперь возвращает список из двух эле- ментов, а не строку, то и значение переменной secretWord будет списком, а не строкой. Чтобы сохранить эти значения в двух разных переменных, можно использовать множественное присваивание, которое мы рассмотрим далее в этой главе.
Удаление элементов списка
Инструкция del удаляет элементы с указанными индексами из списка .
Так как del — инструкция, а не функция и не оператор, она указывается без круглых скобок и не имеет возвращаемого значения. Понаблюдайте, как ра- ботает эта инструкция, используя следующий код:
>>>
animals = ['аксолотль', 'аргонавт', 'астрильд', 'альберт']
>>>
del animals[1]
>>>
animals
['аксолотль', 'астрильд', 'альберт']
Отмечу, что когда удаляется элемент с индексом 1, элемент, имевший ин- декс 2, становится элементом с индексом 1, элемент, имевший индекс 3, при- обретает индекс 2 и так далее . Вышеописанная процедура удаляет только один элемент и, соответственно, уменьшает количество индексов.
Выражение del animals[1] можно вводить снова и снова, удаляя по одно- му элементу списка.

Доработка игры «Виселица»
155
>>>
animals = ['аксолотль', 'аргонавт', 'астрильд', 'альберт']
>>>
del animals[1]
>>>
animals
['аксолотль', 'астрильд', 'альберт']
>>>
del animals[1]
>>>
animals
['аксолотль', 'альберт']
>>>
del animals[1]
>>>
animals
['аксолотль']
Длина списка HANGMAN_PICS — это число сделанных игроком предположе- ний. Удаляя строки из этого списка, можно сокращать допустимое количе- ство предположений и, тем самым, усложнять игру.
Добавьте следующие строки в код вашей программы, между строкой print('В И С Е Л И Ц А')
и строкой missedLetters = ''.
103. print('В И С Е Л И Ц А')
104.
105. difficulty = ''
106. while difficulty not in 'ЛСТ':
107. print('Выберите уровень сложности: Л - Легкий, С - Средний, Т - Тяжелый')
108. difficulty = input().upper()
109. if difficulty == 'С':
110. del HANGMAN_PICS[8]
111. del HANGMAN_PICS[7]
112. if difficulty == 'Т':
113. del HANGMAN_PICS[8]
114. del HANGMAN_PICS[7]
115. del HANGMAN_PICS[5]
116. del HANGMAN_PICS[3]
117.
118. missedLetters = ''
Этот код удаляет элементы списка HANGMAN_PICS, делая его короче, в зависи- мости от выбранного уровня сложности игры. Чем выше уровень сложности, тем больше элементов удаляется из списка HANGMAN_PICS, сокращая возмож- ное количество попыток угадывания. Остальная часть кода игры «Виселица» использует длину этого списка для определения момента вывода сообщения игроку об исчерпании количества попыток.

156
Глава 9
Множественное присваивание
Множественное присваивание — это возможность назначения нескольким переменным различных значений в одной строке. Для множественного при- сваивания запишите переменные через запятую и присвойте им список значе- ний. Ниже представлен пример записи, введите ее в интерактивной оболочке:
>>>
fruit, animal, number = ['апельсин', 'кот', 42]
>>>
fruit
'апельсины'
>>>
animal
'кот'
>>>
number
42
Исполнение кода, приведенного в примере, равноценно выполнению сле- дующих операций присваивания:
>>>
fruit = ['апельсин', 'кот', 42][0]
>>>
animal = ['апельсин', 'кот', 42][1]
>>>
number = ['апельсин', 'кот', 42][2]
Количество строк с именами переменных в левой части инструкции при- сваивания должно быть эквивалентно количеству элементов, указанных в правой части. Python автоматически присвоит значение первого элемента списка первой переменной, второй переменной — значение второго элемента и так далее. Если число переменных будет отлично от числа элементов спи- ска, Python интерпретирует это как ошибку, вот так:
>>>
fruit, animal, number, text = ['апельсин', 'кот', 42, 10, 'привет']
Traceback (most recent call last):
File "
", line 1, in
fruit, animal, number, text = ['апельсин', 'кот', 42, 10, 'привет']
ValueError: too many values to unpack
>>>
fruit, animal, number, text = ['апельсин', 'кот']
Traceback (most recent call last):
File "
", line 1, in
fruit, animal, number, text = ['апельсин', 'кот']
ValueError: need more than 2 values to unpack

Доработка игры «Виселица»
157
Изменение строк 120 и 157 в коде игры «Виселица» для использова- ния множественного присваивания значений, возвращаемых функцией getRandomWord()
выглядит следующим образом:
119. correctLetters = ''
120. secretWord
, secretSet = getRandomWord(words)
121. gameIsDone = False
--
пропуск--
156. gameIsDone = False
157. secretWord
, secretSet = getRandomWord(words)
158. else:
159. break
В строке 120 возвращаемые функцией getRandomWord(word) значения при- сваиваются двум переменным — secretWord и secretSet. Код в строке 157 дела- ет то же самое, когда игрок решает сыграть заново.
Выбор игроком категории слов
Последнее изменение, которое необходимо сделать — это сообщить игро- ку, к какому набору принадлежит слово для угадывания. Чтобы игрок знал, что секретное слово — это животное, цвет, фигура или фрукт. Ниже показан первоначальный код:
91. while True:
92. displayBoard(missedLetters, correctLetters, secretWord)
В новой версии добавьте строку 124, чтобы код выглядел так:
123. while True:
124.
print('Секретное слово из набора: ' + secretSet)
125. displayBoard(missedLetters, correctLetters, secretWord)
На этом изменения в программе «Виселица» заканчиваются. Вместо про- стого списка строковых переменных секретное слово выбирается из несколь- ких различных списков. Программа сообщает игроку, какой набор слов ис- пользован для выбора секретного слова. Попробуйте сыграть в новой версии.
Вы можете легко изменить словарь слов, начинающийся в строке 48, чтобы еще увеличить число наборов слов.

Заключение
Написание кода игры «Виселица» завершено. В этой главе вы изучили не- сколько новых понятий, добавляя при этом в игру новые возможности. Даже написав программу, вы можете расширять ее функционал по мере изучения
Python.
Словари похожи на списки, за исключением того, что словари могут ис- пользовать индексы произвольного типа, а не только целочисленные значе- ния. Индексы словарей называются ключами. Многозначное присваивание — это рациональный способ присвоения различным переменным, значений, помещенных в список.
Игра «Виселица» стала значительно более продвинутой по сравнению с предыдущей версией. Теперь вам знакомы основные концептуальные поня- тия, необходимые при написании программ: переменные, циклы, функции, типы данных — список и словарь. Написание последующих программ этой книги по-прежнему будет сложной задачей, но вы завершили самую крутую часть восхождения!

Игра «Крестики-нолики»
159
10
ИГРА «КРЕСТИКИ-НОЛИКИ»
В этой главе представлена игра
«Крестики-нолики». Обычно в нее играют два человека. Один игрок рису- ет крестики, другой — нолики. Игроки по очереди размещают свои знаки. Если игрок разместил на игровом поле три своих знака подряд — в один ряд, в один столбец или по диаго- нали, — он побеждает. Если поле заполнено, но ни один игрок не выиграл, игра заканчивается ничьей.
Эта глава не богата новыми концепциями. Пользователь будет играть против простого искусственного интеллекта, который мы создадим, исполь- зуя уже имеющиеся навыки программирования. Искусственный интеллект
(ИИ) — это компьютерная программа, способная разумно отвечать на дей- ствия игрока. ИИ, играющий в «Крестики-нолики», не слишком сложный: в действительности, это буквально несколько строк программного кода.
Давайте начнем с рассмотрения примера выполнения программы.
Игрок производит действие, вводя номер клетки, которую он хочет за- нять. Для облегчения запоминания порядка нумерации клеток пронумеруем их в том же порядке, что и цифровая клавиатура вашего компьютера, как показано на рис. 10.1.
2 8
5 1
7 4
3 9
6
1   ...   11   12   13   14   15   16   17   18   ...   39


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