Форум сайта python.su
Всем добрый вечер!
Решил написать змейку на 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()
Офлайн