Программирование на Python: графика

Содержание

Слайд 2

Программирование на Python: графика

1. Простые программы

Программирование на Python: графика 1. Простые программы

Слайд 3

Система координат

(0,0)

(x,y)

X

Y

x

y

начало координат

Система координат (0,0) (x,y) X Y x y начало координат

Слайд 4

Определение координат

(0,0)

X

Y

(100,100)

(200,50)

(200,250)

(100,200)

(300,100)

(300,200)

(50,150)

(350,150)

(200,150)

базовая точка

?

?

?

?

?

?

?

?

Определение координат (0,0) X Y (100,100) (200,50) (200,250) (100,200) (300,100) (300,200) (50,150)

Слайд 5

Управление цветом

Подключение графического модуля:

from graph import *

подключить все функции модуля graph

Цвет линий:

penColor(

Управление цветом Подключение графического модуля: from graph import * подключить все функции
"red" )

white, black, gray, navy, blue, cyan, green, yellow, red, orange, brown, maroon, violet, purple, ...

Цвет заливки:

brushColor( "green" )

Толщина линий:

penSize( 2 )

http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter

Слайд 6

Управление цветом (RGB)

Цвет в формате RGB:

penColor( 255, 255, 0 )

R(red)
0..255

G(green)
0..255

B(blue)
0..255

"yellow"

brushColor( 255, 0,

Управление цветом (RGB) Цвет в формате RGB: penColor( 255, 255, 0 )
255 )

"magenta"

penColor( 0, 255, 255 )

"cyan"

brushColor( 255, 255, 255 )

"white"

penColor( 0, 0, 0 )

"black"

Слайд 7

Примитивы (простейшие фигуры)

penColor(0, 255, 0) line(x1, y1, x2, y2)

penColor(0, 0, 255)
point(x, y)

penColor(255,

Примитивы (простейшие фигуры) penColor(0, 255, 0) line(x1, y1, x2, y2) penColor(0, 0,
0, 0) moveTo(x1, y1) lineTo(x2, y2)
lineTo(x3, y3)
lineTo(x4, y4)
lineTo(x5, y5)

Слайд 8

Примитивы (простейшие фигуры)

penColor("blue")
brushColor("yellow")
rectangle(10, 20, 50, 40)

penColor("red")
brushColor("green")
circle(50, 30, 20)

penColor("cyan")
brushColor("magenta")
polygon( [(10,10), (50,50), (10,50), (10,10)]

Примитивы (простейшие фигуры) penColor("blue") brushColor("yellow") rectangle(10, 20, 50, 40) penColor("red") brushColor("green") circle(50,
)

Слайд 9

Пример

(200, 50)

(100, 100)

(300, 200)

from graph import *
penColor("magenta")
brushColor("blue")
rectangle(100,100,300,200)
brushColor("yellow")
polygon([(100,100), (200,50),
(300,100), (100,100)])
penColor("white")
brushColor("green")
circle(200, 150,

Пример (200, 50) (100, 100) (300, 200) from graph import * penColor("magenta")
50)
run()

Слайд 10

Задачи

«3»: «Домик»
«4»: «Лягушка»

Задачи «3»: «Домик» «4»: «Лягушка»

Слайд 11

Задачи

«5»: «Корона»

Задачи «5»: «Корона»

Слайд 12

Программирование на Python: графика

2. Процедуры

Программирование на Python: графика 2. Процедуры

Слайд 13

Задача: Построить фигуру:
Особенность: Три похожие фигуры.
общее: размеры, угол поворота
отличия: координаты, цвет

Процедуры

Задача: Построить фигуру: Особенность: Три похожие фигуры. общее: размеры, угол поворота отличия: координаты, цвет Процедуры

Слайд 14

Процедуры (подпрограммы)

Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий.
Применение:
выполнение

Процедуры (подпрограммы) Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых
одинаковых действий в разных местах программы
разбивка программы (или другой процедуры) на подзадачи для лучшего восприятия

Слайд 15

Как построить процедуру?

выделить одинаковые или похожие действия (три фигуры)
найти в них общее

Как построить процедуру? выделить одинаковые или похожие действия (три фигуры) найти в
(размеры, форма, угол поворота) и отличия (координаты, цвет)
отличия обозначить как переменные, они будут параметрами процедуры

(x+100, y)

(x, y-60)

(x, y)

Параметры:
x, y – координаты угла
с – цвет заливки

Слайд 16

Процедура

(x+100, y)

(x, y-60)

(x, y)

def treug(x, y, c):
brushColor(c)
polygon( [(x,y), (x,y-60),
(x+100,y),

Процедура (x+100, y) (x, y-60) (x, y) def treug(x, y, c): brushColor(c)
(x,y)] )

определить (define)

название

Слайд 17

Программа с процедурой

from graph import *
def treug(x, y, c):
brushColor(c)
polygon([(x,y),(x,y-60),
(x+100,y),(x,y)]

Программа с процедурой from graph import * def treug(x, y, c): brushColor(c)
)
penColor ( "black" )
treug ( 100, 100, "blue" )
treug ( 200, 100, "green" )
treug ( 200, 160, "red" )
run()

def treug(x, y, c):
brushColor(c)
polygon([(x,y),(x,y-60),
(x+100,y),(x,y)] )

Слайд 18

Задания

«3»: Используя одну процедуру, построить фигуру.
«4»: Используя одну процедуру, построить фигуру.

Задания «3»: Используя одну процедуру, построить фигуру. «4»: Используя одну процедуру, построить фигуру.

Слайд 19

Задания

«5»: Используя одну процедуру, построить фигуру.

«6»: Используя одну процедуру, построить фигуру.

Задания «5»: Используя одну процедуру, построить фигуру. «6»: Используя одну процедуру, построить фигуру.

Слайд 20

Программирование на Python: графика

3. Циклы

Программирование на Python: графика 3. Циклы

Слайд 21

Использование циклов

40

40

100

160

circle ( 40, 40, 20 )
circle ( 100, 40, 20 )
circle

Использование циклов 40 40 100 160 circle ( 40, 40, 20 )
( 160, 40, 20 )
...

x

x = 40
for i in range(5):
circle(x, 40, 20)
x += 60

"сделай 5 раз"

40

x += 60

Слайд 22

Использование циклов

40

40

100

160

100

160

x = 40
for i in range(5):
circle(x, 40, 20)
x +=

Использование циклов 40 40 100 160 100 160 x = 40 for
60

1-й ряд:

40

y

Слайд 23

Использование циклов

from graph import *
def row ( y ):
x

Использование циклов from graph import * def row ( y ): x
= 40
for i in range(5):
circle(x, y, 20)
x += 60
y = 40
for k in range(3):
row ( y )
y += 60
run()

def row ( y ):
x = 40
for i in range(5):
circle(x, y, 20)
x += 60

процедура

вызов процедуры

вниз на 60

Слайд 24

Задания

«3»: Ввести с клавиатуры число N и нарисовать N рядов по 5

Задания «3»: Ввести с клавиатуры число N и нарисовать N рядов по
кругов.
Пример (N = 3):

Слайд 25

Задания

«4»: Ввести с клавиатуры число N и нарисовать из кругов прямоугольный размером

Задания «4»: Ввести с клавиатуры число N и нарисовать из кругов прямоугольный
N на N.
Пример (N = 3):

Слайд 26

Задания

«5»: Ввести с клавиатуры число N и нарисовать из кругов равнобедренный треугольник

Задания «5»: Ввести с клавиатуры число N и нарисовать из кругов равнобедренный
с высотой N. Каждый ряд должен быть покрашен в свой цвет.
Пример (N = 3):

Слайд 27

Задания-2

«3»: Ввести с клавиатуры число N и нарисовать N вертикальных рядов по

Задания-2 «3»: Ввести с клавиатуры число N и нарисовать N вертикальных рядов
5 ромбиков.
Пример (N = 2):

Слайд 28

Задания-2

«4»: Используя циклы и процедуры, нарисуйте узор. Число повторений рисунка N введите

Задания-2 «4»: Используя циклы и процедуры, нарисуйте узор. Число повторений рисунка N
с клавиатуры.
Пример (N = 3):

Слайд 29

Задания-2

«5»: Используя циклы и процедуры, нарисуйте узор.

Задания-2 «5»: Используя циклы и процедуры, нарисуйте узор.

Слайд 30

Программирование на Python: графика

4. Штриховка

Программирование на Python: графика 4. Штриховка

Слайд 31

Штриховка

(x1, y1)

(x2, y2)

N линий (N=5)

h

rectangle (x1, y1, x2, y2)
line( x1+h, y1, x1+h,

Штриховка (x1, y1) (x2, y2) N линий (N=5) h rectangle (x1, y1,
y2)
line( x1+2*h, y1, x1+2*h, y2)
line( x1+3*h, y1, x1+3*h, y2)
...

x

x

line( x, y1, x, y2)

В цикле менять x:

Слайд 32

Штриховка

(x1, y1)

(x2, y2)

N линий (N=5)

h

x = x1 + h
for i in range(N):

Штриховка (x1, y1) (x2, y2) N линий (N=5) h x = x1
line(x, y1, x, y2)
x += h

line( x, y1, x, y2)

x

x

меняется!

для 1-й линии

"сделай N раз"

для следующей линии

x = ?

Слайд 33

Штриховка

(x1, y1)

(x2, y2)

N линий

h

from graph import *
x1 = 100; y1 = 100
x2

Штриховка (x1, y1) (x2, y2) N линий h from graph import *
= 300; y2 = 200
N = 10
rectangle(x1,y1,x2,y2)
h = (x2-x1)/(N+1)
x = x1 + h
for i in range(N):
line(x, y1, x, y2)
x += h
run()

Слайд 34

Сложная штриховка

(x1, y1)

(x2, y2)

(x3, y2)

a

h

(x3+a, y1)

line( x1+h, y1, x1+h-a, y2);
line( x1+2*h, y1,

Сложная штриховка (x1, y1) (x2, y2) (x3, y2) a h (x3+a, y1)
x1+2*h-a, y2);
line( x1+3*h, y1, x1+3*h-a, y2);
...

x

x-a

Сначала:

x = x1 + h

В цикле:

x += h

Слайд 35

Очень сложная штриховка

(x1, y1)

(x2, y2)

hx

hy

N

y

x

y

line( x1, y1+hy, x1+hx, y1+hy) ;
line( x1, y1+2*hy,

Очень сложная штриховка (x1, y1) (x2, y2) hx hy N y x
x1+2*hx, y1+2*hy);
line( x1, y1+3*hy, x1+3*hx, y1+3*hy);
...

Сначала:

x = x1+hx
y = y1+hy

В цикле:

x += hx
y += hy

Слайд 36

Задания

«3»: Ввести с клавиатуры количество линий, построить фигуру и выполнить штриховку:
«4»: Ввести

Задания «3»: Ввести с клавиатуры количество линий, построить фигуру и выполнить штриховку:
с клавиатуры количество линий, построить фигуру и выполнить штриховку:

Слайд 37

Задания

«5»: Ввести с клавиатуры количество линий и построить фигуру:

«6»: Ввести с

Задания «5»: Ввести с клавиатуры количество линий и построить фигуру: «6»: Ввести
клавиатуры количество линий и построить фигуру:

Слайд 38

Программирование на Python: графика

5. Закрашивание областей

Программирование на Python: графика 5. Закрашивание областей

Слайд 39

Заливка разными цветами

(x1, y1)

(x2, y2)

x = x1; c = 0
for i in

Заливка разными цветами (x1, y1) (x2, y2) x = x1; c =
range(N):
brushColor(c, c, c)
rectangle(x, y1, x+h, y2)
x += h; c += hc

brushColor(c, c, c)
rectangle(x, y1,
x+h, y2)

серый: R=G=B

N полос

Шаг изменения цвета:

hc = 255 // N

Слайд 40

Задания

«3»: Ввести с клавиатуры число полос и построить фигуру, залив все области

Задания «3»: Ввести с клавиатуры число полос и построить фигуру, залив все
разным цветом.
«4»: Ввести с клавиатуры число полос и построить фигуру, залив все области разным цветом.

Слайд 41

Задания

«5»: Ввести с клавиатуры число полос и построить фигуру, залив все области

Задания «5»: Ввести с клавиатуры число полос и построить фигуру, залив все
разным цветом.
«6»: Ввести с клавиатуры число полос и построить фигуру, залив все области разным цветом.

или

Слайд 42

Программирование на Python: графика

6. Построение графиков функций

Программирование на Python: графика 6. Построение графиков функций

Слайд 43

Графики функций

Задача: построить график функции y = x2 на отрезке от -2

Графики функций Задача: построить график функции y = x2 на отрезке от
до 2.
Анализ:
максимальное значение
ymax = 4 при x = ±2
минимальное значение
ymin = 0 при x = 0
Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях.

Слайд 44

Преобразование координат

(x,y)

x

y

Математическая
система координат

Экранная система координат (пиксели)

(xэ,yэ)



(0,0)

(0,0)

x0

y0

k – масштаб (длина изображения единичного

Преобразование координат (x,y) x y Математическая система координат Экранная система координат (пиксели)
отрезка на экране)

xэ = x0 + kx
yэ = y0 - ky

Слайд 45

Оси координат

(0,y0)

(x0+150,y0)

(x0,0)

(x0,y0+20)

line(0, y0, x0+150, y0)
line(x0, 0, x0, y0+20)

Оси координат (0,y0) (x0+150,y0) (x0,0) (x0,y0+20) line(0, y0, x0+150, y0) line(x0, 0, x0, y0+20)

Слайд 46

Рисуем оси координат

from graph import *
x0 = 150 # начало координат
y0

Рисуем оси координат from graph import * x0 = 150 # начало
= 250
k = 50 # масштаб
xmin = -2; xmax = 2 # пределы по x
line(0, y0, x0+150, y0)
line(x0, 0, x0, y0+20)
...

Слайд 47

Строим по точкам

...
x = xmin # начальное значение x
h = 0.02 #

Строим по точкам ... x = xmin # начальное значение x h
шаг изменения x
penColor("red")
while x <= xmax:
y = x*x # функция
xe = x0 + k*x
ye = y0 - k*y
point(xe, ye) # точка на экране
x += h # к следующей точке
run()

xe = x0 + k*x
ye = y0 - k*y

экранные координаты (в пикселях)

Слайд 48

Соединяем точки линиями

Идея: сначала создаём в памяти массив точек, затем соединяем точки

Соединяем точки линиями Идея: сначала создаём в памяти массив точек, затем соединяем
линиями (polygon)

points = [] # пустой массив
while x <= xmax:
y = x*x
xe = x0 + k*x
ye = y0 - k*y
points.append( (xe, ye) )
x += h

points.append( (xe, ye) )

добавляем точку в массив

penColor("red")
polyline(points) # рисуем линию!

points = []

Слайд 49

Задания

«3»: Построить график функции на отрезке [-2,2].
«4»: Построить графики функций
и
на

Задания «3»: Построить график функции на отрезке [-2,2]. «4»: Построить графики функций и на отрезке [-2,2].
отрезке [-2,2].

Слайд 50

Задания

«5»: Построить графики функций
и
на отрезке [-2,2].

Задания «5»: Построить графики функций и на отрезке [-2,2].

Слайд 51

Программирование на Python: графика

7. Анимация

Программирование на Python: графика 7. Анимация

Слайд 52

Анимация

Анимация (англ. animation) – оживление изображения на экране.
Задача: внутри синего квадрата 400

Анимация Анимация (англ. animation) – оживление изображения на экране. Задача: внутри синего
на 400 пикселей слева направо двигается желтый квадрат 20 на 20 пикселей. Программа останавливается, если нажата клавиша Esc или квадрат дошел до границы синей области.

Привязка: состояние объекта задается координатами (x,y)

Слайд 53

Принцип анимации

рисуем объект в точке (x,y)
задержка на несколько миллисекунд
стираем объект
изменяем координаты (x,y)

Принцип анимации рисуем объект в точке (x,y) задержка на несколько миллисекунд стираем

переходим к шагу 1

moveObjectBy(obj, dx, dy)

смещения по осям

объект

Слайд 54

Начальная картинка

from graph import *
brushColor("blue")
rectangle(0, 0, 400, 400)
x = 100
y = 100
penColor("yellow")
brushColor("yellow")
obj

Начальная картинка from graph import * brushColor("blue") rectangle(0, 0, 400, 400) x
= rectangle(x, y, x+20, y+20)
run()

синий квадрат

начальные координаты

жёлтый квадрат

Слайд 55

Движение

def update():
moveObjectBy(obj, 5, 0)
if xCoord(obj) >= 380: # если

Движение def update(): moveObjectBy(obj, 5, 0) if xCoord(obj) >= 380: # если
вышел
close() # за границу
onTimer(update, 50)

вызывать update каждые 50 мс

x-координата

Слайд 56

Выход по Escape

Событие (англ. event) – изменение состояния какого-то объекта в программе

Выход по Escape Событие (англ. event) – изменение состояния какого-то объекта в
(нажатие на клавишу, щелчок мышью, перемещение или изменение размеров окна и т.п.).

def keyPressed(event):
if event.keycode == VK_ESCAPE:
close() # закрыть окно
onKey(keyPressed)

вызывать при нажатии любой клавиши

обработчик события

установка обработчика события

код клавиши Esc = 27

Слайд 57

Полная программа

from graph import *
def update():
...
def keyPressed(event):
...
brushColor("blue")
rectangle(0, 0, 400,

Полная программа from graph import * def update(): ... def keyPressed(event): ...
400)
x = 100
y = 100
penColor("yellow")
brushColor("yellow")
obj = rectangle(x, y, x+20, y+20)
onKey(keyPressed)
onTimer(update, 50)
run()

Слайд 58

Задания

«3»: Квадрат двигается справа налево:
«4»: Два квадрата двигаются в противоположных направлениях:

Задания «3»: Квадрат двигается справа налево: «4»: Два квадрата двигаются в противоположных направлениях:

Слайд 59

Задания

«5»: Два квадрата двигаются в противоположных направлениях и отталкиваются от стенок синего

Задания «5»: Два квадрата двигаются в противоположных направлениях и отталкиваются от стенок синего квадрата:
квадрата:

Слайд 60

Управление клавишами

Задача: жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш:
влево –

Управление клавишами Задача: жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш:
37 вверх – 38 Esc – 27
вправо – 39 вниз – 40
Проблема: как изменять направление движения?
Обработчик события:

def keyPressed(event):
if event.keycode == VK_LEFT:
moveObjectBy(obj, -5, 0)
elif event.keycode == VK_RIGHT:
moveObjectBy(obj, 5, 0)
... # дальше – сами...
onKey(keyPressed) # установить обработчик

=37

=39

VK_UP = 38
VK_DOWN = 40

VK_ESCAPE

Слайд 61

Задания

«3»: Квадрат в самом начале стоит в правом нижнем углу, и двигается

Задания «3»: Квадрат в самом начале стоит в правом нижнем углу, и
при нажатии стрелок только вверх или влево:
«4»: Квадрат двигается при нажатии стрелок, однако не может выйти за границы синего квадрата:

Слайд 62

Задания

«5»: Два квадрата, один управляется стрелками, второй – любыми другими клавишами. Оба

Задания «5»: Два квадрата, один управляется стрелками, второй – любыми другими клавишами.
не могут выйти за границы синего поля.

Слайд 63

Управление по требованию

Задача: жёлтый квадрат постоянно движется и меняет направление движения при

Управление по требованию Задача: жёлтый квадрат постоянно движется и меняет направление движения
нажатии клавиш-стрелок. При нажатии на пробел останавливается.
Проблема: как изменять направление движения?
Решение:

def update():
...
moveObjectBy(obj, 5 , 0 )
...
onTimer(update, 50)

Слайд 64

Как «поймать» нажатие клавиши?

def keyPressed(event):
global dx, dy
if event.keycode == VK_LEFT:

Как «поймать» нажатие клавиши? def keyPressed(event): global dx, dy if event.keycode ==

dx = -5
dy = 0
...
onKey(keyPressed)

?

?

Пробел: VK_SPACE

Это глобальные переменные!

Слайд 65

Полная программа

from graph import *
def update():
...
def keyPressed(event):
...
# рисуем синий

Полная программа from graph import * def update(): ... def keyPressed(event): ...
квадрат
x = 100; y = 100
dx = 0; dy = 0
penColor("yellow")
brushColor("yellow")
obj = rectangle(x, y, x+20, y+20)
onKey(keyPressed)
onTimer(update, 50)
run()

Слайд 66

Задания

«3»: Собрать и запустить программу.
«4»: Квадрат не может выйти за границы

Задания «3»: Собрать и запустить программу. «4»: Квадрат не может выйти за
синего квадрата, сразу останавливается при столкновении со стенкой.

Слайд 67

Задания

«5»: Квадрат отталкивается от стенок.

«6»: Квадрат может ходить по диагоналям (используйте ещё

Задания «5»: Квадрат отталкивается от стенок. «6»: Квадрат может ходить по диагоналям
4 клавиши) и отталкивается от стенок.

Слайд 68

«Змейка»

Задача: змейка состоит из головы и нескольких секций тела, постоянно движется и

«Змейка» Задача: змейка состоит из головы и нескольких секций тела, постоянно движется
меняет направление движения при нажатии клавиш-стрелок. При нажатии на пробел останавливается.
Проблемы:
1) как хранить данные о змейке?
2) как двигать её в нужную сторону?

Слайд 69

Как хранить змейку?

Змейка = массив из звеньев-квадратов

snake = []
penColor("yellow")
brushColor("yellow")
for i in range(N):

Как хранить змейку? Змейка = массив из звеньев-квадратов snake = [] penColor("yellow")
obj = rectangle(x+i*a, y, x+i*a+a, y+a)
snake.append( obj )
brushColor("green")

цвет границы и заливки для головы

остальные зелёные

Слайд 70

Как двигать змейку?

Для k-ого звена:

newCoord = coords(snake[k-1])
moveObjectTo(snake[k], newCoord[0],
newCoord[1])

с последнего!

координаты предыдущего

Как двигать змейку? Для k-ого звена: newCoord = coords(snake[k-1]) moveObjectTo(snake[k], newCoord[0], newCoord[1])
звена

Слайд 71

Как двигать змейку?

Вся змейка:

def moveSnake(xNew, yNew):
global x, y
for k in

Как двигать змейку? Вся змейка: def moveSnake(xNew, yNew): global x, y for
range(len(snake)-1,0,-1):
newCoord = coords(snake[k-1])
moveObjectTo(snake[k], newCoord[0],
newCoord[1])
moveObjectTo(snake[0], xNew, yNew)
x = xNew
y = yNew

перебор с последнего, кроме головы

двигаем голову

Слайд 72

Как двигать змейку?

Удобно так: dx, dy = –1, 0 или1

def keyPressed(event):
global

Как двигать змейку? Удобно так: dx, dy = –1, 0 или1 def
dx, dy
if event.keycode == VK_LEFT:
dx = -1
dy = 0
...
def update():
if dx or dy:
moveSnake( x + dx*a , y + dy*a )

dy*a

dx*a

если оба нули, двигать не нужно!

Слайд 73

Полная программа

from graph import *
def moveSnake(xNew, yNew):
...
def update():
...
def keyPressed(event):

Полная программа from graph import * def moveSnake(xNew, yNew): ... def update():
...
# рисуем синий квадрат
x = 100; y = 100 # координаты головы
dx = 0; dy = 0 # в начале стоит на месте
a = 10; N = 20 # размер и количество звеньев
# рисуем змейку в начальном положении
onKey(keyPressed)
onTimer(update, 50)
run()

Слайд 74

Задания

«3»: Собрать и запустить программу.
«4»: Змейка не может выйти за пределы

Задания «3»: Собрать и запустить программу. «4»: Змейка не может выйти за
синего квадрата (останавливается у стенки).

Слайд 75

Задания

«5»: Змейка при столкновении с границей поля начинает ползти вдоль этой границы.

«6»:

Задания «5»: Змейка при столкновении с границей поля начинает ползти вдоль этой
Если змейка пересекает сама себя, игра заканчивается.

Слайд 76

Случайные числа

Случайно…
встретить друга на улице
разбить тарелку
найти 10 рублей
выиграть в лотерею

Случайный выбор:
жеребьевка на

Случайные числа Случайно… встретить друга на улице разбить тарелку найти 10 рублей
соревнованиях
выигравшие номера в лотерее

Как получить случайность?

Слайд 77

Случайные числа на компьютере

Электронный генератор

нужно специальное устройство
нельзя воспроизвести результаты

318458191041

564321

209938992481

458191

938992

малый период (последовательность повторяется

Случайные числа на компьютере Электронный генератор нужно специальное устройство нельзя воспроизвести результаты
через 106 чисел)

Метод середины квадрата (Дж. фон Нейман)

в квадрате

Псевдослучайные числа – обладают свойствами случайных чисел, но каждое следующее число вычисляется по заданной формуле.

зерно

Слайд 78

Линейный конгруэнтный генератор

X := (a*X + b) % c # интервал от

Линейный конгруэнтный генератор X := (a*X + b) % c # интервал
0 до c-1

X := (X+7) % 10 # интервал от 0 до 9

X := 0

зерно

→ 7

→ 4

→ 1

→ 8

→ 5

→ 2

→ 0

зацикливание

2

→ 9

→ 6

→ 3

Компилятор GCC:
a = 1103515245
b = 12345
c = 231

Слайд 79

Генератор случайных чисел

Генератор на [0,1):

X = random.random() # псевдосл. число
Y =

Генератор случайных чисел Генератор на [0,1): X = random.random() # псевдосл. число
random.random() # уже другое число!

Целые числа на отрезке [a,b]:

X = random.randint(1,6) # псевдосл. число
Y = random.randint(1,6) # уже другое число!

import random

англ. random – случайный

Слайд 80

Генератор случайных чисел

Генератор на [0,1):

X = random(); # псевдослучайное число
Y =

Генератор случайных чисел Генератор на [0,1): X = random(); # псевдослучайное число
random() # это уже другое число!

Целые числа на отрезке [a,b]:

X = randint(10,60) # псевдослучайное число
Y = randint(10,60) # это уже другое число!

from random import *

англ. random – случайный

подключить все!

Слайд 81

Случайные числа

Задача: заполнить прямоугольник 400 на 300 пикселей равномерно точками случайного цвета
Как

Случайные числа Задача: заполнить прямоугольник 400 на 300 пикселей равномерно точками случайного
получить случайные координаты точки?
Как добиться равномерности?
обеспечивается автоматически при использовании функции randint

x = randint(0,399)
y = randint(0,299)

Слайд 82

Точка случайного цвета из списка

from random import choice
...
colors = ["red", "green", "blue",

Точка случайного цвета из списка from random import choice ... colors =

"black", "#FFFF00"]
col = choice(colors)
penColor( ??? )
point(x, y)

col

все варианты

случайный выбор

поставить точку

Слайд 83

Точка случайного цвета (RGB)

r = randint(0, 255)
g = randint(0, 255)
b = randint(0,

Точка случайного цвета (RGB) r = randint(0, 255) g = randint(0, 255)
255)
penColor( ??? )
point(x, y)

r, g, b

Цвет в формате RGB:

penColor( 255, 255, 0 )

R(red)
0..255

G(green)
0..255

B(blue)
0..255

"yellow"

Слайд 84

Вся программа

from graph import *
from random import choice
colors = ["red", "green", "blue",

Вся программа from graph import * from random import choice colors =

"black", "#FFFF00"]
def newPoint():
x = randint(0, 399)
y = randint(0, 299)
col = choice( colors )
penColor( col )
point(x, y)
def keyPressed(event):
if event.keycode == VK_ESCAPE:
close()
onKey(keyPressed)
onTimer(newPoint, 10)
run()

Слайд 85

Задания

«3»: Заполнить квадрат точками случайного цвета. размер квадрата ввести с клавиатуры:
Пример:

Задания «3»: Заполнить квадрат точками случайного цвета. размер квадрата ввести с клавиатуры:
Введите размер квадрата:
150
«4»: Заполнить две области точками случайного цвета:

Слайд 86

Задания

«5»: Заполнить область точками случайного цвета:

или

Задания «5»: Заполнить область точками случайного цвета: или

Слайд 87

Программирование на Python: графика

8. Игры

Программирование на Python: графика 8. Игры

Слайд 88

Танк с вращающейся пушкой

α

(x1,y1)

rectangle(x0-W/2, y0-H/2,
x0+W/2, y0+H/2)

circle(x0, y0, W/2)

line(x0, y0, x1, y1)

Танк с вращающейся пушкой α (x1,y1) rectangle(x0-W/2, y0-H/2, x0+W/2, y0+H/2) circle(x0, y0,

Слайд 89

Начальная картинка

from graph import *
import math
H = 60; W = 30; L

Начальная картинка from graph import * import math H = 60; W
= 40 # размеры танка
x0 = 200; y0 = 400; angle = 90 # пушка
brushColor("#6b8e23")
rectangle(x0-W/2, y0-H/2, x0+W/2, y0+H/2)
a = angle*math.pi/180 # в радианы
x1 = x0+L*math.cos(a)
y1 = y0-L*math.sin(a)
penSize(5)
line(x0, y0, x1, y1)
penSize(1)
brushColor("#556b2f")
circle(x0, y0, W/2)
run()

корпус

Слайд 90

Анимация поворота пушки

def keyPressed(event):
if event.keycode == VK_LEFT:
drawGun(angle+5) # влево на

Анимация поворота пушки def keyPressed(event): if event.keycode == VK_LEFT: drawGun(angle+5) # влево
5 градусов
elif event.keycode == VK_RIGHT:
drawGun(angle-5) # вправо на 5 градусов
elif event.keycode == VK_ESCAPE:
close()
...
onKey(keyPressed)

Слайд 91

Рисование и вращение пушки

def drawGun(angleNew):
global angle, gun # глобальные переменные
angle

Рисование и вращение пушки def drawGun(angleNew): global angle, gun # глобальные переменные
= angleNew # запомнить новый угол
aRad = angle*math.pi/180 # в радианы
x1 = x0 + L*math.cos(aRad)
y1 = y0 - L*math.sin(aRad)
if gun == None: # если в первый раз...
gun = line(x0, y0, x1, y1)
else: # если пушка уже нарисована
changeCoord(gun, [(x0,y0), (x1,y1)] )

Идея: в первый раз рисуем, потом просто меняем координаты.

сначала None – «пусто»

запомнить «адрес» линии

Слайд 92

Рисование и вращение пушки

gun = None # еще не рисовали пушку
drawGun(angle) #

Рисование и вращение пушки gun = None # еще не рисовали пушку
рисуем в первый раз
# теперь gun содержит адрес линии
...
def keyPressed(event):
drawGun(angle+5) # вращаем
# просто меняем координаты

Как это работает:

gun = line(x0, y0, x1, y1)

changeCoord(gun, [(x0,y0), (x1,y1)] )

Слайд 93

Полная программа

from graph import *
import math
def keyPressed(event):
...
def drawGun(angleNew):
...
H = 60;

Полная программа from graph import * import math def keyPressed(event): ... def
W = 30; L = 40
x0 = 200; y0 = 400; angle = 90
gun = None
brushColor("#6b8e23")
rectangle(x0-W/2, y0-H/2, x0+W/2, y0+H/2)
penSize(5)
drawGun(angle)
penSize(1)
brushColor("#556b2f")
circle(x0, y0, W/2)
onKey(keyPressed)
run()

корпус

Слайд 94

Задания

«3»: Сделать танк с управляемой пушкой, развёрнутый в обратную сторону:
«4»: Сделать

Задания «3»: Сделать танк с управляемой пушкой, развёрнутый в обратную сторону: «4»:
танк с управляемой пушкой, развёрнутый боком. Управление – клавишами "вверх" и "вниз":

Слайд 95

Задания

«5»: Сделать два танка, у одного пушка управляемся клавишами "влево" и "вправо",

Задания «5»: Сделать два танка, у одного пушка управляемся клавишами "влево" и
у второго – клавишами "вверх" и "вниз".

Слайд 96

Стрельба из пушки

нажали пробел"

Создание объекта:

x0 = 200; y0 = 400
r =

Стрельба из пушки нажали пробел" Создание объекта: x0 = 200; y0 =
3 # радиус снаряда
brushColor("black")
bullet = circle(x0, y0, r)

запомнили код объекта

Движение:

moveObjectBy(bullet, 0, -5)

по оси X

по оси Y

Слайд 97

Остановка при выходе за границу окна

определить y-координату объекта
если она меньше 0, то
остановить

Остановка при выходе за границу окна определить y-координату объекта если она меньше
движение
вернуть снаряд в исходное положение

y = coords(bullet)[1]
if y < 0:
isFlying = False
moveObjectTo(bullet, x0-r, y0-r)

isFlying – логическая переменная
True – снаряд летит, False – не летит.

Слайд 98

Как организовать анимацию?

def update():
global isFlying, bullet
if isFlying: # если летит...

Как организовать анимацию? def update(): global isFlying, bullet if isFlying: # если
y = coords(bullet)[1]
if y < 0: # если улетел...
isFlying = False
moveObjectTo(bullet, x0-r, y0-r)
else: # летит дальше...
moveObjectBy(bullet, 0, -5)
...
onTimer(update, 30)

вызывается каждые 30 мс

Слайд 99

Как запустить движение?

def keyPressed(event):
global isFlying
if event.keycode == VK_SPACE:
isFlying =

Как запустить движение? def keyPressed(event): global isFlying if event.keycode == VK_SPACE: isFlying
True # полетели!
elif event.keycode == VK_ESCAPE:
close() # закончить работу
...
onKey(keyPressed)

вызывается при нажатии клавиши

Слайд 100

Полная программа

from graph import *
def update():
...
def keyPressed(event):
...
x0 = 200; y0

Полная программа from graph import * def update(): ... def keyPressed(event): ...
= 400; r = 3
brushColor("black")
bullet = circle(x0, y0, r)
isFlying = False
onKey(keyPressed)
onTimer(update, 30)
run()

Слайд 101

Задания

«3»: Моделирование стрельбы слева направо. После выхода за границу экрана снаряд возвращается

Задания «3»: Моделирование стрельбы слева направо. После выхода за границу экрана снаряд
в исходную точку.
«4»: Дорисовать танк, из дула которого вылетает снаряд:

Слайд 102

Задания

«5»: Два танка стреляют одновременно.

Задания «5»: Два танка стреляют одновременно.

Слайд 103

Задания

«6»: Танк с поворотной башней. Выстрел происходит в ту сторону, в которую

Задания «6»: Танк с поворотной башней. Выстрел происходит в ту сторону, в которую повернут ствол:
повернут ствол:

Слайд 104

Стрельба по тарелкам

Счёт: 1

создать объекты-тарелки createPlates
двигать тарелки movePlates
проверить попадание в какую-нибудь тарелку checkCollision
проверить попадание в

Стрельба по тарелкам Счёт: 1 создать объекты-тарелки createPlates двигать тарелки movePlates проверить
конкретную тарелку hit

Слайд 105

Создание массива тарелок

def createPlates( N ):
global plates # глобальный массив
yPlates

Создание массива тарелок def createPlates( N ): global plates # глобальный массив
= 100 # у всех одна y-координата
plates = [] # пока массив пустой
for i in range(N):
brushColor( randColor() )
p = circle(randint(0,500), # x центра
yPlates, # y центра
randint(10,20)) # радиус
plates.append(p) # добавить в массив
...
createPlates( 5 ) # вызов процедуры

Слайд 106

Движение тарелок

def movePlates():
global plates # глобальный массив
for p in plates:

Движение тарелок def movePlates(): global plates # глобальный массив for p in
# для каждой тарелки
moveObjectBy(p, -2, 0) # сдвиг на 2 влево
x1,y1,x2,y2 = coords(p)
if x1 < 0: # если вышла за границу...
# перескочить вправо на ...
moveObjectBy(p, randint(500,600), 0)

Слайд 107

Попадание в какую-нибудь тарелку

def checkCollision():
global isFlying, bullet, plates
for p in

Попадание в какую-нибудь тарелку def checkCollision(): global isFlying, bullet, plates for p
plates:
if hit(p):
# перекинуть тарелку направо
moveObjectBy(p, randint(500,600), 0)
# снаряд в начальную точку
moveObjectTo(bullet, x0-r, y0-r)
isFlying = False # остановить снаряд
break # только одну тарелку за раз

hit(p) – логическая функция, которая возвращает
True, если снаряд (bullet) столкнулся с тарелкой p, и False, если не столкнулся.

Слайд 108

Попал ли снаряд в данную тарелку?

(xb,yb)

(xp,yp)

расстояние между центрами

Rp

r

Попал ли снаряд в данную тарелку? (xb,yb) (xp,yp) расстояние между центрами Rp r

Слайд 109

Попал ли снаряд в данную тарелку?

def hit(p):
...
if d2 <= (Rp

Попал ли снаряд в данную тарелку? def hit(p): ... if d2 return
+ r)**2:
return True
else:
return False

def hit(p):
...
return d2 <= (Rp + r)**2

Слайд 110

Попал ли снаряд в данную тарелку?

def hit(p):
global bullet
# координаты снаряда

Попал ли снаряд в данную тарелку? def hit(p): global bullet # координаты
x1,y1,x2,y2 = coords(bullet)
xb = x1 + r # центр снаряда
yb = y1 + r
# координаты тарелки
x1p,y1p,x2p,y2p = coords(p)
xp = (x1p + x2p) / 2
yp = (y1p + y2p) / 2
Rp = (x2p - x1p) / 2
d2 = (xb-xp)**2 + (yb-yp)**2
return d2 <= (Rp+r)**2

Слайд 111

Как вызывать эти функции?

def update():
global isFlying, bullet
movePlates()
if isFlying: #

Как вызывать эти функции? def update(): global isFlying, bullet movePlates() if isFlying:
если летит...
y = coords(bullet)[1]
if y < 0: # если улетел...
isFlying = False
moveObjectTo(bullet, x0-r, y0-r)
else: # летит дальше...
moveObjectBy(bullet, 0, -5)
checkCollision()
...
onTimer(update, 30)

вызывается каждые 30 мс

movePlates()

checkCollision()

Слайд 112

Полная программа

from graph import *
# тут все функции
...
x0 = 200;

Полная программа from graph import * # тут все функции ... x0
y0 = 400; r = 3
createPlates( 5 )
brushColor("black")
bullet = circle(x0, y0, r)
isFlying = False
onKey(keyPressed)
onTimer(update, 30)
run()

createPlates( 5 )

Слайд 113

Как вывести счёт игры?

Счёт: 1

Метка (элемент типа label)

переменная score

Сначала:

score = 0

При попадании:

score

Как вывести счёт игры? Счёт: 1 Метка (элемент типа label) переменная score
+= 1

Создание метки:

lbl = label("Счёт: 0",10,200,bg="white")

Изменение текста метки:

lbl["text"] = "Счёт: " + str(score)

строка из числа

фон

Слайд 114

Задания

«3»: Собрать и запустить программу. Увеличить скорость снаряда.
«4»: Выполнить задание на «3»

Задания «3»: Собрать и запустить программу. Увеличить скорость снаряда. «4»: Выполнить задание
для случая стрельбы слева направо (тарелки летят сверху вниз). Дорисовать танк, из дула которого вылетает снаряд.

Счёт: 12

Слайд 115

Задания

«5»: Дополнить задание на «4»: за попадание в более мелкую тарелку игрок

Задания «5»: Дополнить задание на «4»: за попадание в более мелкую тарелку
получает больше баллов.

Счёт: 12

Слайд 116

Задания

«6»: Сделать танк с вращающейся пушкой. Снаряд вылетает из ствола в том

Задания «6»: Сделать танк с вращающейся пушкой. Снаряд вылетает из ствола в
же направлении. За попадание в более мелкую тарелку игрок получает больше баллов.

Счёт: 12