Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python
Скачать 6.56 Mb.
|
206 Глава 11 54. 55. guessesTaken = 1 56. while guessesTaken <= MAX_GUESS: Внутри бесконечного цикла находится секретное число из функции getSecretNum() . Это секретное число присваивается переменной secretNum. Помните, что значение secretNum является строкой, а не целым числом. Используя интерполяцию строк вместо конкатенации, код в строке 53 со- общает игроку, сколько в секретном числе цифр. Код в строке 55 присваи- вает переменной guessesTaken значение 1, отмечая это как первую попытку. Код в строке 56 содержит новый цикл while, выполняющийся, пока игроку доступны попытки. На языке кода это значит, что guessesTaken меньше или равно значению MAX_GUESS. Обратите внимание, что цикл while в строке 56 находится внутри другого цикла while, который был запущен в строке 51. Такие циклы внутри циклов называются вложенными . Инструкции break или continue (как break в строке 66) будут прерывать или продолжать только вложенный цикл, но ни один из внешних циклов. Получение предположения игрока Переменная guess содержит предположение игрока, возвращенное функ- цией input(). Код продолжает цикл, спрашивая игрока, пока тот не введет допустимое значение. 57. guess = '' 58. while len(guess) != NUM_DIGITS or not isOnlyDigits(guess): 59. print('Попытка №%s: ' % (guessesTaken)) 60. guess = input() Допустимое предположение содержит только цифры, причем столько же цифр, сколько и секретное число. Цикл while, который начинается в строке 58, проверяет допустимость введенного значения. Переменной guess присвоена пустая строка в строке 57, поэтому, чтобы убедится, что интерпретатор перейдет внутрь цикла к строке 59, условие цикла while в строке 58 при первой проверке ложно. Получение подсказок в зависимости от предположения игрока После того как интерпретатор пройдет цикл while, который был запущен в строке 58, в переменную guess помещается допустимая предположение. Те- Дедуктивная игра «Холодно-горячо» 207 перь программа передает значения переменных guess и secretNum функции getClues() 62. print(getClues(guess, secretNum)) 63. guessesTaken += 1 В строке 62 программа возвращает строку подсказок, которые сообща- ются игроку. Код в строке 63 увеличивает значение переменной guessesTaken с помощью расширенного оператора присваивания, используемого для до- бавления. Проверка победы или поражения игрока Теперь выясним, победил игрок или проиграл. 65. if guess == secretNum: 66. break 67. if guessesTaken > MAX_GUESS: 68. print('Попыток больше не осталось. Я загадал число %s.' % (secretNum)) Если переменная guess имеет то же значение, что и secretNum, то игрок правильно угадал секретное число, и код в строке 66 прерывает цикл while, который был запущен в строке 56. Если значения отличаются, то выполнение продолжается до строки 67, где программа проверяет, закончились ли у игро- ка попытки. Если у игрока остались попытки, интерпретатор перемещается к циклу while в строке 56, позволяя игроку осуществить дополнительную попытку. Если у игрока заканчиваются попытки (или программа прерывает цикл с по- мощью инструкции break в строке 66), интерпретатор пропускает цикл и пе- реходит к строке 70. Предложение сыграть снова Код в строке 70 спрашивает игрока, хочет ли он сыграть снова. 70. print('Хотите сыграть еще раз? (да или нет)') 71. if not input().lower().startswith('д'): 72. break Ответ игрока, возвращаемый с помощью функции input(), содержит ме- тод lower(), вызванный в нем, а затем вызывается метод startswith(), чтобы проверить, начинается ли ответ игрока с буквы д. Если он не начинается с д, программа прерывает цикл while, который был запущен в строке 51. Посколь- ку после этого цикла больше нет кода, программа завершает работу. Если же ответ начинается с д, программа не запускает инструкцию break, и интерпретатор переходит к строке 51. Затем программа генерирует новое секретное число, чтобы игрок мог начать новую игру. Заключение Игру «Холодно-горячо» просто написать, но в ней бывает сложно побе- дить. Впрочем, если вы продолжите играть, то, в конце концов, обнаружи- те лучшие способы угадывать, используя подсказки, которые дает вам игра. Очень напоминает то, как вы лучше овладеваете программированием, чем больше занимаетесь им. В этой главе были представлены несколько новых функций и методов — shuffle() , sort() и join() — вместе с несколькими удобными сокращениями кода. Расширенные операторы присваивания требуют меньше усилий по на- бору кода для изменения относительного значения переменной; например, выражение spam = spam + 1 можно сократить до spam += 1. С помощью интер- поляции строк вы можете сделать код более удобным для чтения, поместив %s (спецификатор преобразования) внутрь строки вместо использования массы операций по конкатенации строк. В главе 12 мы не будем заниматься программированием, а изучим сле- дующие понятия — декартова система координат и отрицательные числа. Они понадобятся нам при разработке игр в последующих главах этой книги. Эти математические концепции используются не только в создаваемых нами играх «Охотник за сокровищами», «Реверси» и «Ловкач», но и во многих дру- гих. Даже если вы уже знакомы с этими понятиями, бегло просмотрите главу 12, чтобы немного освежить информацию. Декартова система координат 209 12 ДЕКАРТОВА СИСТЕМА КООРДИНАТ В этой главе мы рассмотрим простые математические понятия, которые бу- дем использовать. В двумерных (или 2D, от английского 2-dimensional) играх гра- фические элементы на экране могут пере- мещаться влево, вправо, вверх или вниз. Для таких игр нужен способ преобразования позиции на экране в целые числа, которыми программа может опери- ровать. Вот где пригодится декартова система координат . Координаты — это числа, которые представляют собой определенную позицию на экране. Мы можем хранить их как целые числа в переменных нашей программы. В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ: • Декартова система координат • Оси x и y • Отрицательные числа • Пиксели • Коммутативное свойство сложения • Абсолютные значения и функция abs() Сетки и декартовы координаты Если мы говорим о шахматах, распространенный способ обращения к конкретным позициям на шахматной доске — обозначение каждой строки и столбца буквами и цифрами. На рис. 12.1 показана шахматная доска с мар- кированными строками и столбцами. 210 Глава 12 Ось x Ось y Рис. 12.1. Пример шахматной доски с черным конем на а4 и белым конем на е6 Координата для клетки на шахматной доске представляет собой комби- нацию строки и столбца. Белый конь на рис. 12.1 расположен в позиции e6, так как он находится в столбце e и строке 6, а черный конь — в позиции a4, поскольку это столбец a и строка 4. Шахматную доску можно представить как декартову систему координат. Используя метки строки и столбца, вы получите координату, которая пред- назначена для одной и только одной клетки на доске. Если вы знаете о де- картовой системе координат из школьных уроков математики, то вам, навер- ное, известно, что для отсчета как строк, так и столбцов используются числа. Шахматная доска с использованием числовых координат будет выглядеть, как показано на рис. 12.2. Ось x Ось y Рис. 12.2. Та же шахматная доска, но с числовыми координатами строк и столбцов Числа слева направо (по столбцам) принадлежат оси x . Числа снизу вверх (по рядам) — оси y . Координаты всегда задаются координатой x на первом месте, Декартова система координат 211 за которой следует координата y . На рис. 12.2 координата x белого коня равна 5, а координата y — 6, поэтому позиция белого коня обозначается координатами (5, 6), а не (6, 5). Аналогично черный конь расположен в позиции с координатами (1, 4), а не (4, 1), так как координата x черного коня равна 1, а координата y — 4. Обратите внимание: чтобы занять позицию белого коня, черному коню нужно переместиться на две клетки вверх и на четыре вправо. Но необяза- тельно смотреть на доску, чтобы понять это. Если вам известно, что белый конь находится в позиции с координатами (5, 6), а черный — в позиции (1, 4), для этого достаточно использовать вычитание. Вычтите координату x черного коня из координаты x белого коня: 5 − 1 = 4. Черный конь должен переместиться вдоль оси x на четыре клетки. Теперь вы- чтите координату y черного коня из координаты y белого коня: 6 − 4 = 2. Чер- ный конь должен переместиться вдоль оси y на две клетки. Выполняя несложные арифметические подсчеты с координатами, можно выяснить расстояния между ними. Отрицательные числа В декартовых координатах также используются отрицательные числа, то есть числа меньше нуля. Знак «минус» перед числом показывает, что оно отрицательное: −1 меньше 0, а −2 меньше −1. Но сам 0 не является ни по- ложительным, ни отрицательным. На рис. 12.3 изображена числовая ось, на которой положительные числа возрастают по направлению вправо, а отри- цательные числа уменьшаются влево. 1 2 3 4 5 6 7 8 9 0 −1 −2 −3 −4 −5 −6 −7 −8 −9 (negative) (positive) (отрицательные) (положительные) Рис. 12.3. Числовая ось с положительными и отрицательными числами Числовая ось удобна для понимания принципа вычитания и сложения. Вместо выражения 5 + 3 вы можете представлять белого коня, перемещаю- щегося с позиции 5 на 3 значения вправо. Как видно на рис. 12.4, белый конь займет позицию 8. И это правильно, ведь 5 + 3 равно 8. (отрицательные) (положительные) Рис. 12.4. Перемещение белого коня вправо увеличивает значение координаты 212 Глава 12 Вычитание происходит путем перемещения белого коня влево. Поэтому при выражении 5 − 6 белый конь из позиции 5 перемещается на 6 значений влево, как показано на рис. 12.5. (отрицательные) (положительные) Рис. 12.5. Перемещение белого коня влево уменьшает значение координаты Белый конь занимает позицию −1. Это значит, что 5 − 6 равно −1. Если вы прибавите или вычтете отрицательное число, белый конь пере- местится в направлении, противоположном тому, в котором он перемещался в случае с положительными числами. Когда вы прибавляете отрицательное число, конь перемещается влево. Когда вы вычитаете отрицательное число, конь перемещается вправо. Выражение −1 − (−4) будет равно 3, как показано на рис. 12.6. Обратите внимание, что выражения −1 − (−4) и −1 + 4 приводят к одному и тому же результату. (отрицательные) (положительные) Рис. 12.6. Белый конь перемещается с позиции −6 на 4 значения вправо 1 2 3 −1 −2 −3 1 2 −1 −2 −3 (2, 3) (−3, 1) (−1.5, −2.5) (0, 0) 3 x y Рис. 12.7. Объединение двух числовых осей создает декартову систему координат Вы можете рассматривать ось x как числовую. Добавьте еще одну число- вую ось, проходящую по вертикали, и обозначьте буквой y. Объединив эти Декартова система координат 213 две числовые оси, вы получите декартову систему координат, вроде той, что изображена на рис. 12.7. Прибавление положительного числа (или вычитание отрицательного) приведет к перемещению коня вверх по оси y или вправо по оси x, а вычитание положительного числа (или прибавление отрицательного) переместит коня вниз по оси y или влево по оси x. Позиция (0, 0) по центру называется началом координат. Возможно, вы пользовались подобной системой координат на уроках математики. Давайте рассмотрим несколько приемов, которые пригодятся для усвоения принципа координат. Система координат компьютерного экрана Экран вашего компьютера состоит из пикселей , наименьших цветовых точек, которые он может отобразить. Для экранов компьютеров обычно ис- пользуется система координат с началом (0, 0) в верхнем левом углу и возрас- тающая по направлению вниз и вправо. Это видно на рис. 12.8, где показан ноутбук с разрешением экрана 1920 пикселей в ширину и 1080 пикселей в вы- соту. y increases (0, 0) (0, 1079) (1919, 0) (1919, 1079) x возрастает y возрас та ет Рис. 12.8. Декартова система координат на экране компьютера Здесь нет отрицательных координат. Обычно компьютерная графика ис- пользует такую систему координат для отображения пикселей на экране, и вы примените ее в играх из этой книги. В контексте программирования важно понимать, как работают системы координат — и те, которые используются в математике, и те, которые относятся к экранам компьютеров. Математические хитрости Вычитание и сложение отрицательных чисел производить легко, когда у вас перед глазами есть числовая ось. Это также может быть легко и при ее 214 Глава 12 отсутствии. Далее представлены три хитрости , которые помогут вам сложить и вычесть отрицательные числа самостоятельно. Хитрость 1: минус «съедает» плюс слева от себя Когда вы видите знак минуса со знаком «плюс» слева от него, вы можете заменить знак «плюс» знаком «минус». Представьте, что знак минус «съедает» знак плюс слева. Ответ все тот же, потому что прибавление отрицательного значения эквивалентно вычитанию положительного. Итак, оба выражения, 4 + −2 и 4 – 2, равны 2, как видно из примера ниже: 2 4 + –2 4 – 2 Хитрость 2: два минуса в сумме дают плюс Когда вы видите два минусовых знака друг за другом без числа между ними, их можно превратить в знак плюс. Ответ тот же, потому что вычитание отрицательного значения равнозначно прибавлению положительного. 6 4 – –2 4 + 2 Хитрость 3: два слагаемых числа можно переставлять местами Складывая числа, их всегда можно поменять местами. Это называют ком- мутативным (переместительным) свойством сложения . Имеется в виду, что перестановка, вроде замены 6 + 4 на 4 + 6, не повлияет на ответ, в чем вы мо- жете убедиться, подсчитав клетки на рис. 12.9. 6 + 4 = 10 + = = + 4 + 6 = 10 Рис. 12.9. Коммутативное свойство сложения позволяет переставлять числа местами Скажем, вы складываете отрицательное и положительное число, напри- мер −6 + 8. Декартова система координат 215 Поскольку вы выполняете операцию сложения, то можете изменить по- рядок чисел без изменения ответа. То есть −6 + 8 это то же самое, что и 8 + −6. Затем, взглянув на 8 + −6, легко понять, что знак минус может «съесть» знак плюс слева от себя, и задача сводится к 8 − 6 = 2, как видно ниже: 2 –6 + 8 # Swap the order of the addition. 8 + –6 # The minus sign eats the plus sign on its left. 8 – 6 # Измените порядок сложения. # Знак минуса "съедает" плюс слева от себя. Я перестроил задачу так, чтобы ее было проще решить без использования калькулятора или компьютера. Абсолютные величины и функция abs() Абсолютным значением (или модулем) числа является число без отрица- тельного знака. Следовательно, при вычислении модуля положительные числа не изменя- ются, а отрицательные числа становятся положительными. Например, абсо- лютное значение −4 равно 4. Абсолютное значение −7 равно 7. Абсолютное зна- чение числа 5 (которое уже положительно само по себе) составляет просто 5. Вы можете определить расстояние между двумя объектами, вычитая их координаты и преобразовывая разность в абсолютное значение. Представьте себе, что белый конь находится в позиции 4, а черный — в позиции −2. Рас- стояние между ними будет составлять 6, так как 4 − −2 равно 6, а абсолютное значение 6 равно 6. Это работает независимо от порядка чисел. Например, −2 − 4 (то есть от- рицательное число два минус четыре) составляет −6, а абсолютное значение −6 также равно 6. Функция abs() в Python возвращает абсолютное значение целого числа. В интерактивной оболочке введите следующие команды: >>> abs(-5) 5 >>> abs(42) 42 >>> abs(-10.5) 10.5 Абсолютное значение −5 равно 5. Абсолютное значение положитель- ного числа — просто это число, поэтому абсолютное значение 42 равно 42. Даже у чисел с запятой есть абсолютное значение, так что абсолютное значе- ние −10.5 составляет 10.5. Заключение Чаще всего программирование не требует глубокого понимания принци- пов математики. До этой главы мы обходились простым сложением и умно- жением. Декартова система координат необходима для описания определенной позиции в двумерной области. Координаты содержат два числа: координату x и координату y. Ось x расположена горизонтально, влево и вправо, а ось y — вертикально, вверх и вниз. На экране компьютера начало координат находит- ся в верхнем левом углу, а координаты возрастают по направлению вправо и вниз. Три математические хитрости, о которых вы узнали в этой главе, позво- ляют легко сочетать положительные и отрицательные целые числа. Первая: знак минус «съедает» знак плюс слева. Вторая: два минуса рядом друг с дру- гом объединяются в знак плюс. Третья: можно менять порядок чисел, кото- рые вы сочетаете. Остальные игры в этой книге используют эти принципы, потому что со- держат в себе двумерные области. Все игры, использующие графику, требуют понимания того, как работает декартова система координат. Игра «Охотник за сокровищами» 217 13 ИГРА «ОХОТНИК ЗА СОКРОВИЩАМИ» В игре «Охотник за сокровищами» мы впервые применим декартовую систему координат, изученную в главе 12. В этой игре также используются струк- туры данных (на самом деле, это просто способ красиво выразиться о наличии списков, содер- жащих другие списки и аналогичные составные пере- менные). Поскольку ваши игры становятся более слож- ными, вам понадобится организовывать свои данные в струк туры. Действие игры происходит в океане, игрок погружает гидролокаторы, чтобы найти на затонувших судах сундуки с сокровищами. Гидролокатор (сонар) — это технология, которую используют корабли для поиска объектов под водой. Гидролокаторы в этой игре сообщают игроку, как далеко находит- ся ближайший сундук с сокровищами, не сообщая направление. Но, исполь- зуя несколько гидролокаторов, игрок может определить местоположение сундука. |