/
Ioan25
/
FirstSnakeGame
Обзор
Документация
Войти
/
Ioan25
/
FirstSnakeGame
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
193 строки
6 KB
Ivan Karakozov
Готовая змейка)
20 дек 2025, 20:39
20 дек 2025, 20:39
518ee5b
Код
Авторство
О чём код?
import tkinter as tk import random # Размеры окна и блоков width = 600 height = 400 snake_block = 20 speed = 150 # задержка в миллисекундах # Цвета bg_color = "white" snake_color = "black" food_color = "red" text_color = "black" # Создание окна root = tk.Tk() root.title("Змейка") root.resizable(False, False) # Холст для отрисовки canvas = tk.Canvas(root, width=width, height=height, bg=bg_color) canvas.pack() # Переменные игры score = 0 game_active = True score_text = canvas.create_text(10, 10, text=f"Счёт: {score}", font=("Arial", 16), anchor="nw", fill=text_color) # Змейка snake = [(width // 2 // snake_block * snake_block, height // 2 // snake_block * snake_block)] snake_direction = "Right" snake_body = [] # графические элементы змейки # Еда food = None food_pos = (0, 0) # Функция создания еды def create_food(): global food, food_pos # Убедимся, что еда не появляется на змейке while True: x = random.randint(0, (width - snake_block) // snake_block) * snake_block y = random.randint(0, (height - snake_block) // snake_block) * snake_block food_pos = (x, y) # Проверяем, что еда не появляется на змейке if food_pos not in snake: break # Если уже есть еда на холсте, удаляем её if food is not None: canvas.delete(food) food = canvas.create_oval(x, y, x + snake_block, y + snake_block, fill=food_color) # Функция обновления счёта def update_score(): canvas.itemconfig(score_text, text=f"Счёт: {score}") # Функция движения змейки def move_snake(): global snake, food, food_pos, score, game_active if not game_active: return # Направления x, y = snake[0] if snake_direction == "Left": x -= snake_block elif snake_direction == "Right": x += snake_block elif snake_direction == "Up": y -= snake_block elif snake_direction == "Down": y += snake_block # Проверка на столкновение с границами if x < 0 or x >= width or y < 0 or y >= height: game_over() return # Проверка на столкновение с собой if (x, y) in snake: game_over() return # Добавляем новую голову snake.insert(0, (x, y)) # Отрисовка головы head = canvas.create_rectangle(x, y, x + snake_block, y + snake_block, fill=snake_color, outline="darkgray", width=1) snake_body.insert(0, head) # Проверка на еду if (x, y) == food_pos: # Еда съедена canvas.delete(food) score += 1 update_score() create_food() else: # Удаляем хвост tail_pos = snake.pop() if snake_body: tail = snake_body.pop() canvas.delete(tail) # Продолжаем игру root.after(speed, move_snake) # Функция завершения игры def game_over(): global game_active game_active = False canvas.create_text(width // 2, height // 3, text="Ты проиграл!", fill="red", font=("Arial", 24, "bold")) canvas.create_text(width // 2, height // 3 + 40, text="Нажми C, чтобы играть снова", fill=text_color, font=("Arial", 16)) canvas.create_text(width // 2, height // 3 + 70, text="или Q для выхода", fill=text_color, font=("Arial", 16)) # Функция обработки клавиш def key_press(event): global snake_direction, game_active key = event.keysym.lower() if key == 'q': root.quit() elif key == 'c' and not game_active: reset_game() elif game_active: # Запрещаем разворот на 180 градусов if key == 'up' and snake_direction != 'down': snake_direction = 'Up' elif key == 'down' and snake_direction != 'up': snake_direction = 'Down' elif key == 'left' and snake_direction != 'right': snake_direction = 'Left' elif key == 'right' and snake_direction != 'left': snake_direction = 'Right' # Сброс игры def reset_game(): global snake, snake_body, score, snake_direction, game_active # Очищаем холст canvas.delete("all") # Сбрасываем переменные snake = [(width // 2 // snake_block * snake_block, height // 2 // snake_block * snake_block)] snake_direction = "Right" snake_body = [] score = 0 game_active = True # Создаем текст счета global score_text score_text = canvas.create_text(10, 10, text=f"Счёт: {score}", font=("Arial", 16), anchor="nw", fill=text_color) # Создаем еду и запускаем игру create_food() move_snake() # Инициализация змейки на холсте def draw_initial_snake(): global snake_body # Отрисовываем начальную змейку for segment in snake: rect = canvas.create_rectangle(segment[0], segment[1], segment[0] + snake_block, segment[1] + snake_block, fill=snake_color, outline="darkgray", width=1) snake_body.append(rect) # Настройка обработки клавиш root.bind("<KeyPress>", key_press) root.focus_set() # Начало игры draw_initial_snake() create_food() move_snake() # Запуск главного цикла root.mainloop()