Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 22, 2018 12:51:45

lada0807
Зарегистрирован: 2018-04-17
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Игра змейка, как добавить функцию НАЧАТЬ ИГРУ ЗАНОВО

 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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version