Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 7, 2019 15:10:37

artemIvannikov500
Зарегистрирован: 2019-02-07
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с кодом ,пожалуйста! игра Змейка.

Traceback (most recent call last):
File “Dpaspal programs/111/venv/Include/kvadrat.py”, line 101, in <module>
c.bind(“<KeyPress>”, s.change.direction)
AttributeError: ‘Snake’ object has no attribute ‘change’

Это результат работы игры змейка.
Вроде все делал по инструкции, но почему-то выдаем ошибку

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

Офлайн

#2 Фев. 7, 2019 15:43:06

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

Помогите с кодом ,пожалуйста! игра Змейка.

artemIvannikov500
Вроде все делал по инструкции, но почему-то выдаем ошибку
судя по всему далеко не все, по данной конкретной ошибке точка там лишняя, должно быть
c.bind(“<KeyPress>”, s.changedirection) но работать оно всеравно не будт так как у вас отступы в классе неправильо стоят и все методы класса там вове не методы класса, а функция create_block вообще не определена.



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

Офлайн

#3 Фев. 8, 2019 15:40:02

artemIvannikov500
Зарегистрирован: 2019-02-07
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с кодом ,пожалуйста! игра Змейка.

А подскажите ,пожалуйста, как должен выглядеть данный код.

Офлайн

#4 Фев. 8, 2019 16:24:07

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

Помогите с кодом ,пожалуйста! игра Змейка.

откуда ж мне знать? отступы должны стоять воттак:

 #...
class Snake(object):
    def __init__(self, segments):
        ....
    def move(self): #управление змейкой
        ....
    def changedirection(self,event): #event изменяет направление и если возможно меняет его
        ....
    def add_segment(self): #добавляем сегмент
        ....
а что должно быть в create_block() я понятия не имею. смотрите у себя в инструкции, что вы там упустили.



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

Офлайн

#5 Фев. 9, 2019 10:56:28

artemIvannikov500
Зарегистрирован: 2019-02-07
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с кодом ,пожалуйста! игра Змейка.

PEHDOM
По идее он должен создать новое яблоко из функции

 def apple(): # Cоздаем блок в случайной позиции карты
    global Block
    posx = SEG_SIZE * (random.randint(1, (WIDTH - SEG_SIZE) / SEG_SIZE))
    posy = SEG_SIZE * (random.randint(1, (HEIGHT - SEG_SIZE) / SEG_SIZE))
    Block = c.create_oval(posx, posy,
                          posx + SEG_SIZE,
                          posy + SEG_SIZE,
                          fill="red")

Отредактировано artemIvannikov500 (Фев. 9, 2019 10:57:20)

Офлайн

#6 Фев. 9, 2019 12:39:27

artemIvannikov500
Зарегистрирован: 2019-02-07
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с кодом ,пожалуйста! игра Змейка.

Поправил код
убрал функцию create_block()
поправил создание яблок,
но появились проблемы с определением координаты X1

 from tkinter import *
from tkinter import messagebox
import random
root = Tk()  # Create game window
root.title("Snake-Game")
HEIGHT = 800  # ВЫСОТА
WIDTH = 1000  # ШИРИНА
SEG_SIZE = 20  # РАЗМЕР СЕГМЕНТА ЗМЕЙКИ
IN_GAME = True
c = Canvas(root, width=WIDTH, height=HEIGHT, bg="#003300")
c.grid()  # создаем и располагаем окно
c.focus_set()
class Segment(object):  # create snake's segment
    def __init__(self, x, y):
        self.instance = c.create_rectangle(x, y,
                                           x + SEG_SIZE, y + SEG_SIZE,
                                           fill="orange")
class Snake(object):
    def __init__(self, segments):
        self.segments = segments  # создали тело змеи
        # возможные движения змеи
        self.mapping = {"Down": (0, 1), "Up": (0, -1), "Right": (1, 0), "Left": (-1, 0)}
        self.vector = self.mapping["Right"]  # изначально движется вправо
    def move(self):  # управление змейкой
        for index in range(len(self.segments) - 1):  # пересчет сегментов
            segment = self.segments[index+1].instance
            c.coords(segment, x1, x2, y1, y2)
            # получаем координаты перед головой
        x1, x2, y1, y2 = c.coords(self.segments[-2].instance)
            # перемещаем голову в указанном направлении
        c.coords(self.segments[-1].instance,
                 x1 + self.vector[0] * SEG_SIZE,
                 x2 + self.vector[0] * SEG_SIZE,
                 y1 + self.vector[1] * SEG_SIZE,
                 y2 + self.vector[1] * SEG_SIZE)
    def changedirection(self, event):  # event изменяет направление и если возможно меняет его
        if event.keysym in self.mapping:  # проверяем есть ли в вожможных движениях введенное в клав
            self.vector = self.mapping[event.keysym]
    def add_segment(self):  # добавляем сегмент
        # определяем последний сегмент
        last_seg = c.coords(self.segments[0].instance)
        # ставим следующий
        x = last_seg[2] - SEG_SIZE
        y = last_seg[3] - SEG_SIZE
        self.segments.insert(0, Segment(x, y))
# создаем набор сегментов
segments = [Segment(SEG_SIZE, SEG_SIZE),
            Segment(SEG_SIZE * 2, SEG_SIZE),
            Segment(SEG_SIZE * 3, SEG_SIZE)]
# СОЗДАЕМ ЗМЕЮ
s = Snake(segments)
c.bind("<KeyPress>", s.changedirection)
# создаем яблоки
def apple():  # Cоздаем блок в случайной позиции карты
    global Block
    posx = SEG_SIZE * (random.randint(1, (WIDTH - SEG_SIZE) / SEG_SIZE))
    posy = SEG_SIZE * (random.randint(1, (HEIGHT - SEG_SIZE) / SEG_SIZE))
    Block = c.create_oval(posx, posy,
                          posx + SEG_SIZE,
                          posy + SEG_SIZE,
                          fill="red")
a = apple()
# game
def main():
    global IN_GAME
    if IN_GAME:
        # ДВИГАЕМ ЗМЕЮ
        s.move()
        # определяем координаты головы
        head_coord = c.coords(s.segments[-1].instance)
        x1, x2, y1, y2 = head_coord
        # столкновение с границами экрана
        if x1 < 0 or x2 > WIDTH or y1 < 0 or y2 > HEIGHT:
            IN_GAME = False
            messagebox.showerror("The end", "К сожалению, но вы проиграли!")
        # eat
        elif head_coord == c.coords(Block):
            s.add_segment()
            c.delete(Block)
            create_block()
        # самоедство
        else:
            for index in range(len(s.segments) - 1):
                if head_coords==c.coords(s.segments[index].instance) == head_coord:
                    IN_GAME = False
        root.after(100, main)                    
    else:
        c.create_text(WIDTH / 2, HEIGHT / 2, text="К сожалению, но вы проиграли!",
                      font="Arial 20",
                      fill="220022")
main()
root.mainloop()

Вот ошибка
UnboundLocalError: local variable ‘x1’ referenced before assignment

Отредактировано artemIvannikov500 (Фев. 9, 2019 12:58:14)

Офлайн

#7 Фев. 11, 2019 10:03:32

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

Помогите с кодом ,пожалуйста! игра Змейка.

artemIvannikov500
UnboundLocalError: local variable ‘x1’ referenced before assignment
ну дык
 ...
 def move(self):  # управление змейкой
        for index in range(len(self.segments) - 1):  # пересчет сегментов
            segment = self.segments[index+1].instance
            c.coords(segment, x1, x2, y1, y2)
....
оно вам честно говорит что не знает откуда ему взять переменную x1, а также оно будет ругаться и на x2, y1, y2.
я так понимаю, по логике оно должно выглядеть вот так:
 ...
        for index in range(len(self.segments) - 1):  # пересчет сегментов
            segment = self.segments[index].instance
            x1, y1, x2, y2 = c.coords(self.segments[index+1].instance)
            c.coords(segment, x1, y1, x2, y2)
...



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

Отредактировано PEHDOM (Фев. 11, 2019 10:03:49)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version