Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 14, 2017 23:48:02

polsovatel
Зарегистрирован: 2016-01-08
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Змейка Tkinter

Всем добрый вечер!
Решил написать змейку на Python-е с использованием стандартной библиотеки Tkinter. Знаю, что вообще игры пишутся с использованием PyGame… Но первоначальная задача для меня - освоить Tkinter.

Написал такой код. Очень громоздко, хотя почти ничего не делается. Подскажите пожалуйста как мне можно его улучшить(сократить) + выслушаю идеи как удлинять змейку при съедании еды.

 from tkinter import *
from random import randrange
segment_list = []
segment_list.append(1)
root = Tk()
root.geometry("800x600")
X_START = 40    # Начальная позиция змейки по X
Y_START = 40    # Начальная позиция змейки по Y
X_OFFSET = 40   # Смещение по X
Y_OFFSET = 40   # Смещение по Y
SPEED_SNAKE = 300   # Скорость с которой перерисовывается змейка (в after)
canv = Canvas(root, bg="White")
canv.pack(fill=BOTH, expand=1)
# Задаем объект кнопка
button_down = Button(root, text="Вниз", width=10, height=2)
button_right = Button(root, text="Вправо", width=10, height=2)
button_left = Button(root, text="Влево", width=10, height=2)
button_up = Button(root, text="Вверх", width=10, height=2)
# Размещаем кнопки
button_down.place(x=400, y=500)
button_right.place(x=470, y=470)
button_left.place(x=330, y=470)
button_up.place(x=400, y=440)
def draw_foot():
    """ Рисуем рандомно шарик еды для змейки """
    global oval, x_food, y_food
    canv.delete(oval)
    x_food = randrange(50, 600)
    y_food = randrange(50, 600)
    rad = 10
    oval = canv.create_oval(x_food - rad, y_food - rad, x_food + rad, y_food + rad, fill="Black", width=0)
    root.after(10000, draw_foot)
########################################################################################################################
# Обработка кнопок
def down(event):
    """ Обработчик кнопки "Вниз" """
    global id
    root.after_cancel(id)
    movement_snake_down()
def movement_snake_down():
    """ Функция отвечает за анимацию змейки после нажатия кнопки "Вниз" """
    global segment, id
    global X_START, Y_START, X_OFFSET, Y_OFFSET
    global x_food, y_food
    canv.delete(segment)
    segment = canv.create_rectangle(X_START, Y_START + Y_OFFSET, X_START + X_OFFSET, Y_START + Y_OFFSET + 40, fill="Black")
    Y_START += Y_OFFSET
    id = root.after(SPEED_SNAKE, movement_snake_down)
def right(event):
    """ Обработчик кнопки "Вправо" """
    global id
    root.after_cancel(id)
    movement_snake_right()
def movement_snake_right():
    """ Функция отвечает за анимацию змейки после нажатия кнопки "Вправо" """
    global segment, id
    global X_START, Y_START, X_OFFSET, Y_OFFSET
    canv.delete(segment)
    segment = canv.create_rectangle(X_START + X_OFFSET, Y_START, X_START + X_OFFSET + 40, Y_START + Y_OFFSET, fill="Black")
    X_START += X_OFFSET
    id = root.after(SPEED_SNAKE, movement_snake_right)
def left(event):
    """ Обработчик кнопки "Влево" """
    global id
    root.after_cancel(id)
    movement_snake_left()
def movement_snake_left():
    """ Функция отвечает за анимацию змейки после нажатия кнопки "Влево" """
    global segment, id
    global X_START, Y_START, X_OFFSET, Y_OFFSET
    canv.delete(segment)
    segment = canv.create_rectangle(X_START - X_OFFSET, Y_START, X_START - X_OFFSET + 40, Y_START + Y_OFFSET, fill="Black")
    X_START -= X_OFFSET
    id = root.after(SPEED_SNAKE, movement_snake_left)
def up(event):
    """ Обработчик кнопки "Вверх" """
    global id
    root.after_cancel(id)
    movement_snake_up()
def movement_snake_up():
    """ Функция отвечает за анимацию змейки после нажатия кнопки "Вверх" """
    global segment, id
    global X_START, Y_START, X_OFFSET, Y_OFFSET
    canv.delete(segment)
    segment = canv.create_rectangle(X_START, Y_START - Y_OFFSET, X_START + X_OFFSET, Y_START - Y_OFFSET + 40, fill="Black")
    Y_START -= Y_OFFSET
    id = root.after(SPEED_SNAKE, movement_snake_up)
########################################################################################################################
segment = canv.create_rectangle(10, 50, 50, 90, fill="Black")
oval = canv.create_oval(50, 50, 70, 70, fill="Black", width=0)
def main():
    """ Главная функция """
    # Сначала змейка движется вправо
    movement_snake_right()
    # Анимация еды
    draw_foot()
    # Обработка нажатий на кнопки
    button_down.bind("<Button-1>", down)
    button_right.bind("<Button-1>", right)
    button_left.bind("<Button-1>", left)
    button_up.bind("<Button-1>", up)
    mainloop()
main()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version