Advertisement
codesafety_x11repo

Untitled

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