Поправил код
убрал функцию 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