Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2019 15:59:16

vlleon
Зарегистрирован: 2019-08-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

Я новичок в программировании, поэтому обучаюсь по книге: 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.

Прикреплённый файлы:
attachment Grafika_11.py (2,3 KБ)

Офлайн

#2 Авг. 15, 2019 16:42:23

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

 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()



Офлайн

#3 Авг. 15, 2019 16:44:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

канвас, колор

 class Ball:
    def __init__(self, canvas, color):

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

Тадам!



Офлайн

#4 Авг. 15, 2019 16:53:00

vlleon
Зарегистрирован: 2019-08-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

FishHook
Сорри, ибо я в начале этого трудного пути, но в чём различие исходного кода и того что написали Вы? Я вижу те же строки, что и в исходнике. С ув.

Офлайн

#5 Авг. 15, 2019 16:54:36

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

Видимо страница 196 прям по центру



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Авг. 15, 2019 17:31:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

vlleon
и того что написали Вы
Я ничего не писал, это ваш код и есть, просто вы очень долго мучались, но так и не осилили запостить код. Я вам помог. И ниже же показал где в вашем коде ошибка.



Офлайн

#7 Авг. 15, 2019 17:37:12

vlleon
Зарегистрирован: 2019-08-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

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

Офлайн

#8 Авг. 15, 2019 18:05:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

vlleon

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


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

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


Ей богу, не знаю, чем тут еще можно помочь!



Отредактировано FishHook (Авг. 15, 2019 18:08:54)

Офлайн

#9 Авг. 15, 2019 18:09:23

Evgen_irk
От: Иркутск
Зарегистрирован: 2009-02-02
Сообщения: 45
Репутация: +  4  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

Исправить класс Ball

 class Ball:
    def __init__(self, canvas, paddle, color):
        self.canvas = canvas
        self.paddle = paddle



wxPython

Офлайн

#10 Авг. 15, 2019 18:18:09

vlleon
Зарегистрирован: 2019-08-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Я новичок в программировании, помогите убрать баги в простой игре.

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()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version