Как стать автором
Обновить

«Змейка» на Python

Уровень сложностиПростой

Что такое "Змейка"?

Snake (ПитонУдавЗмейкаЧервяк и др.) — компьютерная игра, уходящая корнями в системы 1970-х.

Игрок управляет длинным, тонким существом, напоминающим змею, которое ползает по плоскости (как правило, ограниченной стенками), собирая еду (или другие предметы), избегая столкновения с собственным хвостом и краями игрового поля (существуют варианты где при прохождении через край змея выходит из противоположного края поля). Каждый раз, когда змея съедает кусок пищи, она становится длиннее, что постепенно усложняет игру.

Мои правила игры "Змейка"

  • Стартовой позицией является одна клетка ("Голова"), которая находится в центральном положении.

  • В моей версии нельзя умереть (при столкновении стеной змейка выходит из противоположной стены, при столкновении с самим собой ("самоедство") змейка возвращается к стартовой позиции, сохраняя координаты "Головы").

  • При поедании "Яблока" добавляется новая клетка змеи.

Алгоритм "Оторванный 'Хвост' "

Порядок выполнения данного алгоритма:

  • Первое. Для начала определяется координаты для новой "Головы" (направление уже определено).

  • Второе. Выходит ли новая "Голова" за пределы карты? Если да, меняются координаты новой "Головы" на противоположные.

  • Третье. Сталкивается ли змейка с "Яблоком"? Если да, то меняется положение "Яблока". Иначе, хвост отрезается.

  • Четвертое. Съедает ли себя змейка? Если да, то змейка умирает и оставляет потомство (новая "Голова")

  • Пятое. Добавляется новая "Голова"

Третье и Четвертое я объединил в единое условие.

#snake хранит двумерный массив, положение клеток змейки
def severed_tail(snake, apple, direction, x_max, y_max):
  x_apple, y_apple = apple
  x_snake, y_snake = snake[0][0] + direction[0], snake[0][1] + direction[1]
  x_snake = 0 if x_snake > x_max else x_max if x_snake < 0 else x_snake
  y_snake = 0 if y_snake > y_max else y_max if y_snake < 0 else y_snake
  if x_snake == x_apple and y_snake == y_apple:
    set_new_coords_apple(apple)
  elif [x_snake, y_snake] in snake:
    snake = []
  else:
    snake.pop()
  snake.insert(0, [x_snake, y_snake])

В этом алгоритме заключена основная логика игры "Змейка"

Код игры "Змейка"

#Вызов библиотек
from tkinter import *
from random import randint

class Game:
    #Инициализация
    def __init__(self, canvas):
        self.canvas = canvas
        self.snake_coords = [[14, 14]]
        self.apple_coords = [randint(0, 29) for i in range(2)]
        self.vector = {"Up":(0,-1), "Down":(0, 1), "Left": (-1,0), "Right": (1, 0)}
        self.direction = self.vector["Right"]
        self.canvas.focus_set()
        self.canvas.bind("<KeyPress>", self.set_direction)
        self.GAME()
    #Метод для нового положения "Яблока"
    def set_apple(self):
        self.apple_coords = [randint(0, 29) for i in range(2)]
        #Условие, для того чтобы яблоко не лежало на змейке
        if self.apple_coords in self.snake_coords:
            self.set_apple()
    #Установка нового направления змейки
    def set_direction(self, event):
      #Условие, которое проверяет нажатие кнопки
        if event.keysym in self.vector:
            self.direction = self.vector[event.keysym]
    #Отрисовка игры
    def draw(self):
        self.canvas.delete(ALL)
        x_apple, y_apple = self.apple_coords
        self.canvas.create_rectangle(x_apple*10, y_apple*10, (x_apple+1)*10, (y_apple+1)*10, fill="red", width=0)
        for x, y in self.snake_coords:
            self.canvas.create_rectangle(x*10, y*10, (x+1)*10, (y+1)*10, fill="green", width=0)
    #Метод, который возращает координаты на интервале [0, 29]
    @staticmethod
    def coord_check(coord):
        return 0 if coord > 29 else 29 if coord < 0 else coord
    #Алгоритм "Оторванный Хвост\Логика игры"       
    def GAME(self):
        self.draw()
        x,y = self.snake_coords[0]
        x += self.direction[0]; y += self.direction[1]
        x = self.coord_check(x)
        y = self.coord_check(y)
        if x == self.apple_coords[0] and y == self.apple_coords[1]:
            self.set_apple()
        elif [x, y] in self.snake_coords:
            self.snake_coords = []
        else:
            self.snake_coords.pop()
        self.snake_coords.insert(0, [x,y])
        self.canvas.after(100, self.GAME)
        
        
#Каркас игры
root = Tk()
canvas = Canvas(root, width=300, height=300, bg="black")
canvas.pack()
game = Game(canvas)
root.mainloop()

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.