new file: content/posts/informatics/python-turtle.mdx modified: content/posts/textbook/python.mdx modified: public/sitemap-0.xmlmain
parent
2ac412e0ee
commit
0e9d8dfbe1
@ -0,0 +1,630 @@ |
|||||||
|
--- |
||||||
|
title: Библиотека Pygame Python |
||||||
|
excerpt: Библиотека для разработки игр Pygame |
||||||
|
date: '2023-11-08' |
||||||
|
tags: |
||||||
|
- Информатика |
||||||
|
- Программирование |
||||||
|
- Python |
||||||
|
- Задачи |
||||||
|
- Pygame |
||||||
|
--- |
||||||
|
|
||||||
|
<TableOfContents> |
||||||
|
- [Урок 1](#урок-1) |
||||||
|
- [Урок 2](#урок-2) |
||||||
|
</TableOfContents> |
||||||
|
|
||||||
|
# Урок 1 |
||||||
|
|
||||||
|
pygame - это библиотека модулей для языка Python, созданная для разработки 2D игр. |
||||||
|
|
||||||
|
Для того чтобы установить pygame на свой компьютер необходимо открыть командную строку или терминал и написать команду |
||||||
|
|
||||||
|
```python |
||||||
|
pip3 install pygame |
||||||
|
``` |
||||||
|
После установки необходимо создать новый файл и импортировать модуль pygame и написать шаблон игры |
||||||
|
|
||||||
|
```python |
||||||
|
# Импортируем библиотеку pygame |
||||||
|
import pygame |
||||||
|
# Импортируем системную функцию exit |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
# Инициализируем pygame |
||||||
|
pygame.init() |
||||||
|
|
||||||
|
# Создаем окошко 800 пикселей шириной |
||||||
|
# и 600 пикселей высотой и записываем его |
||||||
|
# в переменную display. |
||||||
|
# Переменную display называют поверхностью. |
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
# Основной цикл игры |
||||||
|
while True: |
||||||
|
# Ждем события (действия пользователя) |
||||||
|
for event in pygame.event.get(): |
||||||
|
# Если нажали на крестик, |
||||||
|
# то закрываем окно |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
# Обновляем поверхность игры |
||||||
|
# на каждом шаге основного цикла игры |
||||||
|
pygame.display.update() |
||||||
|
``` |
||||||
|
|
||||||
|
Пользователь может взаимодействовать с нашей игрой. Каждое действие пользователя - это некоторое событие, которое мы можем обработать. Выражение pygame.event.get() - это список событий, произошедших в нашей игре. |
||||||
|
|
||||||
|
Цикл for просто перебирает необработанные события. Каждое событие он присваивает переменной event (можно написать любую другую). |
||||||
|
|
||||||
|
Поговорим о цикле while, основном цикле игры. Как часто он выполняется? Очень и очень часто, это зависит от мощности компьютера. Для обновления экрана в играх часто используют 60 кадров в секунду. |
||||||
|
|
||||||
|
Ограничим количество выполнений цикла. |
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
FPS = 60 # Создаем переменную FPS |
||||||
|
clock = pg.time.Clock() # Создаем счетчик для FPS |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) # Замедляем цикл до 60 выполнений в секунду |
||||||
|
``` |
||||||
|
Методу tick() передается желаемое количество кадров в секунду. Задержку он вычисляет сам. На каждой итерации основного цикла игры секунда делится на 60 и на вычисленную величину выполняется задержка. |
||||||
|
|
||||||
|
Рисование фигур |
||||||
|
В библиотеке pygame существует множество функций для рисования различных фигур. |
||||||
|
|
||||||
|
Функция polygon() рисует произвольную фигуру. Она принимает 3 обязательных параметра (поверхность, цвет и кортеж координат) и 1 необязательный (толщину линий). |
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
# Рисуем полигон (да, получится квадратик) |
||||||
|
pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) ) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pg.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
display - наша поверхность |
||||||
|
|
||||||
|
(255, 0, 0) - красный цвет, почитайте про rgb |
||||||
|
|
||||||
|
( (0, 0), (100, 0), (100, 100), (0, 100) ) - координаты вершин квадрата. Возьмите листочек и нарисуйте его координатах (замените сотню на единицу). |
||||||
|
|
||||||
|
Давайте нарисуем треугольник |
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
# Рисуем квадратик |
||||||
|
pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) ) |
||||||
|
# Рисуем синий треугольник |
||||||
|
pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) ) |
||||||
|
|
||||||
|
FPS = 60 # Создаем переменную FPS |
||||||
|
clock = pg.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
|
||||||
|
display - поверхность |
||||||
|
``` |
||||||
|
(0, 0, 255) - синий цвет |
||||||
|
|
||||||
|
((100, 100), (200, 200), (100, 200)) - координаты вершин нашего треугольник. |
||||||
|
|
||||||
|
Самостоятельно нарисуйте пятиугольник (вам помогут карандаш и лист бумаги) |
||||||
|
Рисование окружностей |
||||||
|
Чтобы нарисовать окружность нужно вызвать метод circle из модуля draw. Команда выглядит так: pygame.draw.circle(display, color, position, radius). |
||||||
|
|
||||||
|
display - поверхность, на которой рисуем |
||||||
|
|
||||||
|
color - цвет, записанный в кортеже из трех чисел. (еще раз про rgb) |
||||||
|
|
||||||
|
position - координаты точки центра окружности (кортеж из двух чисел (x, y)) |
||||||
|
|
||||||
|
radius - радиус окружности в пикселях |
||||||
|
|
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
# Рисуем квадратик |
||||||
|
pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) ) |
||||||
|
# Рисуем синию линию |
||||||
|
pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) ) |
||||||
|
# Рисуем желтую окружность с радиусом 100 пикселей |
||||||
|
pygame.draw.circle( display, (255, 255, 0) , (400,200), 100) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pg.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
display - наша поверхнотсть для рисования |
||||||
|
|
||||||
|
(255, 255, 0) - желтый цвет |
||||||
|
|
||||||
|
(400, 200) - координаты точки центра (в нашем случае 400 пикселей от верхнего левого угла по горизонтали и 200 пикселей по вертикали) |
||||||
|
|
||||||
|
100 - радиус нашей окружности в пикселях |
||||||
|
|
||||||
|
Объявления переменных для цветов |
||||||
|
Для нашего с вами удобства давайте объявим несколько переменных, в которые сохраним используемые нами цвета |
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
WHITE = (255, 255, 255) |
||||||
|
BLACK = (0, 0, 0) |
||||||
|
PURPLE = (156, 39, 176) |
||||||
|
INDIGO = (63, 81, 181) |
||||||
|
BLUE = (33, 150, 243) |
||||||
|
GREEN = (76, 175, 80) |
||||||
|
YELLOW = (255, 235, 59) |
||||||
|
ORANGE = (255, 152, 0) |
||||||
|
GREY = (158, 158, 158) |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
# Рисуем квадратик |
||||||
|
pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) ) |
||||||
|
# Рисуем синию линию |
||||||
|
pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) ) |
||||||
|
# Рисуем желтую окружность с радиусом 100 пикселей |
||||||
|
pygame.draw.circle( display, (255, 255, 0) , (400,200), 100) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pg.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
Рисование прямоугольников |
||||||
|
Для отрисовки прямоугольников можно использовать метод rect. |
||||||
|
|
||||||
|
pygame.draw.rect(display, color, (x, y, width, height) ) |
||||||
|
|
||||||
|
color - цвет (теперь можно просто написать имя переменную) |
||||||
|
|
||||||
|
(x, y, width, height) - кортеж из четырех значений. Первые два значения - это координаты верхнего левого угла прямоугольника, а два последних - это ширина и высота. |
||||||
|
|
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
WHITE = (255, 255, 255) |
||||||
|
BLACK = (0, 0, 0) |
||||||
|
PURPLE = (156, 39, 176) |
||||||
|
INDIGO = (63, 81, 181) |
||||||
|
BLUE = (33, 150, 243) |
||||||
|
GREEN = (76, 175, 80) |
||||||
|
YELLOW = (255, 235, 59) |
||||||
|
ORANGE = (255, 152, 0) |
||||||
|
GREY = (158, 158, 158) |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
# Рисуем квадратик |
||||||
|
pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) ) |
||||||
|
# Рисуем синию линию |
||||||
|
pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) ) |
||||||
|
# Рисуем желтую окружность с радиусом 100 пикселей |
||||||
|
pygame.draw.circle( display, (255, 255, 0) , (400,200), 100) |
||||||
|
# Рисуем фиолетовый прямоугольник 200х300 |
||||||
|
pygame.draw.rect( display, PURPLE , (600, 300, 200, 300)) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pg.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
Если ваша творческая натура требует большего, то вот ссылка на документацию модулю draw |
||||||
|
|
||||||
|
Там можно найти рисование линий, дуг, эллипсов. |
||||||
|
|
||||||
|
Большой пример запусти его на компьтере: |
||||||
|
|
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
from random import randint |
||||||
|
# Функция, возвращающая случайный оттенок зеленого цвета |
||||||
|
def randomGreen(): |
||||||
|
return randint(0, 100), randint(100, 255), randint(0,100) |
||||||
|
# Функция, возвращающая случайный оттенок красного цвета |
||||||
|
def randomRed(): |
||||||
|
return randint(100, 255), randint(0, 100), randint(0,100) |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
display = pygame.display.set_mode( (600, 600) ) |
||||||
|
display.fill((255,255,255)) |
||||||
|
x = 100 # начальная позиция по оси X |
||||||
|
y = 100 # начальная позиция по оси Y |
||||||
|
while y < 500: # Пока мы не достигли точки с координатой y == 500 |
||||||
|
# Вложенный цикл для рисования линии из квадратиков |
||||||
|
while x < 500: # Пока мы не достигли точки с координатой x == 500 |
||||||
|
# Рисуем квадратик с координатами x, y |
||||||
|
pygame.draw.rect(display, randomGreen(), (x, y, 25, 25)) |
||||||
|
x += 25 # Смещаем позицию квадратика по оси X |
||||||
|
# По завершению вложенного цикла увеличиваем переменную y |
||||||
|
# для перехода на новую строчку |
||||||
|
y += 25 |
||||||
|
x = 100 # Возвращаем позицию по оси X в начало строчки |
||||||
|
# Рисуем "мордочку" крипера |
||||||
|
pygame.draw.rect(display, (0,0,0), (150, 200, 100, 100)) |
||||||
|
pygame.draw.rect(display, (0,0,0), (350, 200, 100, 100)) |
||||||
|
pygame.draw.rect(display, (0,0,0), (250, 300, 100, 100)) |
||||||
|
pygame.draw.rect(display, (0,0,0), (200, 350, 50, 100)) |
||||||
|
pygame.draw.rect(display, (0,0,0), (350, 350, 50, 100)) |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
pygame.display.update() |
||||||
|
``` |
||||||
|
|
||||||
|
Задания: |
||||||
|
|
||||||
|
1.Нарисуйте дерево из minecraft, используя полученные знания |
||||||
|
|
||||||
|
2.Нарисуйте оранжевую, красную, синию и фиолетовую звезды |
||||||
|
|
||||||
|
<TableOfContents> |
||||||
|
- [Урок 1](#урок-1) |
||||||
|
- [Урок 2](#урок-2) |
||||||
|
</TableOfContents> |
||||||
|
|
||||||
|
# Урок №2 |
||||||
|
|
||||||
|
Обработка нажатий клавиш клавиатуры |
||||||
|
|
||||||
|
Создадим базовый шаблон для нашей игры |
||||||
|
|
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
WHITE = (255, 255, 255) |
||||||
|
BLACK = (0, 0, 0) |
||||||
|
PURPLE = (156, 39, 176) |
||||||
|
INDIGO = (63, 81, 181) |
||||||
|
BLUE = (33, 150, 243) |
||||||
|
GREEN = (76, 175, 80) |
||||||
|
YELLOW = (255, 235, 59) |
||||||
|
ORANGE = (255, 152, 0) |
||||||
|
GREY = (158, 158, 158) |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pygame.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
pygame отслеживает все происходящие в игре события и позволяет нам их обрабатывать. При возникновении события создается экземпляр класса Event. Каждый экземпляр этого класса имеет определенный список свойств. Одно из этих свойств - это свойство type. Именно оно позволяет нам понять, какое событие произошло. |
||||||
|
|
||||||
|
События клавиатуры имеют тип KEYDOWN. |
||||||
|
|
||||||
|
Еще одно важное свойство - это свойство key. Для нас оно представляет интерес, когда мы обнаружили событие с типом KEYDOWN. С помощью свойства key мы можем узнать, какая клавиша была нажата. |
||||||
|
|
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
WHITE = (255, 255, 255) |
||||||
|
BLACK = (0, 0, 0) |
||||||
|
PURPLE = (156, 39, 176) |
||||||
|
INDIGO = (63, 81, 181) |
||||||
|
BLUE = (33, 150, 243) |
||||||
|
GREEN = (76, 175, 80) |
||||||
|
YELLOW = (255, 235, 59) |
||||||
|
ORANGE = (255, 152, 0) |
||||||
|
GREY = (158, 158, 158) |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pygame.time.Clock() |
||||||
|
while True: |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
elif event.type == pygame.KEYDOWN: |
||||||
|
if event.key == pygame.K_LEFT: |
||||||
|
print('Левая стрелка') |
||||||
|
elif event.key == pygame.K_RIGHT: |
||||||
|
print('Правая стрелка') |
||||||
|
elif event.key ==pygame.K_UP: |
||||||
|
print('Стрелка вверх') |
||||||
|
elif event.key ==pygame.K_DOWN: |
||||||
|
print('Стрелка вниз') |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
После запуска скрипта при нажатии стрелок на клавиатуре в стандартный вывод будут выводится строки с информацией о нажатой клавише. |
||||||
|
|
||||||
|
Напишем код, который будет рисовать кружок |
||||||
|
```python |
||||||
|
pygame.draw.circle(display, BLUE, (400, 300), 5) |
||||||
|
# Добавьте этот скрипт после цикла while |
||||||
|
``` |
||||||
|
Заставим кружок двигаться. Нужно объявить две переменные - x и y. Эти переменные будут координатами нашего кружка. При нажатии клавиши мы будем изменять эти переменные. Если нажата стрелка вправо, увеличим переменную x на 10. Если - стрелка влево, уменьшим переменную x на 10. Проделаем то же самое с переменной y. |
||||||
|
```python |
||||||
|
import pygame |
||||||
|
from sys import exit |
||||||
|
|
||||||
|
pygame.init() |
||||||
|
|
||||||
|
WHITE = (255, 255, 255) |
||||||
|
BLACK = (0, 0, 0) |
||||||
|
PURPLE = (156, 39, 176) |
||||||
|
INDIGO = (63, 81, 181) |
||||||
|
BLUE = (33, 150, 243) |
||||||
|
GREEN = (76, 175, 80) |
||||||
|
YELLOW = (255, 235, 59) |
||||||
|
ORANGE = (255, 152, 0) |
||||||
|
GREY = (158, 158, 158) |
||||||
|
|
||||||
|
display = pygame.display.set_mode( (800, 600) ) |
||||||
|
|
||||||
|
FPS = 60 |
||||||
|
clock = pygame.time.Clock() |
||||||
|
|
||||||
|
x = 400 # начальная координата по оси X |
||||||
|
y = 300 # начальная координата по оси Y |
||||||
|
|
||||||
|
while True: |
||||||
|
# Рисуем кружок в точке с координатами x,y |
||||||
|
pygame.draw.circle(display, BLUE, (x, y), 5) |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
elif event.type == pygame.KEYDOWN: |
||||||
|
if event.key == pygame.K_LEFT: |
||||||
|
print('Левая стрелка') |
||||||
|
x -= 10 |
||||||
|
elif event.key == pygame.K_RIGHT: |
||||||
|
print('Правая стрелка') |
||||||
|
x += 10 |
||||||
|
elif event.key == pygame.K_UP: |
||||||
|
print('Стрелка вверх') |
||||||
|
y -= 10 |
||||||
|
elif event.key == pygame.K_DOWN: |
||||||
|
print('Стрелка вниз') |
||||||
|
y += 10 |
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
Есть один нюанс. Шарик перемещается только один раз при зажатии одной из клавиш. Немного изменим наш код для того, чтобы он обратывал зажатые клавиш. |
||||||
|
|
||||||
|
```python |
||||||
|
# ... Код выше без изменений |
||||||
|
while True: |
||||||
|
pygame.draw.circle(display, BLUE, (x, y), 5) |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
# Найдите 10 отличий |
||||||
|
# Удаляем elif с KEYDOWN |
||||||
|
keys = pygame.key.get_pressed() # Словарь всех нажатых клавиш |
||||||
|
# Обрабатываем каждую клавишу по отдельности |
||||||
|
if keys[pygame.K_LEFT]: |
||||||
|
x -= 10 |
||||||
|
if keys[pygame.K_RIGHT]: |
||||||
|
x += 10 |
||||||
|
if keys[pygame.K_UP]: |
||||||
|
y -= 10 |
||||||
|
if keys[pygame.K_DOWN]: |
||||||
|
y += 10 |
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
События мыши |
||||||
|
В pygame обрабатываются три типа событий мыши: нажатие кнопки (значение свойства type события соответствует MOUSEBUTTONDOWN), отпускание кнопки (MOUSEBUTTONUP), перемещение мыши (MOUSEMOTION). Какая именно кнопка была нажата, записывается в другое свойство события - button. Для левой кнопки это число 1, для средней - 2, для правой - 3, для прокручивания вперед - 4, для прокручивания назад - 5. |
||||||
|
|
||||||
|
Другим атрибутом мышиных типов событий является свойство pos, в которое записываются координаты нажатия (кортеж из двух чисел). |
||||||
|
|
||||||
|
При нажатии левой кнопки мыши будем рисовать оранжевый кружок |
||||||
|
```python |
||||||
|
# Код выше без изменений... |
||||||
|
while True: |
||||||
|
display.fill(BLACK) |
||||||
|
pygame.draw.circle(display, BLUE, (x, y), 5) |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
elif event.type == pygame.MOUSEBUTTONDOWN: |
||||||
|
if event.button == 1: |
||||||
|
pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30) |
||||||
|
keys = pygame.key.get_pressed() |
||||||
|
if keys[pygame.K_LEFT]: |
||||||
|
print('Левая стрелка') |
||||||
|
x -= 10 |
||||||
|
if keys[pygame.K_RIGHT]: |
||||||
|
print('Правая стрелка') |
||||||
|
x += 10 |
||||||
|
if keys[pygame.K_UP]: |
||||||
|
print('Стрелка вверх') |
||||||
|
y -= 10 |
||||||
|
if keys[pygame.K_DOWN]: |
||||||
|
print('Стрелка вниз') |
||||||
|
y += 10 |
||||||
|
|
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
Добавим появление белых кружков по нажатию правой кнопки мыши. |
||||||
|
```python |
||||||
|
# Код выше без изменений... |
||||||
|
while True: |
||||||
|
display.fill(BLACK) |
||||||
|
pygame.draw.circle(display, BLUE, (x, y), 5) |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
elif event.type == pygame.MOUSEBUTTONDOWN: |
||||||
|
if event.button == 1: |
||||||
|
pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30) |
||||||
|
elif event.button == 3: |
||||||
|
pygame.draw.circle(display, WHITE, (event.pos[0], event.pos[1]), 30) |
||||||
|
keys = pygame.key.get_pressed() |
||||||
|
if keys[pygame.K_LEFT]: |
||||||
|
print('Левая стрелка') |
||||||
|
x -= 10 |
||||||
|
if keys[pygame.K_RIGHT]: |
||||||
|
print('Правая стрелка') |
||||||
|
x += 10 |
||||||
|
if keys[pygame.K_UP]: |
||||||
|
print('Стрелка вверх') |
||||||
|
y -= 10 |
||||||
|
if keys[pygame.K_DOWN]: |
||||||
|
print('Стрелка вниз') |
||||||
|
y += 10 |
||||||
|
|
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
Добавим очищение поверхности при скролле колесика мыши |
||||||
|
|
||||||
|
```python |
||||||
|
# Код выше без изменений... |
||||||
|
while True: |
||||||
|
display.fill(BLACK) |
||||||
|
pygame.draw.circle(display, BLUE, (x, y), 5) |
||||||
|
for event in pygame.event.get(): |
||||||
|
if event.type == pygame.QUIT: |
||||||
|
pygame.quit() |
||||||
|
exit() |
||||||
|
elif event.type == pygame.MOUSEBUTTONDOWN: |
||||||
|
if event.button == 1: |
||||||
|
pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30) |
||||||
|
elif event.button == 3: |
||||||
|
pygame.draw.circle(display, WHITE, (event.pos[0], event.pos[1]), 30) |
||||||
|
elif event.button == 5: |
||||||
|
display.fill(BLACK) |
||||||
|
keys = pygame.key.get_pressed() |
||||||
|
if keys[pygame.K_LEFT]: |
||||||
|
print('Левая стрелка') |
||||||
|
x -= 10 |
||||||
|
if keys[pygame.K_RIGHT]: |
||||||
|
print('Правая стрелка') |
||||||
|
x += 10 |
||||||
|
if keys[pygame.K_UP]: |
||||||
|
print('Стрелка вверх') |
||||||
|
y -= 10 |
||||||
|
if keys[pygame.K_DOWN]: |
||||||
|
print('Стрелка вниз') |
||||||
|
y += 10 |
||||||
|
|
||||||
|
|
||||||
|
pygame.display.update() |
||||||
|
|
||||||
|
clock.tick(FPS) |
||||||
|
``` |
||||||
|
|
||||||
|
Задание: |
||||||
|
Создайте еще один перемещающийся объект, назначьте клавиши WASD для его перемещения. Ключи клавиш: W == K_w, A == K_a, D == K_d, S == K_s. Обратите внимание, что вам понадобятся новые переменные для координат, например, x1 и y1. |
||||||
|
|
||||||
|
<TableOfContents> |
||||||
|
- [Урок 1](#урок-1) |
||||||
|
- [Урок 2](#урок-2) |
||||||
|
</TableOfContents> |
@ -0,0 +1,307 @@ |
|||||||
|
--- |
||||||
|
title: Библиотека Python Turtle |
||||||
|
excerpt: Графическая библиотека turtle |
||||||
|
date: '2023-11-08' |
||||||
|
tags: |
||||||
|
- Информатика |
||||||
|
- Программирование |
||||||
|
- Python |
||||||
|
- Turtle |
||||||
|
--- |
||||||
|
|
||||||
|
<TableOfContents> |
||||||
|
|
||||||
|
- [Урок 1](#урок-1) |
||||||
|
- [Урок 2](#урок-2) |
||||||
|
|
||||||
|
</TableOfContents> |
||||||
|
|
||||||
|
# Урок 1 |
||||||
|
|
||||||
|
Модуль turtle - это графическая библиотека для работы с 2D-графикой в Python. Сначала его нужно подключить к скрипту. |
||||||
|
|
||||||
|
```python |
||||||
|
import turtle |
||||||
|
``` |
||||||
|
|
||||||
|
После этого необходимо создать "перо" и записать ссылку на него в переменную |
||||||
|
|
||||||
|
```python |
||||||
|
import turtle |
||||||
|
pen = turtle.Pen() |
||||||
|
turtle.exitonclick() #Выход при нажатии мышкой в окне Turtle |
||||||
|
``` |
||||||
|
|
||||||
|
Команда forward() чертит прямую линию. Она принимает в качестве аргумента длину линии в пикселях. |
||||||
|
|
||||||
|
```python |
||||||
|
import turtle |
||||||
|
pen = turtle.Pen() |
||||||
|
|
||||||
|
pen.forward(100) # Прямая линия длиной в 100 пикселей |
||||||
|
``` |
||||||
|
|
||||||
|
Команда left() и right() поворачивает курсор. Они принимают в качестве аргумента угол поворота. |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
pen = turtle.Pen() |
||||||
|
|
||||||
|
pen.forward(200) # Прямая линия длиной в 200 пикселей |
||||||
|
pen.left(135) # Поворачиваем на 135 градусов влево |
||||||
|
|
||||||
|
pen.forward(200) # Прямая линия длиной в 200 пикселей |
||||||
|
pen.right(135) # Поворачиваем на 135 градусов вправо |
||||||
|
|
||||||
|
pen.forward(200) # Прямая линия длиной в 200 пикселей |
||||||
|
``` |
||||||
|
|
||||||
|
Мы можем перемещать перо без начертания линий. Для этого нужно сначала поднять перо с помощью команды penup(), затем переместить его в нужную точку с помощью команды setpos(x, y), где x и y - это координаты точки, в которую мы перемещаем наше перо. После всех проделанных манипуляций необходимо опустить перо с помощью команды pendown(). |
||||||
|
|
||||||
|
Подведем итог. Для того чтобы переместить перо в другую точку нужно: |
||||||
|
|
||||||
|
1. Поднять перо с помощью команды penup() |
||||||
|
|
||||||
|
2. Переместить перо в точку x, y (x и y - координаты в пикселях, вместо них подставляем числа) командой setpos(x, y) |
||||||
|
|
||||||
|
3. Опустить перо в нужно точке с помощью команды pendown() |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
pen = turtle.Pen() |
||||||
|
|
||||||
|
# Первая линия |
||||||
|
pen.forward(200) |
||||||
|
pen.penup() |
||||||
|
pen.setpos(0, 20) |
||||||
|
pen.pendown() |
||||||
|
|
||||||
|
# Вторая линия |
||||||
|
pen.forward(200) |
||||||
|
pen.penup() |
||||||
|
pen.setpos(0, 40) |
||||||
|
pen.pendown() |
||||||
|
|
||||||
|
# Третья линия |
||||||
|
pen.forward(200) |
||||||
|
pen.penup() |
||||||
|
pen.setpos(0, 60) |
||||||
|
pen.pendown() |
||||||
|
``` |
||||||
|
Код, приведенный выше рисует три параллельных линии друг над другом. |
||||||
|
|
||||||
|
С помощью команды color() мы можем изменить цвет линий |
||||||
|
|
||||||
|
В команду color() нужно передать цвет |
||||||
|
|
||||||
|
```python |
||||||
|
import turtle |
||||||
|
pen = turtle.Pen() |
||||||
|
pen.color('red') |
||||||
|
|
||||||
|
pen.forward(200) |
||||||
|
|
||||||
|
pen.penup() |
||||||
|
pen.setpos(0, 20) |
||||||
|
pen.pendown() |
||||||
|
|
||||||
|
pen.color('blue') |
||||||
|
|
||||||
|
pen.forward(200) |
||||||
|
``` |
||||||
|
Экспериментируйте! Вот доступные цвета: |
||||||
|
* red |
||||||
|
* blue |
||||||
|
* green |
||||||
|
* yellow |
||||||
|
* orange |
||||||
|
* purple |
||||||
|
* pink |
||||||
|
* violet |
||||||
|
И еще много других цветов |
||||||
|
|
||||||
|
Задачи |
||||||
|
|
||||||
|
1. Нарисуйте квадрат |
||||||
|
|
||||||
|
2. Нарисуйте квадрат, у которого каждая сторона имеет свой цвет |
||||||
|
|
||||||
|
3. Нарисуйте треугольник |
||||||
|
|
||||||
|
4. Разноцветный треугольник |
||||||
|
|
||||||
|
5. Много-много параллельных линий |
||||||
|
|
||||||
|
6. Проявите фантазию, создайте свое неповторимое произведение |
||||||
|
|
||||||
|
# Урок 2 |
||||||
|
|
||||||
|
Несколько полезных методов для изменения внешнего вида: |
||||||
|
|
||||||
|
Метод bgcolor получает в качестве аргумента строковую переменную и изменяет цвет фона окна |
||||||
|
|
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') # Цвет фона будет золотым |
||||||
|
``` |
||||||
|
|
||||||
|
Метод width изменяет толщину пера. Он принимает в качестве аргумента целое число. |
||||||
|
|
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) # Толщина линий станет 5 пикселей |
||||||
|
``` |
||||||
|
|
||||||
|
Методы pu и pd позволяют поднять и опустить перо. Они используются, когда нам нужно переместить перо с помощью метода setpos. |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.forward(100) |
||||||
|
p.pu() # Подняли перо |
||||||
|
p.setpos(-100, -100) # Переместили перо в точку с координатами (-100, -100) |
||||||
|
p.pd() # Опустили перо |
||||||
|
``` |
||||||
|
|
||||||
|
Метод cirle рисует окружность. Он принимает в качестве аргумента целое число - радиус окружности в пикселях. |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
p.circle(100) # Окружность с радиусом 100 пикселей |
||||||
|
``` |
||||||
|
|
||||||
|
Циклы и рисование фигур |
||||||
|
В прошлой статье мы рисовали квадрат с помощью последовательного перечисления операций. Это совсем неудобно. Есть способ сократить этот код. Для полного понимания прочтите статью про цикл for. |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
for i in range(4): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ПОСЛЕ |
||||||
|
p.forward(100) # ДВОЕТОЧИЯ ИМЕЕТ ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА |
||||||
|
p.left(90) |
||||||
|
``` |
||||||
|
В примере, приведенном выше я использовал цикл for для повторения двух команд четыре раза. Давайте нарисуем пятиугольник. Я добавлю дополнительную переменную в наш код, в которой буду сохранять количество сторон |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
number_sides = 5 # Количество сторон |
||||||
|
for i in range(number_sides): # Повторяем 5 раз |
||||||
|
p.forward(100) |
||||||
|
p.left(360 / number_sides) # Делаем поворот черепашки на 72 градуса |
||||||
|
``` |
||||||
|
Таким образом, мы можем нарисовать пятиугольник. Изменив всего одну переменную, получаем шестиугольник |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
number_sides = 6 # Поменяли на 6 |
||||||
|
for i in range(number_sides): |
||||||
|
p.forward(100) |
||||||
|
p.left(360 / number_sides) |
||||||
|
``` |
||||||
|
Поэкспериментируйте |
||||||
|
|
||||||
|
Вложенные циклы |
||||||
|
Мы можем выполнять один цикл в другом, например, нарисовать треугольник с тремя внешними треугольниками: |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
number_sides = 3 # Поменяли на 6 |
||||||
|
for i in range(number_sides): |
||||||
|
p.forward(100) |
||||||
|
p.left(360 / number_sides) |
||||||
|
for i in range(number_sides): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ИМЕЕТ |
||||||
|
p.forward(50) # ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА |
||||||
|
p.right(360 / number_sides) |
||||||
|
``` |
||||||
|
Треугольник с квадратами: |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
number_sides = 3 # Поменяли на 6 |
||||||
|
for i in range(number_sides): |
||||||
|
p.forward(100) |
||||||
|
p.right(360 / number_sides) |
||||||
|
for i in range(4): # Меняем number_sides на 4 |
||||||
|
p.forward(50) |
||||||
|
p.right(360 / 4) # Меняем number_sides на 4 |
||||||
|
``` |
||||||
|
Больше вложенных циклов!!!! |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
number_sides = 3 # Поменяли на 6 |
||||||
|
for i in range(number_sides): |
||||||
|
p.forward(100) |
||||||
|
p.left(360 / number_sides) |
||||||
|
for i in range(number_sides): |
||||||
|
p.forward(50) |
||||||
|
p.right(360 / number_sides) |
||||||
|
for i in range(number_sides): |
||||||
|
p.forward(20) |
||||||
|
p.right(360 / number_sides) |
||||||
|
``` |
||||||
|
Прием количества сторон от пользователя: |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
number_sides = int(input()) # Приняли число от пользователя |
||||||
|
for i in range(number_sides): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ПОСЛЕ |
||||||
|
p.forward(100) # ДВОЕТОЧИЯ ИМЕЕТ ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА |
||||||
|
p.left(360 / number_sides) |
||||||
|
``` |
||||||
|
Задаем позиции для квадратиков: |
||||||
|
```python |
||||||
|
import turtle |
||||||
|
p = turtle.Pen() |
||||||
|
turtle.bgcolor('gold') |
||||||
|
p.width(5) |
||||||
|
p.color('dodgerblue') |
||||||
|
squares = int(input('Введите количество квадратиков: ')) # Приняли число от пользователя |
||||||
|
for i in range(squares): # Делаем цикл для рисования каждого квадрата |
||||||
|
x = int(input('Введите координату х: ')) |
||||||
|
y = int(input('Введите координату y: ')) |
||||||
|
p.pu() |
||||||
|
p.setpos(x,y) |
||||||
|
p.pd() |
||||||
|
for k in range(4): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ПОСЛЕ |
||||||
|
p.forward(100) # ДВОЕТОЧИЯ ИМЕЕТ ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА |
||||||
|
p.left(90) |
||||||
|
``` |
||||||
|
|
||||||
|
Задачи |
||||||
|
1. Напишите программу, которая принимает от пользователя длину стороны квадрата и рисует его |
||||||
|
|
||||||
|
2. Напишите программу, которая рисует 5 разноцветных треугольников в различных местах окна (использовать перенос пера с помощью pu, setpos, pd) |
||||||
|
|
||||||
|
3. Напишите программу, которая принимает от пользователя количество кругов для отрисовки и рисует эти круги в разных местах окна |
||||||
|
|
||||||
|
4. Напишите программу, которая принимает количество сторон многоугольника, длину стороны многоугольника и рисует его. |
||||||
|
|
||||||
|
5. Напишите программу, которая принимает количество сторон многоугольника, длину стороны многоугольника и его позицию и рисует его. |
||||||
|
|
||||||
|
6. Творческое задание: напишите две-три программы использующие максимальное количество полученной от статьи информации. |
File diff suppressed because it is too large
Load Diff
@ -1,13 +1,14 @@ |
|||||||
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"> |
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/exam/minimum-knowledge-of-python</loc><lastmod>2023-10-17T17:59:34.071Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts</loc><lastmod>2023-11-08T04:40:37.596Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/informatics/ms-word</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/informatics/python-task</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/about</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/informatics/python-well</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/exam/minimum-knowledge-of-python</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/informatics/textbook-python</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/informatics/ms-power</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/olimp/practice-test-10-11-robotics</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/informatics/ms-word</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts/olimp/practice-test-5-6-robotics</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/informatics/python-pygames</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/posts</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/informatics/python-task</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/informatics/python-turtle</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
<url><loc>https://edu.krasnikov.pro/about</loc><lastmod>2023-10-17T17:59:34.072Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
<url><loc>https://edu.krasnikov.pro/posts/informatics/python-well</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
|
<url><loc>https://edu.krasnikov.pro/posts/textbook/python</loc><lastmod>2023-11-08T04:40:37.597Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> |
||||||
</urlset> |
</urlset> |
Loading…
Reference in new issue