@Yraron_it

Неправильно работает def, а по какой причине не знаю. Вы можете мне помочь?

По какой-то причине в классе Ball, в функции __init__ ошибка. Python не читает последний элемент (без разницы какой ставить на последнее место).
Код
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)
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
Hivemaster
@Hivemaster
Админ, который хочет программировать
Вы в конструктор передаёте меньше параметров, чем нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы