from tkinter import *
import time
import random
from qwerty import Wall1, Wall2, Wall3
tk = Tk()
tk.title('Game')
tk.resizable(0, 0)
tk.wm_attributes('-topmost', 1)
canvas = Canvas(tk, width=800, height=830, highlightthickness=0, bg = '#3CB371')
canvas.pack()
tk.update()
class Ball:
def __init__(self, score, color, canvas, paddle, paddle_2):
self.canvas = canvas
self.paddle = paddle
self.score = score
self.paddle_2 = paddle_2
self.id = canvas.create_oval(10,10, 25, 25, fill=color)
self.canvas.move(self.id, 400, 400)
starts_х = [-1, 1]
random.shuffle(starts_х)
starts_y = [-1, 1]
random.shuffle(starts_y)
self.x = starts_х[0]
self.y = starts_y[0]
self.canvas_height = self.canvas.winfo_height()
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False
def hit_paddle(self, pos):
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
return False
def hit_paddle_2(self, pos):
paddle_pos_2 = self.canvas.coords(self.paddle_2.id)
if pos[2] <= paddle_pos_2[0] and pos[0] >= paddle_pos_2[2]:
if pos[3] <= paddle_pos_2[1] and pos[3] >= paddle_pos_2[3]:
self.score.hit()
return True
return False
def draw(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id)
if pos[1] <= 10:
self.y = 2
if pos[3] >= self.canvas_height:
self.hit_bottom = True
# выводим сообщение и количество очков
canvas.create_text(350, 120, text='Вы проиграли', font=('Courier', 30), fill='#FF0000')
# если было касание платформы
if self.hit_paddle(pos) == True:
# отправляем шарик наверх
self.y = -3
if self.hit_paddle_2(pos) == True:
# отправляем шарик наверх
self.y = -3
# если коснулись левой стенки
if pos[0] <= 10:
# движемся вправо
self.x = 3
# если коснулись правой стенки
if pos[2] >= self.canvas_width - 10:
# движемся влево
self.x = -3
# Описываем класс 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 = [120, 160, 200, 240, 280, 320, 360]
# перемешиваем их
random.shuffle(start_1)
# выбираем первое из перемешанных
self.starting_point_x = start_1[0]
# перемещаем платформу в стартовое положение
self.canvas.move(self.id, self.starting_point_x, 50)
# пока платформа никуда не движется, поэтому изменений по оси х нет
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 = 3
# движемся влево
def turn_left(self, event):
# будем смещаться левее на 2 пикселя по оси х
self.x = -3
def hit(self):
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
# движемся вправо
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] <= 10:
print(pos[0])
# останавливаемся
self.x = 2
# если упёрлись в правую границу
elif pos[2] >= 790:
print(pos[2])
# останавливаемся
self.x = -2
class Paddle_2:
# конструктор
def __init__(self, canvas, color):
# canvas означает, что платформа будет нарисована на нашем изначальном холсте
self.canvas_2 = canvas
# создаём прямоугольную платформу 10 на 100 пикселей, закрашиваем выбранным цветом и получаем её внутреннее имя
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
# задаём список возможных стартовых положений платформы
start_1_2 = [120, 160, 200, 240, 280, 320, 360]
# перемешиваем их
random.shuffle(start_1_2)
# выбираем первое из перемешанных
self.starting_point_x_2 = start_1_2[0]
# перемещаем платформу в стартовое положение
self.canvas_2.move(self.id, self.starting_point_x_2, 780)
# пока платформа никуда не движется, поэтому изменений по оси х нет
self.x = 0
# платформа узнаёт свою ширину
self.canvas_width_2 = self.canvas_2.winfo_width()
# задаём обработчик нажатий
# если нажата стрелка вправо — выполняется метод turn_right()
self.canvas_2.bind_all('<d>', self.turn_right)
# если стрелка влево — turn_left()
self.canvas_2.bind_all('<a>', self.turn_left)
# движемся вправо
def turn_right(self, event):
# будем смещаться правее на 2 пикселя по оси х
self.x = 3
# движемся влево
def turn_left(self, event):
# будем смещаться левее на 2 пикселя по оси х
self.x = -3
def hit(self):
pos_2 = self.canvas.coords(self.id)
if pos_2[0] <= 0:
# движемся вправо
self.x = 2
# игра начинается
def start_game(self, event):
# меняем значение переменной, которая отвечает за старт движения платформы
self.started_2 = True
# метод, который отвечает за движение платформы
def draw(self):
# сдвигаем нашу платформу на заданное количество пикселей
self.canvas_2.move(self.id, self.x, 0)
# получаем координаты холста
pos_2 = self.canvas_2.coords(self.id)
# если мы упёрлись в левую границу
if pos_2[0] <= 10:
print(pos_2[0])
# останавливаемся
self.x = 2
# если упёрлись в правую границу
elif pos_2[2] >= 790:
print(pos_2[2])
# останавливаемся
self.x = -2
# Описываем класс Score, который отвечает за отображение счетов
class Score:
# конструктор
def __init__(self, canvas, color):
# в самом начале счёт равен нулю
self.score = 0
# будем использовать наш холст
self.canvas = canvas
# создаём надпись, которая показывает текущий счёт, делаем его нужно цвета и запоминаем внутреннее имя этой надписи
self.id = canvas.create_text(780, 20, text=self.score, font=('Courier', 15), fill=color)
# обрабатываем касание платформы
def hit(self):
# увеличиваем счёт на единицу
self.score += 1
# пишем новое значение счёта
self.canvas.itemconfig(self.id, text=self.score)
wall3 = Wall3(canvas, 'black')
wall2 = Wall2(canvas, 'black')
wall1 = Wall1(canvas, 'black')
# создаём объект — зелёный счёт
score = Score(canvas, 'black')
# создаём объект — белую платформу
paddle = Paddle(canvas, 'White')
# создаём объект — белую платформу
paddle_2 = Paddle_2(canvas, 'White')
# создаём объект — красный шарик
ball = Ball(canvas, paddle, score, 'red')
# пока шарик не коснулся дна
while not ball.hit_bottom:
# если игра началась и платформа может двигаться
if paddle.started == True:
# двигаем шарик
ball.draw()
# двигаем платформу
paddle.draw()
paddle_2.draw()
# обновляем наше игровое поле, чтобы всё, что нужно, закончило рисоваться
tk.update_idletasks()
# обновляем игровое поле и смотрим за тем, чтобы всё, что должно было быть сделано — было сделано
tk.update()
# замираем на одну сотую секунды, чтобы движение элементов выглядело плавно
time.sleep(0.01)
# если программа дошла досюда, значит, шарик коснулся дна. Ждём 3 секунды, пока игрок прочитает финальную надпись, и завершаем игру
time.sleep(3)