Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическое программирование на Python. Учебное пособие
.pdf
● при вызове функции отрисовки draw() графические объекты,
которые мы хотим разместить на основном экране, сначала
попадают в специальный буфер. Чтобы отобразить изменения
необходимо вызвать функцию flip():
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((1000, 800))
r = pygame.Rect(50, 50, 100, 200)
pygame.draw.rect(screen, (255, 0, 0), r, 0)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.flip()
3.10.3. Функции для рисования
В библиотеке определены следующие функции для рисования
простейших фигур:
● pygame.draw.rect(Surface, color, Rect, width=0)
Нарисовать прямоугольник Rect на поверхности Surface, цветом
color. Если толщина линии width равна нулю, прямоугольник
закрашивается;
● pygame.draw.line(Surface, color, start_pos, end_pos, width=1)
Нарисовать линию на поверхности Surface цветом color, с началом в точке start_pos, концом в точке end_pos и толщиной линии
width;
● pygame.draw.lines(Surface, color, closed, pointlist, width=1)
Нарисовать линию, соединяющую точки из последовательности
pointlist на поверхности Surface, цветом color, с толщиной
линии width. Каждая точка представлена парой координат.
Если параметр closed равен True, конечная точка соединяется
с начальной;
61

● pygame.draw.circle(Surface, color, pos, radius, width=0)
Нарисовать окружность на поверхности Surface цветом
color, с центром в точке pos и радиусом radius. Если
толщина линии width равна нулю, окружность закрашивается;
● pygame.draw.ellipse(Surface, color, Rect, width=0)
Нарисовать эллипс, ограниченный прямоугольником Rect, на
поверхности Surface, цветом color. Если толщина линии width
равна нулю, эллипс закрашивается;
● pygame.draw.polygon(Surface, color, pointlist, width=0)
Нарисовать многоугольник по точкам из последовательности
pointlist на поверхности Surface цветом color, с толщиной
линии width. Каждая точка представлена парой координат.
Если толщина линии width равна нулю многоугольник закрашивается.
3.10.4. Цвета
Цвета в библиотеке pygame представлены в соответствии с
моделью RGB.
Значение для цвета можно задать тройкой чисел, каждое из
которых лежит в диапазоне от 0 до 255. Первое значение в последовательности определяет, какое количество красного содержится
в данном оттенке, второе – зеленого, третье – голубого. Чем меньше
значение числа, тем темнее будет оттенок. Например, красный цвет
можно представить как (255, 0, 0), белый – как (255, 255, 255),
а черный – как (0, 0, 0).
Помимо этого, в модуле color из библиотеки pygame содержится
словарь THECOLORS, ключами которого являются названия различных цветовых оттенков.
from pygame.color import THECOLORS
screen = pygame.display.set_mode((1200, 800))
screen.fill(THECOLORS['orange'])
62

3.10.5. Обработка нажатий клавиш
Взаимодействие пользователя с компьютером основано
на событиях. Любые действия, производимые пользователем,
порождают события: движение мыши, нажатия клавиш, специальных кнопок. Внутри библиотеки PyGame есть инструменты
для обработки событий, которые происходят внутри приложений.
Когда мы нажимаем клавишу, в систему передаётся не только
информация о том, что нажата
определенная кнопка, но и её
код. Существует два основных способа получить код нажатой
клавиши:
pygame.event.get()
pygame.key.get_pressed()
Первый использовался в примерах выше и позволяет получить
код события. Второй позволяет получить список клавиш, которые
нажаты в данный момент в виде кортежа булевых значений. Чтобы
узнать, нажата ли интересующая нас кнопка, необходимо проверить
значение, которое
содержится в данном кортеже:
keys = pygame.key.get_pressed()
if keys[pygame.K_RETURN]:
print("Нажата клавиша enter")
Умея получать от пользователя ввод, мы можем реализовать
движения фигур на экране. Для движения объектов используются
методы move() и move_ip(), которыми обладают объекты, созданные с помощью функций из pygame.draw(). Первый создаёт
новую фигуру такого же типа, находящуюся по заданному
смещению, второй непосредственно
изменяет положение имею-
щейся фигуры.
Если при перемещении рисовать объект поверх существующего
буфера, то это приведет к тому, что будет оставаться «след». Чтобы
избежать данной проблемы, надо добавить вызов метода fill()
у нашего экрана, на котором мы рисуем, и передать ему цвет,
которым надо закрасить фон. Данное действие надо проводить
каждый раз перед отрисовкой кадра.
63

import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
rect = pygame.Rect(40, 40, 60, 60)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
rect.move_ip(-40, 0)
elif event.key == pygame.K_RIGHT:
rect.move_ip(40, 0)
elif event.key == pygame.K_UP:
rect.move_ip(0, -40)
elif event.key == pygame.K_DOWN:
rect.move_ip(0, 40)
screen.fill((0, 0, 0))
pygame.draw.rect(screen, (255, 0, 0), rect, 0)
pygame.display.flip()
3.10.6. Часы и анимация
В Pygame существует несколько способов управления временем.
Рассмотрим только один: возможность задания задержки кадров
через объект Clock.
clock = pygame.time.Clock()
clock.tick(60)
Функция tick() позволяет сделать задержку – при этом передается желаемая частота кадров. Этот метод следует вызывать один раз
для каждого кадра. Он
вычислит, сколько миллисекунд прошло
с момента предыдущего вызова. Если вы передадите необязательный
аргумент частоты кадров, функция будет задерживать, чтобы
анимация продолжалась медленнее, чем заданное количество тиков
в секунду. Это можно использовать для ограничения скорости
64

выполнения игры. Вызывая Clock.tick(40) один раз за кадр,
программа никогда не будет работать со скоростью более 40 кадров
в секунду.
Обратите внимание, что эта функция использует функцию
SDL_Delay, которая не точна на каждой платформе, но при этом
не требует много ресурсов ЦП.
Ниже приведем программу, которая анимирует падение:
import sys
import pygame
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((640, 480))
rect = pygame.Rect(40, 40, 60, 60)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
rect.move_ip(0, 1)
screen.fill((0, 0, 0))
pygame.draw.rect(screen, (255, 0, 0), rect, 0)
pygame.display.flip()
clock.tick(40)
65

ЗАДАЧИ
Блок 1. Задачи на синтаксис и конструкции языка Python
a. сложить два числа, введенных с клавиатуры;
b. возвести в квадрат комплексное число;
c. вычислить квадратный корень числа, введенного с клавиатуры;
d. вычислить арксинус числа «pi / 4»;
e. сложить все целые числа от одного до 225;
f. вычислить факториал числа, введенного с клавиатуры;
g. сделать список
h. найти элементы списка, отсутствующие в другом;
i. удвоить все нечетные числа в списке;
j. вывести названия всех клеточек поля для игры в морской бой;
k. вычислить, сколько четных числа от 1 до миллиона начинаются
на 793, но при этом не кратны 7;
l. считать строку с клавиатуры и напечатать в
m. подсчитать количество букв «ы» в файле;
n. найти самое длинное слово в файле;
o. найти наибольший общий делитель двух чисел;
p. сделать букву заглавной (найти, как).
из 3872 нулей;
обратном порядке;
Блок 2. Базовые практические задачи для решения
1. Решить квадратное уравнение
● коэффициенты задаются пользователем с клавиатуры;
● решением занимается отдельная функция;
● разветвление решения на линейное и квадратное уравнения;
● обобщить решение задачи для комплексных корней;
2. Печать всех простых чисел, не превышающих N
● N задается пользователем с клавиатуры;
● точная реализация математического определения: «имеет 2
делителя» (подсчитать количество делителей);
● выделить функцию 'is_prime', которая возвращает TRUE/FALSE.
66

3. Простые числа в одну строчку
● сократить предыдущую программу 2 до одной строки;
● список простых чисел должен быть получен через списковое
включение с фильтрацией.
4. Вычисление числа π с заданной точностью
● количество знаков после запятой задает пользователь;
● не допускается использование циклов в явном виде;
● программа должна выводить запрошенное количество знаков,
делая округление.
5. Программа для решения уравнения вида f(x) = 0 методом
Ньютона
● функция f(x) вводится с клавиатуры;
● производная функции f(x) вычисляется аналитически;
● начальное приближение и требуемая точность вычисления
задаются с клавиатуры;
● промежуточные точки и касательные отобразить графически.
6. Вычисление интеграла функции f(x) аналитически и численно
● функция f(x) вводится с клавиатуры;
● пределы интегрирования вводятся с клавиатуры;
● аналитическое решение с использование библиотеки SymPy;
● численное решение реализовать с указанием количества
разбиений.
7. Вычисление статистик массива
● вычислить минимум и максимум;
● вычислить среднее значение;
● вычислить среднеквадратическое отклонение;
● вычислить пятый центральный момент;
● докажите, что он действительно центральный;
● вычислить среднее из пяти вышеуказанных чисел.
8. Сортировка
● отсортировать массив действительных чисел по возрастанию;
● отсортировать массив комплексных чисел по модулю;
● отсортировать массив комплексных чисел по убыванию
действительной части;
● отсортировать список строк по длине;
● отсортировать кортеж строк в лексикографическом порядке;
● отсортировать кортеж списков по возрастанию длины.
67

9. Работа с текстом
● считать предложение из файла;
● вычислить количество слов в предложении;
● развернуть порядок букв в третьем слове предложения;
● в получившемся предложении развернуть порядок слов;
● в получившейся строке сделать первую букву заглавной;
● сохранить результат в файл;
● построить гистограмму частотности букв без учета регистра.
10. Приведение текста в соответствие правилам
● считать строку произвольной длины;
● преобразовать строку следующим образом:
● удалить пробелы, стоящие перед точкой или запятой;
● после точек, запятых, двоеточий и т. д. поставить пробел;
● несколько пробелов, следующих подряд, заменить на одиночный;
● первую букву каждого предложения сделать заглавной;
● что нужно сделать, чтобы программа обрабатывала строку
на любом языке?
11. Матрицы
● сгенерировать две случайные матрицы заданного размера;
● вычислить сумму, произведение, определитель и обратные
матрицы;
● реализовать сохранение матриц в файл;
● добавить вариант со считыванием матриц из файла;
● что нужно сделать, чтобы добавить поддержку матриц
комплексных чисел?
● измерить время обращения матриц 10×10, 100×100, 1000×1000.
12. Телефонная книга
● определить тип Person;
● поля данных: имя, фамилия, номер телефона, дата рождения;
● предоставить возможность сортировать список Person по любому
из полей;
● реализовать считывание телефонной книги из файла в текстовом
формате;
● реализовать сохранение телефонной книги в файл в совмести-
мом формате;
● реализовать сохранение и считывание через сериализацию
(pickle).
68

13. Определить НОД и НОК
● считать N натуральных чисел;
● вычислить и вывести наибольший общий делитель чисел;
● вычислить и вывести наименьшее общее кратное чисел.
14. Перевод чисел между системами счисления.
● считать число, старое основание и новое основание;
● вывести число в системе счисления с новым основанием;
● обработать через исключения случаи некорректного ввода.
15. Найти наибольшую общую подпоследовательность двух
списков.
16. Найти вероятность того, что на цифровых часах с секундами
будут одновременно отображаться и «16», и «37».
17. Вычислить число π методом Монте-Карло.
● разыграть много случайных x и y в квадрате [–1, 1] × [–1, 1];
● подсчитать долю попавших в круг с радиусом 1;
● по этой доле оценить значение π;
● отобразить графически.
18. Повторение иностранных слов.
● завести словарь из слов и их переводов;
● запрашивать у пользователя переводы случайных слов;
● слова, переводы которых введены правильно, больше не спра-
шивать;
● реализовать сохранение состояния между запусками через
сериализацию (pickle).
19. Подбор бинарного оператора.
● считать целые числа 'А', 'B' и 'C';
● вывести всех возможные бинарные операторы Python 3, для
которых истинно 'A operator B == C' (найти библиотеку).
20. Обрезание полей у изображения.
● раздобыть или нарисовать однобитное изображение;
● превратить его в булев массив 'numpy';
● обрезать с краев поля из строк и столбцов не содержащие
изображение поля.
21. Поиск наибольшего прямоугольного отверстия
● раздобыть или нарисовать однобитное изображение;
● превратить его в булев массив 'numpy';
● найти и отобразить наибольшую по площади прямоугольную
белую область.
69

22. Построить график функции в декартовых полярных
координатах
● функция вводится с пользователем;
● возможность писать тригонометрические функции;
● нарисовать график в декартовых координатах;
● нарисовать график в полярных координатах;
● предусмотреть возможность задавать масштаб графиков.
23. Моделирование взаимодействия «хищник-жертва» в модели
Лотки-Вольтерры
● задать стартовые значения популяций жертв и хищников;
● задать коэффициенты связи alpha, beta, gamma, delta. Объяснить
смысл этих коэффициентов;
● значения популяций от времени отобразить в виде графика.
24. Реализовать клеточный автомат «игра "Жизнь"»
25. Конвертер валют, который сам узнает курс
● запросить у пользователя пару валют и сумму;
● перевести сумму из одной валюты в другую;
● курс перевода запросить из сети Интернет автоматически;
● предусмотреть возможность ввода названия страны валюты.
Блок 3. Обработка данных
1. Фурье-фильтрация сигнала
● смоделировать сигнал из трёх некратных частот, добавить
случайный шум;
● вычислить спектр сигнала, нарисовать график, оси в реальных
единицах (Гц);
● избавиться от шума в исходном сигнале путём вырезания
«лишних» частот в фурье-спектре;
● построить график исходного, зашумлённого и фильтрованно-
го сигнала с «легендой».
2. Аппроксимация методом наименьших квадратов
● взять модельный сигнал (a*sin(b*x), x=0..2*pi) добавить случай-
ный шум, методом наименьших квадратов найти параметры a, b;
● построить на графике исходный сигнал (линия), зашумлённые
данные (точки), результат аппроксимации (линия), вывести
легенду, найденные значения;
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
