Программирование аркадных игр
и обучение информатикеChapter 1: Напишем простой калькулятор
Если на вашем компьютере до сих пор не установлен Python и Pygame, перейдите на предыдущую главу , чтобы прочитать инструкцию по их скачиванию и установке.
1.1 Вступление
Одним из простейших применений Python'а является использование его как калькулятора. Подождите-ка, но ведь калькулятор - не игра. Зачем нам говорить про калькуляторы?
Расчёт падения объектов, полёта снарядов, таблицы рекордов: всё это требует вычислений. А ещё, каждый фанат математики смотрит на калькулятор скорее как на игрушку, чем как на орудие пыток. В связи с этим, давайте начнём процесс обучения созданию игр именно с калькулятора.
Простые вычислительные программы могут использовать введённую пользователем информацию для, например, вычисления выплаты кредита, преобразования одних единиц измерения в другие, планирование затрат на постройку дома. Ради того, чтобы быть готовыми создать физический игровой движок, мы должны быть способны создать программу для вычислений вроде следующей:
Сильная сторона такого подхода в том, что пользователь не видит сложных вычислений: всё, что ему требуется, это ввести начальную информацию. После этого, он получит результат вычислений в понятном для него формате. Любой похожий калькулятор может быть использован на телефоне, позволяя человеку с лёгкостью производить расчёты на ходу.
1.2 Вывод
Нашим первым шагом к созданию калькулятора будет обучение выводу данных на экран. Для того, чтобы это сделать, созданим простую программу. Эта программа просто выводит надпись “Hello World.” на экран. На языке Python она выглядит вот так:
print ("Hello World.")
Как же выглядит программа “Hello World”
на других языках программирования? У Википедии есть статья, показывающая варианты “Hello World”,
написаной на разных языках:
http://en.wikipedia.org/wiki/Hello_world_program_examples
В зависимости от реализации “Hello World”, можно сделать начальные выводы о том, насколько
сложен каждый конкретный язык программирования. Интересно видеть, сколько в мире разных языков.
В общем, команда для вывода на экран в Python'e легко запоминается. Просто используйте print.
После самой команды следуют скобки ( ). Внутри этих скобок находится то, что нужно вывести на экран. Использовать скобки для передачи входных данных функции - обычное дело как в математике, так и в программировании.
Люди, изучающие математику используют скобки, вычисляя выражения вроде $sin(\theta)=cos(\frac{\pi}{2}-\theta)$. $sin$ и $cos$ - функции. Данные, переданные им, находятся внутри скобок. В нашем случае разница лишь в том, что информация передаётся в виде текста, а не в виде чисел.
Заметьте, что передаваемый функции текст заключён в кавычки. Если текст находится в кавычках, компьютер выведет его точно таким, каким он был подан. Например, следующая программа выведет 2+3:
print ("2+3")
У следующей программы кавычки вокруг $2+3$ отсутствуют, поэтому компьютер попытается рассчитать результат, анализируя входные данные как математическое выражение. Он просто выведет 5, а не 2+3.
print (2+3)
Попытка запустить программу с нижеприведённым кодом приведёт к ошибке: компьютер постарается рассчитать “Hello World” как математическое выражение, каковым оно вовсе не является.
print (Hello World)
Вышеуказанный код выдаст ошибку SyntaxError: invalid syntax, означающую, что компьютер не знает, что значат “Hello” и “World”.
Print позволяет выводить много значений одновременно; нужно лишь перечислить их через запятые. Например, следующий код выведет: Ответом на 10+10 является 20
print ("Ответом на 10+10 является",10+10)
Следующая строка кода выведет Ответом на 10+10 является 10+10. Числа не складываются, потому что они наприсаны внутри кавычек. Всё, что написано внутри кавычек, воспринимается компьютером как текст. Всё, что написано без кавычек, компьютер воспринимает как математическое выражение либо "компьютерный код".
print ("Ответом на 10+10 является","10+10")
Этот образец кода вовсе не будет работать. Потому, что в нём нет запятой, разделяющей текст в кавычках и выражение 10+10. Вначале может показаться, что запятая поставлена, однако можно заметить, что запятая находится внутри кавычек. Запятая, разделяющая аргументы, поданные в функцию, должна находиться вне кавычек. Запятая, которую программист хочет вывести на экран должна находиться внутри кавычек:
print ("Ответом на 10+10 является," 10+10)
Следующий пример будет работать потому, что после текста следует запятая, отделяющая
print ("Ответом на 10+10 является,", 10+10)
1.3 Комментарии
Иногда в коде требуется дать дополнительные объяснения для его читателя. Для этого мы добавляем “комментарии” в код. Комментарии предназначены не для компьютера, а для людей, читающих код.
Существует два способа создать комментарий. Первый: использовать символ #. Компьютер будет игнорировать любой текст программы Python'а, встречающийся после #. Например:
# Это комментарий, он начинается со знака #, # поэтому компьютер будет его игнорировать. print("Это не комментарий. Компьютер") print("выведет это на экран.")
Знак # внутри кавычек не оценивается как комментарий. Программист может “отключить” строчку кода, поставив знак # перед нею. Также, возможно оставить комментарий после самой строки.
print("Знак # внутри кавычек не считается комментарием.") # print ("Это комментарий, несмотря на то, что эта строка является программным кодом.") print ("Привет") # Это комментарий в конце строки
Также, возможно закомментировать несколько строк кода, поставив три одиночные кавычки подряд. разделителя комментария.
print("Привет") ''' Это многостроковый комментарий. Ничего из написанного в этих кавычках не будет исполнено print("Вот так вот") ''' print("Готово")
Обратите внимание на комментарии в образцах кода, которые мы будем выкладывать в этой книге. Даже если вы будете читать только написанный собственным руками код, комментарии помогут вам сохранить время. Добавление комментария “Обработка бомб инопланетян” быстро поможет вам вспомнить для чего же прездназначалась эта секция кода без надобности перечитывать и расшифровывать её.
1.4 Операторы присваивания
Как начать хранить очки игрока в игре? Или следить за здоровьем врага? Для этого нам понадобятся операторы присваивания. (оператор это символ вроде + или -.) Они помогают сохранить значение в переменной для дальнейшего использования. Код, приведённый внизу, присвоит переменной x значение 10, а затем выведет значение, сохранённое в переменной x.
# Создать переменную x и сохранить в ней число 10. x = 10 # Вывести число, сохранённое в x. print(x) # Это выводит букву x, но не значение x print("x") # Это выводит "x= 10" print("x=",x) |
Variables:
x= Output:
10 x x= 10 |
Заметьте: Вышеприведённый пример также демонстрирует разницу между двумя вариантами: x внутри кавычек и x снаружи кавычек. Если x внутри кавычек, то компьютер просто выводит x. Если x написан вне кавычек, то компьютер выведет значение x. Это бывает частой ошибкой у тех, кто учится программировать.
Присвоение не является тем же самым, что и алгебраическое уравнение. Не рассматривайте их как одно и то же. В присвоении, слева от знака равенства находится переменная. Ничего другого там быть не может.
Справа от знака равенства находится выражение. Выражением является всё то, у чего в результате может быть значение. Изучите код снизу. Он верен, даже несмотря на то, что он не является чистым математическим уравнением. Математические уравнения устроены совсем по другому, вопреки тому, что у них тоже есть перменные, числа и знак равенства. Это выражение берёт текущее значение x, добавляет к нему единицу и сохраняет результат обратно в x.
x = x + 1
Результатом нижеприведённого кода будет вывод цифры 6.
x=5 x = x + 1 print(x)
Следующее выражение является корректным, но бессмысленным. Компьютер прибавит единицу к х, но результат никогда не будет сохранён или выведен.
x + 1
Нижеприведённый код выведет 5, а не 6, потому что программист забыл сохранить результат $x + 1$ обратно в переменную x.
x=5 x + 1 print(x)
Выражение внизу не корректно, потому что слева от знака равенства находится не только переменная.
x + 1 = x
У Python'а также есть операторы присвоения. Это позволяет программисту легче изменять переменные. Например:
x += 1
Вышеприведённое выражение эквивалентно коду, приведённому ниже:
x = x + 1
Существуют операторы присвоения для сложения, вычитания, умножения и деления.
1.5 Переменные
Имена переменных должны начинаться с маленькой буквы латинского алфавита. Переменные могут начинаться с заглавной буквы или знака подчёркивания, но это особые случаи, которые не следует использовать на постоянной основе. После первой маленькой буквы, переменные могут включать в себя как заглавные, так и маленькие буквы, вперемешку с числами и знаками подчёркивания. Переменные не могут содержать пробелы.
Переменные чувствительны к регистру символов. Это может сбить с толку, если программист не ожидает этого. В коде внизу, на экран будет выведено 6, а не 5, потому что x и X - это две разные переменные.
x=6 X=5 print(x)
Дозволенные имена переменных | Запрещённые имена переменных | Дозволенные, но не правильные |
---|---|---|
distance first_name ds9 |
9ds first name %correct |
FirstName X LIVES_LEFT |
1.6 Операторы
Для более сложных математических операций доступны обычные математические операторы. Вместе с не так часто используемыми:
оператор | операция | пример выражения | пример кода |
---|---|---|---|
+ | сложение | $3 + 2$ | a=3+2 |
- | вычитание | $3 - 2$ | a=3-2 |
* | умножение | $3 \cdot 2$ | a=3*2 |
/ | деление | $\frac{10}{2}$ | a=10/2 |
// | деление с целочисленным результатом | - | a=10//3 |
** | возведение в степень | $2^3$ | a=2**3 |
% | остаток от деления | - | a=8 % 3 |
“Деление с целочисленным результатом” всегда будет округлять дробный ответ вниз до целочисленного результата. Например 11//2 будет равно 5, а не 5.5, и 99//100 будет равно 0.
Умножение без написания оператора не работает в Python. Следующие две строки кода работать не будут:
# Это не работает x=5y x=5(3/2)
Обязательно нужно использовать оператор умножения для того, чтобы этот код работал:
# Это работает x=5*y x=5*(3/2)
1.7 Последовательность операций
Python будет рассчитывать выражения в том же порядке, который ожидается от стандартных математических выражений. Например, это уравнение неправильно вычислит среднее значение(average):
average=90+86+71+100+98/5
Первым выполненным действием будет 98/5. Компьютер высчитывает:
$90+86+71+100+\frac{98}{5}$
а не:
$\dfrac{90+86+71+100+98}{5}$
Эта проблема может быть решена используя скобки:
average=(90+86+71+100+98)/5
1.8 Тригонометрические функции
Тригонометрические функции используются для вычисления синуса и косинуса в уравнениях: По умолчанию, Python не знает, как считать синус и косинус, но он может это делать после того, как была подключена (импортирована) нужная библиотека. Единицы измерения в радианах.
# Импортировать библиотеку math # Эта строка должна быть написана один раз, в самом верху файла # нашей программы. from math import * # Вычислить x используя синус и косинус x = sin(0) + cos(0)
1.9 Калькулятор для специализированных вычислений
Программа может использовать Python для вычисления пройденного расстояния / галлон(~4.55л) топлива автомобиля, проехавшим 294 мили(~470 км) на 10.5 галлонах бензина.
m=294/10.5 print(m)
Эта программа может быть улучшена с использованием переменных. Это позволяет легко менять значения в коде без изменения самого уравнения.
m=294 g=10.5 m2=m/g # Используем переменные print(m2)
Сама со себе, эта программа малопонятна для стороннего читателя. Переменные m и g ничего не значат без знания контекста. После преобразования имён переменных, программа станет намного понятнее:
milesDriven=294 #миль пройдено gallonsUsed=10.5 #использовано галлонов mpg=milesDriven/gallonsUsed print(mpg) #пройденные мили на один галлон топлива
Теперь даже далёкий от программирования человек скорее всего сможет понять, что делает программа. Ещё один пример плохих и хороших названий переменных:
# Сложно для понимания ir=0.12 b=12123.34 i=ir*b # Легко для понимания interestRate=0.12 #Процентная ставка accountBalance=12123.34 #Денег на счету interestAmount=interestRate*accountBalance #Накопления с процентов
В редакторе IDLE возможно редактировать предыдущую линию без повторного её набота на клавиатуре. Для этого переведите курсор на нужную линию и нажмите клавишу “enter”. Содержимое выбранной линии будет скопировано в текущую линию.
Ввод кода в >>> консоли очень медленный, к тому же вы можете вводить только одну строчку кода за раз. Также, невозможно сохранить код для передачи его другим людям. Однако есть и другой, лучший, вариант для ввода кода на Python'e.
Код из Python'а может быть введён используя скрипт. Скрипт - это набор строк кода, которые будут выполнены сразу. Для создания скрипта, откройте новое окно, как это показано на рисунке 1.2.
Введите вышеописанную программу для рассчёта расхода топлива, затем сохраните файл в любое место на вашем компьютере, по вашему выбору. Файлы со скриптами Python'а всегда должны заканчиваться расширением .py. Пример на рисунке 1.3.
Запустите написанную программу, кликнув на меню “Run” и выбрав “Run Module” (либо просто нажмите F5). Попробуйте изменять количество пройденных миль и затраченных галлонов.
С этого момента, весь введённый код должен находиться в файле скрипта/модуле. Не пишите код программы в >>> консоли IDLE.
Эта программа будет ещё более полезной, если она сможет обращаться к пользователю с запросом ввести пройденные мили и затраченное количество топлива. Это может быть сделано с помощью выражения input. Посмотрите на нижеприведённый код:
# Этот код почти работает milesDriven=input("Введите пройденные мили:") gallonsUsed=input("Введите затраченные галлоны:") mpg=milesDriven/gallonsUsed print ("Пройденных миль на галлон топлива:",mpg)
Эта программа просит пользователя ввести мили и галлоны, однако она показывает странную ошибку, показанную на рисунке 1.4.
Причина ошибки может быть выявлена после небольшого изменения программы:
milesDriven=input("Введите пройденные мили:") gallonsUsed=input("Введите затраченные галлоны:") x=milesDriven+gallonsUsed print("Сумма m+g:",x)
Запуск программы, показанной выше, даст результат, показанный на Рисунке 1.5.
Программа не складывает два числа вместе, она просто пишет одно после другого. Так случается от того, что программа не знает, что пользователь будет вводить числа. С таким же успехом пользователь может ввести “Bob” и “Mary”, а результатом сложения этих двух переменных будет “BobMary”; Такое поведение, в принципе, не является бессмысленным.
Чтобы сказать компьютеру, что пользователь вводит числа, необходимо поставить функцию input внутрь int( ) или float( ). Первое используется для целых чисел, второе - для дробных.
Финальная версия работающей программы:
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Explanation video: http://youtu.be/JK5ht5_m6Mk # Calculate Miles Per Gallon print("This program calculates mpg.") # Get miles driven from the user miles_driven = input("Enter miles driven:") # Convert text entered to a # floating point number miles_driven = float(miles_driven) # Get gallons used from the user gallons_used = input("Enter gallons used:") # Convert text entered to a # floating point number gallons_used = float(gallons_used) # Calculate and print the answer mpg = miles_driven / gallons_used print("Miles per gallon:", mpg) |
Переменные:
milesDriven= gallonsUsed= mpg= Вывод:
This program calculates mpg. Enter miles driven:288 Enter gallons used:15 Miles per gallon: 19.2 |
Рассмотрим другой пример, вычисляющий кинетическую энергию объекта:
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Calculate Kinetic Energy print("This program calculates the kinetic energy of a moving object.") m_string = input("Enter the object's mass in kilograms: ") m = float(m_string) v_string = input("Enter the object's speed in meters per second: ") v = float(v_string) e = 0.5 * m * v * v print("The object has " + str(e) + " joules of energy.")
Для сокращения программы возможно сразу поставить выражение input внутрь выражения float. Например, эти строки кода:
milesDriven=input("Введите пройденные мили:") milesDriven=float(milesDriven)
Выполняют то же самое, что и строка:
milesDriven=float(input("Введите пройденные мили:"))
В данном случае, результат функции input сразу будет передан в функцию float. Оба варианта работают, и, конечно, программист сам должен выбирать, какой же вариант ему использовать. Однако в любом случае очень важно понимать оба варианта.
1.10 Проверка пройденного
Нажмите здесь для теста с несколькими вариантами ответов (англ. яз).
- Напишите строчку кода, которая выведет на экран ваше имя.
- Как вводить комментарий в программе?
- Что выведут следующие строки кода?
print (2/3) print (2//3)
- Напишите строку кода, которая создаёт переменную под названием pi и присваивает ей значение числа Пи.
- Почему следующий код не работает?
A=22 print(a)
- Каждое из нижеприведённых имён переменных может быть использовано. Но какие из них являются лучшими вариантами?
a A Area AREA area areaOfRectangle AreaOfRectangle
- Какие из этих имён переменных не разрешены в Python'e?
apple Apple APPLE Apple2 1Apple account number account_number account.number accountNumber account#
- Почему этот код не работает?
print(a) a=45
- Найдите и объясните ошибку в этом коде:
pi = float(3.14)
- Найдите и объясните ошибку в следующем коде:
radius=input("Радиус:") x=3.14 pi=x area=pi*radius**2
- Найдите и объясните ошибку в следующем коде:
a=((x)*(y))
- Найдите и объясните ошибку в следующем коде:
radius = input(float("Введите радиус:"))
- Найдите и объясните ошибку в следующем коде:
area=π*radius**2
- Напишите строку кода, которая будет спрашивать пользователя ввести длину стороны квадрата, а затем сохранять результат в переменной. Ввод должен быть конвертирован в целое число.
- Введите строчку кода, которая выводит площадь квадрата, используя введённое значение в вопросе 14.
- Сделайте то же самое, что в вопросах 14 и 15, но уже с формулой для площади эллипса.
$s=\pi ab$
где $a$ и $b$ являются длинами радиусов. - Сделайте то же самое, что и в вопросах 14 и 15, но с формулой для вычисления
давления газа.
$P=\dfrac{nRT}{V}$
где $n$ - число молей , $T$ - абсолютная температура, $V$ - объём, а $R$ - универсальная газовая постоянная 8.3144.Для дополнительной информации об универсальной газовой постоянной обратитесь к http://ru.wikipedia.org/wiki/Универсальная_газовая_постоянная.
1.11 Лабораторные работы
Для проверки знаний, выполните задания из Лабораторной работы 1 перед продолжением обучения.
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin