Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практическое программирование на Python. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
● при вызове функции отрисовки 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]