Найти - Пользователи
Полная версия: Помогите с кодом ,пожалуйста! игра Змейка.
Начало » Python для новичков » Помогите с кодом ,пожалуйста! игра Змейка.
1
artemIvannikov500
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’

Это результат работы игры змейка.
Вроде все делал по инструкции, но почему-то выдаем ошибку
PEHDOM
artemIvannikov500
Вроде все делал по инструкции, но почему-то выдаем ошибку
судя по всему далеко не все, по данной конкретной ошибке точка там лишняя, должно быть
c.bind(“<KeyPress>”, s.changedirection) но работать оно всеравно не будт так как у вас отступы в классе неправильо стоят и все методы класса там вове не методы класса, а функция create_block вообще не определена.
artemIvannikov500
А подскажите ,пожалуйста, как должен выглядеть данный код.
PEHDOM
откуда ж мне знать? отступы должны стоять воттак:
 #...
class Snake(object):
    def __init__(self, segments):
        ....
    def move(self): #управление змейкой
        ....
    def changedirection(self,event): #event изменяет направление и если возможно меняет его
        ....
    def add_segment(self): #добавляем сегмент
        ....
а что должно быть в create_block() я понятия не имею. смотрите у себя в инструкции, что вы там упустили.
artemIvannikov500
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
Поправил код
убрал функцию 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
PEHDOM
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)
...
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