Найти - Пользователи
Полная версия: Я новичок в программировании, помогите убрать баги в простой игре.
Начало » Центр помощи » Я новичок в программировании, помогите убрать баги в простой игре.
1 2
vlleon
Я новичок в программировании, поэтому обучаюсь по книге: R.Briggs.Python for kids - 2017. Дошёл до примера игры “Прыг-скок”. При запуске кода, программа выдаёт ошибку “TypeError: __init__() takes 3 positional arguments but 4 were given” в строке “ball = Ball(canvas, paddle,'red')”. Я понимаю, что строка ранее, а именно “paddle = Paddle(canvas, ‘blue’)” присваивает два аргумента для paddle, которые потом и передаются в аргументы переменной ball. Но что с этим сделать, не пойму. Ко всему прочему, программа запускается, мелькает и сразу закрывается. Python 3.7.4.
FishHook
 from tkinter import *
import random
import time
class Ball:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.paddle = paddle
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-3, -2, -1, 1, 2, 3]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -3
        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]:
            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] <= 0:
            self.y = 3
        if pos[3] >= self.canvas_height:
            self.y = -3
        if pos[0] <= 0:
            self.x = 3
        if pos[2] >= self.canvas_width:
            self.x = -3
class Paddle:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
        self.canvas.move(self.id, 200, 300)
        self.x = 0
        self.canvas_width = self.canvas.winfo_width()
        self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
    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
    def turn_left(self, evt):
        self.x = -2
    def turn_right(self, evt):
        self.x = 2
tk = Tk()
tk.title("Игра")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()
paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle,'red')
while 1:
    if ball.hit_bottom == False:
        ball.draw()
        paddle.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)
mainloop()
FishHook
канвас, колор
 class Ball:
    def __init__(self, canvas, color):

канвас, паддл, рэд
   
ball = Ball(canvas, paddle, 'red')

Тадам!
vlleon
FishHook
Сорри, ибо я в начале этого трудного пути, но в чём различие исходного кода и того что написали Вы? Я вижу те же строки, что и в исходнике. С ув.
JOHN_16
Видимо страница 196 прям по центру
FishHook
vlleon
и того что написали Вы
Я ничего не писал, это ваш код и есть, просто вы очень долго мучались, но так и не осилили запостить код. Я вам помог. И ниже же показал где в вашем коде ошибка.
vlleon
FishHook
Где ошибка, я осознаю сам, я об этом написал в начальном тексте. Проблемка в том, как её исправить! Будь я поопытнее, я бы нашёл сам. А так приходиться унижаться в разделах для НОВИЧКОВ! С ув.
FishHook
vlleon

Ну до трех то посчитать у вас хватает опыта?
Инициализатор класса принимает только два аргумента, а вы передаете ему три. Как исправить? Разобраться со своим собственным кодом и ответить на вопрос: нахрена вы передаете три аргумента в функцию, которая может принять только два.


class Ball:
def __init__(self, canvas (раз), color(два)):

ball = Ball(canvas(раз), paddle(два), ‘red’(три))


Ей богу, не знаю, чем тут еще можно помочь!
Evgen_irk
Исправить класс Ball
 class Ball:
    def __init__(self, canvas, paddle, color):
        self.canvas = canvas
        self.paddle = paddle
vlleon
FishHook
Спасибо, большое! Код исправил, нашёл ещё ошибки в отсупах в итоге всё работает! Вот код:
from tkinter import *
import random
import time
class Ball:
def __init__(self, canvas, paddle, color):
self.canvas = canvas
self.paddle = paddle
self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
self.canvas.move(self.id, 245, 100)
starts = [-3, -2, -1, 1, 2, 3]
random.shuffle(starts)
self.x = starts[0]
self.y = -3
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]:
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] <= 0:
self.y = 3
if pos[3] >= self.canvas_height:
self.y = -3
if pos[0] <= 0:
self.x = 3
if pos[2] >= self.canvas_width:
self.x = -3

class Paddle:
def __init__(self, canvas, color):
self.canvas = canvas
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 200, 300)
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
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
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2

tk = Tk()
tk.title("Игра")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()
paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red')

while 1:
if ball.hit_bottom == False:
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)

mainloop()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB