- # подключаем графическую библиотеку
- from tkinter import *
- # подключаем модули, которые отвечают за время и случайные числа
- import time
- import random
- # создаём новый объект — окно с игровым полем. В нашем случае переменная окна называется tk, и мы его сделали из класса Tk() — он есть в графической библиотеке
- tk = Tk()
- # делаем заголовок окна — Games с помощью свойства объекта title
- tk.title('Game')
- # запрещаем менять размеры окна, для этого используем свойство resizable
- tk.resizable(0, 0)
- # помещаем наше игровое окно выше остальных окон на компьютере, чтобы другие окна не могли его заслонить. Попробуйте :)
- tk.wm_attributes('-topmost', 1)
- # создаём новый холст — 400 на 500 пикселей, где и будем рисовать игру
- canvas = Canvas(tk, width=500, height=400, highlightthickness=0)
- # говорим холсту, что у каждого видимого элемента будут свои отдельные координаты
- canvas.pack()
- # обновляем окно с холстом
- tk.update()
- # Описываем класс Ball, который будет отвечать за шарик
- class Ball:
- # конструктор — он вызывается в момент создания нового объекта на основе этого класса
- def __init__(self, canvas, paddle, score, color):
- # задаём параметры объекта, которые нам передают в скобках в момент создания
- self.canvas = canvas
- self.paddle = paddle
- self.score = score
- # цвет нужен был для того, чтобы мы им закрасили весь шарик
- # здесь появляется новое свойство id, в котором хранится внутреннее название шарика
- # а ещё командой create_oval мы создаём круг радиусом 15 пикселей и закрашиваем нужным цветом
- self.id = canvas.create_oval(10,10, 25, 25, fill=color)
- # помещаем шарик в точку с координатами 245,100
- self.canvas.move(self.id, 245, 100)
- # задаём список возможных направлений для старта
- starts = [-2, -1, 1, 2]
- # перемешиваем его
- random.shuffle(starts)
- # выбираем первый из перемешанного — это будет вектор движения шарика
- self.x = starts[0]
- # в самом начале он всегда падает вниз, поэтому уменьшаем значение по оси y
- self.y = -2
- # шарик узнаёт свою высоту и ширину
- self.canvas_height = self.canvas.winfo_height()
- self.canvas_width = self.canvas.winfo_width()
- # свойство, которое отвечает за то, достиг шарик дна или нет. Пока не достиг, значение будет False
- self.hit_bottom = False
- # обрабатываем касание платформы, для этого получаем 4 координаты шарика в переменной pos (левая верхняя и правая нижняя точки)
- def hit_paddle(self, pos):
- # получаем кординаты платформы через объект paddle (платформа)
- paddle_pos = self.canvas.coords(self.paddle.id)
- # если координаты касания совпадают с координатами платформы
- if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
- if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
- # увеличиваем счёт (обработчик этого события будет описан ниже)
- self.score.hit()
- # возвращаем метку о том, что мы успешно коснулись
- return True
- # возвращаем False — касания не было
- return False
- # метод, который отвечает за движение шарика
- def draw(self):
- # передвигаем шарик на заданный вектор x и y
- self.canvas.move(self.id, self.x, self.y)
- # запоминаем новые координаты шарика
- pos = self.canvas.coords(self.id)
- # если шарик падает сверху
- if pos[1] <= 0:
- # задаём падение на следующем шаге = 2
- self.y = 2
- # если шарик правым нижним углом коснулся дна
- if pos[3] >= self.canvas_height:
- # помечаем это в отдельной переменной
- self.hit_bottom = True
- # выводим сообщение и количество очков
- canvas.create_text(250, 120, text='Вы проиграли', font=('Courier', 30), fill='red')
- # если было касание платформы
- if self.hit_paddle(pos) == True:
- # отправляем шарик наверх
- self.y = -2
- # если коснулись левой стенки
- if pos[0] <= 0:
- # движемся вправо
- self.x = 2
- # если коснулись правой стенки
- if pos[2] >= self.canvas_width:
- # движемся влево
- self.x = -2
- # Описываем класс Paddle, который отвечает за платформы
- class Paddle:
- # конструктор
- def __init__(self, canvas, color):
- # canvas означает, что платформа будет нарисована на нашем изначальном холсте
- self.canvas = canvas
- # создаём прямоугольную платформу 10 на 100 пикселей, закрашиваем выбранным цветом и получаем её внутреннее имя
- self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
- # задаём список возможных стартовых положений платформы
- start_1 = [40, 60, 90, 120, 150, 180, 200]
- # перемешиваем их
- random.shuffle(start_1)
- # выбираем первое из перемешанных
- self.starting_point_x = start_1[0]
- # перемещаем платформу в стартовое положение
- self.canvas.move(self.id, self.starting_point_x, 300)
- # пока платформа никуда не движется, поэтому изменений по оси х нет
- self.x = 0
- # платформа узнаёт свою ширину
- self.canvas_width = self.canvas.winfo_width()
- # задаём обработчик нажатий
- # если нажата стрелка вправо — выполняется метод turn_right()
- self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
- # если стрелка влево — turn_left()
- self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
- # пока платформа не двигается, поэтому ждём
- self.started = False
- # как только игрок нажмёт Enter — всё стартует
- self.canvas.bind_all('<KeyPress-Return>', self.start_game)
- # движемся вправо
- def turn_right(self, event):
- # будем смещаться правее на 2 пикселя по оси х
- self.x = 2
- # движемся влево
- def turn_left(self, event):
- # будем смещаться левее на 2 пикселя по оси х
- self.x = -2
- # игра начинается
- def start_game(self, event):
- # меняем значение переменной, которая отвечает за старт движения платформы
- self.started = True
- # метод, который отвечает за движение платформы
- def draw(self):
- # сдвигаем нашу платформу на заданное количество пикселей
- self.canvas.move(self.id, self.x, 0)
- # получаем координаты холста
- pos = self.canvas.coords(self.id)
- # если мы упёрлись в левую границу
- if pos[0] <= 0:
- # останавливаемся
- self.x = 0
- # если упёрлись в правую границу
- elif pos[2] >= self.canvas_width:
- # останавливаемся
- self.x = 0
- # Описываем класс Score, который отвечает за отображение счетов
- class Score:
- # конструктор
- def __init__(self, canvas, color):
- # в самом начале счёт равен нулю
- self.score = 0
- # будем использовать наш холст
- self.canvas = canvas
- # создаём надпись, которая показывает текущий счёт, делаем его нужно цвета и запоминаем внутреннее имя этой надписи
- self.id = canvas.create_text(450, 10, text=self.score, font=('Courier', 15), fill=color)
- # обрабатываем касание платформы
- def hit(self):
- # увеличиваем счёт на единицу
- self.score += 1
- # пишем новое значение счёта
- self.canvas.itemconfig(self.id, text=self.score)
- # создаём объект — зелёный счёт
- score = Score(canvas, 'green')
- # создаём объект — белую платформу
- paddle = Paddle(canvas, 'White')
- # создаём объект — красный шарик
- ball = Ball(canvas, paddle, score, 'red')
- # пока шарик не коснулся дна
- while not ball.hit_bottom:
- # если игра началась и платформа может двигаться
- if paddle.started == True:
- # двигаем шарик
- ball.draw()
- # двигаем платформу
- paddle.draw()
- # обновляем наше игровое поле, чтобы всё, что нужно, закончило рисоваться
- tk.update_idletasks()
- # обновляем игровое поле и смотрим за тем, чтобы всё, что должно было быть сделано — было сделано
- tk.update()
- # замираем на одну сотую секунды, чтобы движение элементов выглядело плавно
- time.sleep(0.01)
- # если программа дошла досюда, значит, шарик коснулся дна. Ждём 3 секунды, пока игрок прочитает финальную надпись, и завершаем игру
- time.sleep(3)
[text] фу
Viewer
*** This page was generated with the meta tag "noindex, nofollow". This happened because you selected this option before saving or the system detected it as spam. This means that this page will never get into the search engines and the search bot will not crawl it. There is nothing to worry about, you can still share it with anyone.
Editor
You can edit this paste and save as new: