[text] фу

Viewer

  1. # подключаем графическую библиотеку
  2. from tkinter import *
  3. # подключаем модули, которые отвечают за время и случайные числа
  4. import time
  5. import random
  6. # создаём новый объект — окно с игровым полем. В нашем случае переменная окна называется tk, и мы его сделали из класса Tk() — он есть в графической библиотеке 
  7. tk = Tk()
  8. # делаем заголовок окна — Games с помощью свойства объекта title
  9. tk.title('Game')
  10. # запрещаем менять размеры окна, для этого используем свойство resizable 
  11. tk.resizable(0, 0)
  12. # помещаем наше игровое окно выше остальных окон на компьютере, чтобы другие окна не могли его заслонить. Попробуйте :)
  13. tk.wm_attributes('-topmost', 1)
  14. # создаём новый холст — 400 на 500 пикселей, где и будем рисовать игру
  15. canvas = Canvas(tk, width=500, height=400, highlightthickness=0)
  16. # говорим холсту, что у каждого видимого элемента будут свои отдельные координаты 
  17. canvas.pack()
  18. # обновляем окно с холстом
  19. tk.update()
  20. # Описываем класс Ball, который будет отвечать за шарик 
  21. class Ball:
  22.     # конструктор — он вызывается в момент создания нового объекта на основе этого класса
  23.     def __init__(self, canvas, paddle, score, color):
  24.         # задаём параметры объекта, которые нам передают в скобках в момент создания
  25.         self.canvas = canvas
  26.         self.paddle = paddle
  27.         self.score = score
  28.         # цвет нужен был для того, чтобы мы им закрасили весь шарик
  29.         # здесь появляется новое свойство id, в котором хранится внутреннее название шарика
  30.         # а ещё командой create_oval мы создаём круг радиусом 15 пикселей и закрашиваем нужным цветом
  31.         self.id = canvas.create_oval(10,10, 25, 25, fill=color)
  32.         # помещаем шарик в точку с координатами 245,100
  33.         self.canvas.move(self.id, 245, 100)
  34.         # задаём список возможных направлений для старта
  35.         starts = [-2, -1, 1, 2]
  36.         # перемешиваем его 
  37.         random.shuffle(starts)
  38.         # выбираем первый из перемешанного — это будет вектор движения шарика
  39.         self.x = starts[0]
  40.         # в самом начале он всегда падает вниз, поэтому уменьшаем значение по оси y
  41.         self.y = -2
  42.         # шарик узнаёт свою высоту и ширину
  43.         self.canvas_height = self.canvas.winfo_height()
  44.         self.canvas_width = self.canvas.winfo_width()
  45.         # свойство, которое отвечает за то, достиг шарик дна или нет. Пока не достиг, значение будет False
  46.         self.hit_bottom = False
  47.     # обрабатываем касание платформы, для этого получаем 4 координаты шарика в переменной pos (левая верхняя и правая нижняя точки)
  48.     def hit_paddle(self, pos):
  49.         # получаем кординаты платформы через объект paddle (платформа)
  50.         paddle_pos = self.canvas.coords(self.paddle.id)
  51.         # если координаты касания совпадают с координатами платформы
  52.         if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
  53.             if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
  54.                 # увеличиваем счёт (обработчик этого события будет описан ниже)
  55.                 self.score.hit()
  56.                 # возвращаем метку о том, что мы успешно коснулись
  57.                 return True
  58.         # возвращаем False — касания не было
  59.         return False
  60.     # метод, который отвечает за движение шарика
  61.     def draw(self):
  62.         # передвигаем шарик на заданный вектор x и y
  63.         self.canvas.move(self.id, self.x, self.y)
  64.         # запоминаем новые координаты шарика
  65.         pos = self.canvas.coords(self.id)
  66.         # если шарик падает сверху  
  67.         if pos[1] <= 0:
  68.             # задаём падение на следующем шаге = 2
  69.             self.y = 2
  70.         # если шарик правым нижним углом коснулся дна
  71.         if pos[3] >= self.canvas_height:
  72.             # помечаем это в отдельной переменной
  73.             self.hit_bottom = True
  74.             # выводим сообщение и количество очков
  75.             canvas.create_text(250, 120, text='Вы проиграли', font=('Courier', 30), fill='red')
  76.         # если было касание платформы
  77.         if self.hit_paddle(pos) == True:
  78.             # отправляем шарик наверх
  79.             self.y = -2
  80.         # если коснулись левой стенки
  81.         if pos[0] <= 0:
  82.             # движемся вправо
  83.             self.x = 2
  84.         # если коснулись правой стенки
  85.         if pos[2] >= self.canvas_width:
  86.             # движемся влево
  87.             self.x = -2
  88. #  Описываем класс Paddle, который отвечает за платформы
  89. class Paddle:
  90.     # конструктор
  91.     def __init__(self, canvas, color):
  92.         # canvas означает, что платформа будет нарисована на нашем изначальном холсте
  93.         self.canvas = canvas
  94.         # создаём прямоугольную платформу 10 на 100 пикселей, закрашиваем выбранным цветом и получаем её внутреннее имя 
  95.         self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
  96.         # задаём список возможных стартовых положений платформы
  97.         start_1 = [40, 60, 90, 120, 150, 180, 200]
  98.         # перемешиваем их
  99.         random.shuffle(start_1)
  100.         # выбираем первое из перемешанных
  101.         self.starting_point_x = start_1[0]
  102.         # перемещаем платформу в стартовое положение
  103.         self.canvas.move(self.id, self.starting_point_x, 300)
  104.         # пока платформа никуда не движется, поэтому изменений по оси х нет
  105.         self.x = 0
  106.         # платформа узнаёт свою ширину
  107.         self.canvas_width = self.canvas.winfo_width()
  108.         # задаём обработчик нажатий
  109.         # если нажата стрелка вправо — выполняется метод turn_right()
  110.         self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
  111.         # если стрелка влево — turn_left()
  112.         self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
  113.         # пока платформа не двигается, поэтому ждём
  114.         self.started = False
  115.         # как только игрок нажмёт Enter — всё стартует
  116.         self.canvas.bind_all('<KeyPress-Return>', self.start_game)
  117.     # движемся вправо 
  118.     def turn_right(self, event):
  119.         # будем смещаться правее на 2 пикселя по оси х
  120.         self.x = 2
  121.     # движемся влево
  122.     def turn_left(self, event):
  123.         # будем смещаться левее на 2 пикселя по оси х
  124.         self.x = -2
  125.     # игра начинается
  126.     def start_game(self, event):
  127.         # меняем значение переменной, которая отвечает за старт движения платформы
  128.         self.started = True
  129.     # метод, который отвечает за движение платформы
  130.     def draw(self):
  131.         # сдвигаем нашу платформу на заданное количество пикселей
  132.         self.canvas.move(self.id, self.x, 0)
  133.         # получаем координаты холста
  134.         pos = self.canvas.coords(self.id)
  135.         # если мы упёрлись в левую границу 
  136.         if pos[0] <= 0:
  137.             # останавливаемся
  138.             self.x = 0
  139.         # если упёрлись в правую границу 
  140.         elif pos[2] >= self.canvas_width:
  141.             # останавливаемся
  142.             self.x = 0
  143. #  Описываем класс Score, который отвечает за отображение счетов
  144. class Score:
  145.     # конструктор
  146.     def __init__(self, canvas, color):
  147.         # в самом начале счёт равен нулю
  148.         self.score = 0
  149.         # будем использовать наш холст
  150.         self.canvas = canvas
  151.         # создаём надпись, которая показывает текущий счёт, делаем его нужно цвета и запоминаем внутреннее имя этой надписи
  152.         self.id = canvas.create_text(450, 10, text=self.score, font=('Courier', 15), fill=color)
  153.     # обрабатываем касание платформы
  154.     def hit(self):
  155.         # увеличиваем счёт на единицу
  156.         self.score += 1
  157.         # пишем новое значение счёта 
  158.         self.canvas.itemconfig(self.id, text=self.score)
  159. # создаём объект — зелёный счёт 
  160. score = Score(canvas, 'green')
  161. # создаём объект — белую платформу
  162. paddle = Paddle(canvas, 'White')
  163. # создаём объект — красный шарик 
  164. ball = Ball(canvas, paddle, score, 'red')
  165. # пока шарик не коснулся дна 
  166. while not ball.hit_bottom:
  167.     # если игра началась и платформа может двигаться
  168.     if paddle.started == True:
  169.         # двигаем шарик
  170.         ball.draw()
  171.         # двигаем платформу
  172.         paddle.draw()
  173.     # обновляем наше игровое поле, чтобы всё, что нужно, закончило рисоваться
  174.     tk.update_idletasks()
  175.     # обновляем игровое поле и смотрим за тем, чтобы всё, что должно было быть сделано — было сделано
  176.     tk.update()
  177.     # замираем на одну сотую секунды, чтобы движение элементов выглядело плавно
  178.     time.sleep(0.01)
  179. # если программа дошла досюда, значит, шарик коснулся дна. Ждём 3 секунды, пока игрок прочитает финальную надпись, и завершаем игру
  180. time.sleep(3)

Editor

You can edit this paste and save as new:


File Description
  • фу
  • Paste Code
  • 23 May-2022
  • 11.76 Kb
You can Share it: