Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 19, 2017 17:21:00

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

книга Phython для детей Джейсон Бриггс

Всем привет

Кто читал эту книгу, или не читал, но шарит. Не идет вторая игра про человечка. Вылетает ошибка:

Traceback (most recent call last):
File “C:\Users\Администратор\Desktop\RunningMan Py\RunningMan.py”, line 271, in <module>
g.mainloop()
File “C:\Users\Администратор\Desktop\RunningMan Py\RunningMan.py”, line 30, in mainloop
sprite.move()
File “C:\Users\Администратор\Desktop\RunningMan Py\RunningMan.py”, line 224, in move
and collided_bottom(1, co, sprite_co):
NameError: name ‘collided_bottom’ is not defined

В архиве лежит сам модуль, если кому не сложно глянуть почему вылетает ошибка.


или вот тут код, но без спрайтов:

 from tkinter import *
import random
import time
class Game:
    def __init__(self):
        self.tk = Tk()
        self.tk.title("Running man")
        self.tk.resizable(0, 0)
        self.tk.wm_attributes("-topmost", 1)
        self.canvas = Canvas(self.tk, width=500, height=500, highlightthickness=0)
        self.canvas.pack()
        self.tk.update()
        self.canvas_height = 500
        self.canvas_width = 500
        self.bg = PhotoImage(file="background.gif")
        backGroundWidth = self.bg.width()
        backGroundHeight = self.bg.height()
        for stroka in range(5):
            for stolbik in range(5):
                self.canvas.create_image(stroka * backGroundWidth, stolbik * backGroundHeight, \
                                        image=self.bg, anchor='nw')
                self.sprites = []
                self.running = True
    def mainloop(self):
        while 1:
            if self.running == True:
               for sprite in self.sprites:
                    sprite.move()
            self.tk.update_idletasks()
            self.tk.update()
            time.sleep(0.01)
class Coords:
    def __init__(self, x1=0, y1=0, x2=0, y2=0):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
    def within_x(co1, co2):
        if (co1.x1 > co2.x1 and co1.x1 < co2.x2) \
        or (co1.x2 > co2.x1 and co1.x2 < co2.x2) \
        or (co2.x1 > co1.x1 and co2.x1 < co1.x2) \
        or (co2.x2 > co1.x1 and co2.x2 < co1.x2):
            return True
        else:
            return False
    def within_y(co1, co2):
        if (co1.y1 > co2.y1 and co1.y1 < co2.y2) \
        or (co1.y2 > co2.y1 and co1.y2 < co2.y2) \
        or (co2.y1 > co1.y1 and co2.y1 < co1.y2) \
        or (co2.y2 > co1.y1 and co2.y2 < co1.y2):
            return True
        else:
            return False
    def collided_left(co1, co2):
        if within_y(co1, co2):
            if co1.x1 <= co2.x2 and co1.x1 >= co2.x1:
                return True
        return False
    def collided_right(co1, co2):
        if within_y(co1, co2):
            if co1.x2 >= co2.x1 and co1.x2 <= co2.x2:
                return True
        return False
    def collided_top(co1, co2):
        if within_x(co1, co2):
            if co1.y1 <= co2.y2 and co1.y1 >= co2.y1:
                return True
        return False
    def collided_bottom(y, co1, co2):
        if within_x(co1, co2):
            y_calc = co1.y2 + y
            if y_calc >= co2.y1 and y_calc <= co2.y2:
                return True
        return False
class Sprite:
    def __init__(self, game):
        self.game = game
        self.endgame = False
        self.coordinates = None
    def move(self):
        pass
    def coords(self):
        return self.coordinates
class PlatformSprite(Sprite):
    def __init__(self, game, photo_image, x, y, width, height):
        Sprite.__init__(self, game)
        self.photo_image = photo_image
        self.image = game.canvas.create_image(x, y, \
                            image=self.photo_image, anchor='nw')
        self.coordinates = Coords(x, y, x + width, y + height)
class StickFigureSprite(Sprite):
    def __init__(self, game):
        Sprite.__init__(self, game)
        self.images_left = [
            PhotoImage(file="chel1l.gif"),
            PhotoImage(file="chel2l.gif"),
            PhotoImage(file="chel3l.gif"),
            ]
        self.images_right = [
            PhotoImage(file="chel1r.gif"),
            PhotoImage(file="chel2r.gif"),
            PhotoImage(file="chel3r.gif"),
            ]
        self.image = game.canvas.create_image(200, 470, \
                    image=self.images_left[0], anchor='nw')
        self.x = -2
        self.y = 0
        self.current_image = 0
        self.current_image_add = 1
        self.jump_count = 0
        self.last_time = time.time()
        self.coordinates = Coords()
        game.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        game.canvas.bind_all('<KeyPress-Right>', self.turn_right)
        game.canvas.bind_all('<space>', self.jump)
    def turn_left(self, evt):
        if self.y == 0:
            self.x = -2
    def turn_right(self, evt):
        if self.y == 0:
            self.x = 2
    def jump(self, evt):
        if self.y == 0:
            self.y = -4
            self.jump_count = 0
    def animate(self):
        if self.x != 0 and self.y == 0:
            if time.time() - self.last_time > 0.1:
                self.last_time = time.time()
                self.current_image += self.current_image_add
                if self.current_image >= 2:
                    self.current_image_add = -1
                if self.current_image <= 0:
                    self.current_image_add = 1
        if self.x < 0:
            if self.y != 0:
                self.game.canvas.itemconfig(self.image, \
                                image=self.images_left[2])
            else:
                self.game.canvas.itemconfig(self.image, \
                                image=self.images_left[self.current_image])
        elif self.x > 0:
            if self.y != 0:
                self.game.canvas.itemconfig(self.image, \
                            image=self.images_right[2])
            else:
                self.game.canvas.itemconfig(self.image, \
                            image=self.images_right[self.current_image])
    def coords(self):
        xy = self.game.canvas.coords(self.image)
        self.coordinates.x1 = xy[0]
        self.coordinates.y1 = xy[1]
        self.coordinates.x2 = xy[0] + 27                                                        
        self.coordinates.y1 = xy[1] + 30
        return self.coordinates
        
    def move(self):
        self.animate()
        if self.y < 0:
            self.jump_count += 1
            if self.jump_count > 20:
                self.y = 4
        if self.y > 0:
            self.jump_count -= 1
        co = self.coords()
        left = True
        right = True
        top = True
        bottom = True
        falling = True
        if self.y > 0 and co.y2 >= self.game.canvas_height:
            self.y = 0
            bottom = False
        elif self.y < 0 and co.y1 <= 0:
            self.y = 0
            top = False
        if self.x > 0 and co.x2 >= self.game.canvas_width:
            self.x = 0
            right = False
        elif self.x < 0 and co.x1 <= 0:
            self.x = 0
            left = False
        for sprite in self.game.sprites:
            if sprite == self:
                continue
            sprite_co = sprite.coords()
            if top and self.y < 0 and collided_top(co, sprite_co):
                self.y = -self.y
                top = False
            if bottom and self.y > 0 and collided_bottom(self.y, \
                            co, sprite_co):
                self.y = sprite_co.y1 - co.y2
                if self.y < 0:
                    self.y = 0
                bottom = False
                top = False
            if bottom and falling and self.y == 0 and co.y2 < self.game.canvas_height and collided_bottom(1, co, sprite_co):
                falling = False
            if left and self.x < 0 and collided_left(co, sprite_co):
                self.x = 0
                left = False
            if right and self.x > 0 and collided_right(co, sprite_co):
                self.x = 0
                right = False
        if falling and bottom and self.y == 0 \
                   and co.y2 < self.game.canvas_height:
            self.y = 4
        self.game.canvas.move(self.image, self.x, self.y)
g = Game()
platform1 = PlatformSprite(g, PhotoImage(file="platform1.gif"),\
                           0, 480, 100, 10)
platform2 = PlatformSprite(g, PhotoImage(file="platform1.gif"), \
                            150, 440, 100, 10)
platform3 = PlatformSprite(g, PhotoImage(file="platform1.gif"), \
                300, 400, 100, 10)
platform4 = PlatformSprite(g, PhotoImage(file="platform1.gif"), \
        300, 160, 100, 10)
platform5 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \
        175, 350, 66, 10)
platform6 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \
        50, 300, 66, 10)
platform7 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \
        170, 120, 66, 10)
platform8 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \
        45, 60, 66, 10)
platform9 = PlatformSprite(g, PhotoImage(file="platform3.gif"), \
        170, 250, 32, 10)
platform10 = PlatformSprite(g, PhotoImage(file="platform3.gif"), \
        230, 200, 32, 10)
g.sprites.append(platform1)
g.sprites.append(platform2)
g.sprites.append(platform3)
g.sprites.append(platform4)
g.sprites.append(platform5)
g.sprites.append(platform6)
g.sprites.append(platform7)
g.sprites.append(platform8)
g.sprites.append(platform9)
g.sprites.append(platform10)
sf = StickFigureSprite(g)
g.sprites.append(sf)
g.mainloop()
                    
        

Прикреплённый файлы:
attachment RunningMan Py.7z (10,6 KБ)

Офлайн

#2 Сен. 19, 2017 17:41:32

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

книга Phython для детей Джейсон Бриггс

Brain
Вот до этого метода у вас была в аргументах методов была ссылка на объект self, и что характерно, атрибуты объекта вы получали правильно - через ссылку на объект

  def __init__(self, x1=0, y1=0, x2=0, y2=0):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2

А потом вы на это забили почему-то. Где self?
     def within_x(co1, co2):
        if (co1.x1 > co2.x1 and co1.x1 < co2.x2) \
        or (co1.x2 > co2.x1 and co1.x2 < co2.x2) \
        or (co2.x1 > co1.x1 and co2.x1 < co1.x2) \
        or (co2.x2 > co1.x1 and co2.x2 < co1.x2):

Что такое within_x? Если это атрибут объекта, то его можно получить только через ссылку на объект.
 def collided_top(co1, co2):
        if within_x(co1, co2):
            if co1.y1 <= co2.y2 and co1.y1 >= co2.y1:
                return True
        return False

Должно быть так
 def collided_top(self, co1, co2):
        if self.within_x(co1, co2):



Отредактировано FishHook (Сен. 19, 2017 17:41:49)

Офлайн

#3 Сен. 19, 2017 19:35:46

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

книга Phython для детей Джейсон Бриггс

Весь код из книги взят, своего ничего не добавлено.

Офлайн

#4 Сен. 19, 2017 21:50:13

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

книга Phython для детей Джейсон Бриггс

Покажите фрагмент книги что бы мы могли решить кто прав,а кто нет.



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

Офлайн

#5 Сен. 19, 2017 22:30:42

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

книга Phython для детей Джейсон Бриггс

Ну дык оно вам пишет:

Brain
NameError: name ‘collided_bottom’ is not defined
толи вы не все скопипастили, толи чтото упустили
collided_bottom,так же как и остальные collided_….. и within_… у вас вроде как методы класса Coords хотя аргумент self отсутвует везде как и декоратор @staticmethod. Из чего можно сделать вывод что скорее всего вы неправильно расствили отсупы, и эти функции должны быть описаны в скрипте, а не в классе .



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Сен. 20, 2017 05:58:53

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

книга Phython для детей Джейсон Бриггс

Brain
Весь код из книги взят, своего ничего не добавлено.
У что вы хотите этим сказать? Какая разница, откуда вы взяли этот код, если он не верен?



Офлайн

#7 Сен. 20, 2017 09:35:40

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

книга Phython для детей Джейсон Бриггс

JOHN_16
Покажите фрагмент книги что бы мы могли решить кто прав,а кто нет.

Вот в архиве скрины из книги с кодом.

Отредактировано Brain (Сен. 20, 2017 09:36:03)

Прикреплённый файлы:
attachment screens.7z (548,5 KБ)

Офлайн

#8 Сен. 20, 2017 09:38:07

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

книга Phython для детей Джейсон Бриггс

PEHDOM
толи вы не все скопипастили, толи чтото упустили
collided_bottom,так же как и остальные collided_….. и within_… у вас вроде как методы класса Coords хотя аргумент self отсутвует везде как и декоратор @staticmethod. Из чего можно сделать вывод что скорее всего вы неправильно расствили отсупы, и эти функции должны быть описаны в скрипте, а не в классе .

Согласен, мне тоже не понятно, почему напрямую вызываются методы другого объекта без указания самого объекта. С отступами вроде все верно, можете глянуть в первом посте приложен .py. И это не отдельные функции, все они описаны в классе Coords.

Офлайн

#9 Сен. 20, 2017 09:40:08

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

книга Phython для детей Джейсон Бриггс

FishHook
У что вы хотите этим сказать? Какая разница, откуда вы взяли этот код, если он не верен?
Поэтому я и попросил помощи, т.к. опыта мало.

Офлайн

#10 Сен. 20, 2017 09:47:08

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

книга Phython для детей Джейсон Бриггс



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version