Форум сайта python.su
from tkinter import * import random # ширина экрана WIDTH = 800 # высота экрана HEIGHT = 600 # размер сегмента змейки SEG_SIZE = 20 # переменная отвечающая за состояние игры IN_GAME = True # Helper functions def create_block(): """ Создаём блок в случайном позиции на карте """ 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") def main(): """ Обрабатывает игровой процесс """ global IN_GAME if IN_GAME: # двигаем змейку s.move() # определяем координаты головы head_coords = c.coords(s.segments[-1].instance) x1, y1, x2, y2 = head_coords # Столкновение с границами экрана if x2 > WIDTH or x1 < 0 or y1 < 0 or y2 > HEIGHT: IN_GAME = False # Поедание яблок elif head_coords == 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): IN_GAME = False root.after(100, main) # Если не в игре выводим сообщение о проигрыше else: c.create_text(WIDTH/2, HEIGHT/2, text="Игра окончена!", font="Arial 20", fill="red") class Segment(object): """ Single snake segment """ def __init__(self, x, y): self.instance = c.create_rectangle(x, y, x+SEG_SIZE, y+SEG_SIZE, fill="white") class Snake(object): """ Simple Snake class """ def __init__(self, segments): self.segments = segments # possible moves # список доступных направлений движения змейки self.mapping = {"Down": (0, 1), "Right": (1, 0), "Up": (0, -1), "Left": (-1, 0)} # изначально змейка двигается вправо self.vector = self.mapping["Right"] def move(self): """ Двигает змейку в заданном направлении""" # перебираем все сегменты кроме первого 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) # получаем координаты сегмента перед ГОЛОВОЙ x1, y1, x2, y2 = c.coords(self.segments[-2].instance) # помещаем ГОЛОВУ в направлении указанном в векторе движения c.coords(self.segments[-1].instance, x1+self.vector[0]*SEG_SIZE, y1+self.vector[1]*SEG_SIZE, x2+self.vector[0]*SEG_SIZE, y2+self.vector[1]*SEG_SIZE) 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)) def change_direction(self, event): """ Изменяет направление движения змейки """ # event передаст нам символ нажатой клавиши # и если эта клавиша в доступных направлениях # изменяем направление if event.keysym in self.mapping: self.vector = self.mapping[event.keysym] # Создаём окно root = Tk() # Устанавливаем название окна root.title("Волков Дмитрий") # оздаём экземпляр класса Canvas заливаем зелёным цветом c = Canvas(root, width=WIDTH, height=HEIGHT, bg="#4f2642") c.grid() # Наводим фокус на Canvas, чтобы мы могли ловить нажатия клавиш # catch keypressing c.focus_set() # создаём набор сегментов segments = [Segment(SEG_SIZE, SEG_SIZE), Segment(SEG_SIZE*2, SEG_SIZE), Segment(SEG_SIZE*3, SEG_SIZE)] # сама змейка s = Snake(segments) # Reaction on keypress c.bind("<KeyPress>", s.change_direction) create_block() main() # Запускаем окно root.mainloop()
Отредактировано lada0807 (Ноя. 22, 2018 12:52:05)
Офлайн