На сегодняшний день я выполнил множество проектов почти во всех областях науки о данных, от машинного обучения, глубокого обучения, компьютерного зрения до НЛП, но эта игра в бессмертных змей на Python по-прежнему остается одним из моих любимых проектов. из-за его простоты и взаимодействия с пользователем. Вы будете полностью поражены, увидев результаты примерно в 100 строках кода.

Полную статью с исходным кодом читайте здесь —https://machinelearningprojects.net/snake-game-in-python/

Посмотреть видео можно здесь — https://youtu.be/g3brEQ_1QsI

Давай сделаем это…

Код для игры «Бессмертная змея» на питоне…

import cv2
import imutils
from collections import deque
import numpy as np
import time

score = 0
max_score=20
list_capacity = 0
max_lc =20
l = []
flag=0
apple_x = None
apple_y = None
center = None

# distance function
def dist(pt1,pt2):
    return np.sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
cap = cv2.VideoCapture(0)

# Snake game in Python
while 1:

    ret,frame = cap.read()
    img = imutils.resize(frame.copy(),width=600)
    img = cv2.GaussianBlur(img,(11,11),0)          
    img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)     
    
    if apple_x is None or apple_y is None:
        
        # assigning random coefficients for apple coordinates
        apple_x = np.random.randint(30,frame.shape[0]-30) 
        apple_y = np.random.randint(100,350)       

    cv2.circle(frame,(apple_x,apple_y),3,(0,0,255),-1)
    
    # change this range acc to your need 
    greenLower = (29, 86, 18)
    greenUpper = (93, 255, 255)
    
    # masking out the green color  
    mask = cv2.inRange(img,greenLower,greenUpper)
    mask = cv2.erode(mask,None,iterations=2)
    mask = cv2.dilate(mask,None,iterations=2)
    
    # find contours
    cnts = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    
    
    if len(cnts)>0:
        ball_cont = max(cnts,key=cv2.contourArea)
        (x,y),radius = cv2.minEnclosingCircle(ball_cont) # find the minimum enclosing circle about the found contour 
        
        M = cv2.moments(ball_cont)
        center = (int(M['m10']/M['m00']),int(M['m01']/M['m00']))
        
        if radius>10:
            cv2.circle(frame,center,2,(0,0,255),3)
            
            if len(l)>list_capacity:
                l = l[1:]
            
            if prev_c and (dist(prev_c,center) >3.5):
                l.append(center)
                
            apple = (apple_x,apple_y)
            if dist(apple,center)<5:
                score+=1
                if score==max_score:
                    flag=1
                list_capacity+=1
                apple_x = None
                apple_y = None
        
    for i in range(1,len(l)):
        if l[i-1] is None or l[i] is None:
            continue
        r,g,b = np.random.randint(0,255,3)
        
        cv2.line(frame,l[i],l[i-1],(int(r),int(g),int(b)), thickness = int(len(l)/max_lc+2)+2)    
    
    
    cv2.putText(frame,'Score :'+str(score),(450,100),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,203),2)
    if flag==1:
        cv2.putText(frame,'YOU WIN !!',(100,250),cv2.FONT_HERSHEY_SIMPLEX,3,(255,255,0),3)
        
    cv2.imshow('live feed',frame)
    cv2.imshow('mask',mask)
    prev_c = center
    
    if cv2.waitKey(1)==27:
        break
        
cv2.destroyAllWindows()
cap.release()

# This was the code for snake game in Python
  • Строка 1–5 — Импорт необходимых библиотек.
  • Строка 7–14 — Инициализация некоторых констант, которые мы будем использовать дальше.
  • Строка 17–19 — просто объявление функции расстояния, которая просто найдет расстояние между двумя точками (x1,y1) и (x2,y2).
  • Строка 20 — Объявление объекта VideoCapture для доступа к веб-камере.
  • Давайте запустим бесконечный цикл, чтобы поиграть в змейку на Python…
  • Строка 25 — Чтение изображения с веб-камеры.
  • Строка 26 — измените размер изображения до ширины 600, и библиотека imutils сохранит соотношение сторон.
  • Строка 27 — Размытие изображения для удаления шума.
  • Строка 28. Преобразуйте изображение BGR в режим HSV, потому что на дальнейших этапах мы будем создавать маски, а это лучше всего работает в режиме HSV.
  • Строка 30 — Просто проверяем, является ли это началом цикла, потому что в начале только и apple_x, и apple_y будут равны None. Здесь яблоко — это красная точка, которую змея съедает, чтобы набрать очки.
  • Строка 33–34 — случайным образом присваиваются целые числа apple_x и apple_y, которые вместе сообщают координаты яблока.
  • Строка 36 — Нарисуйте круг или, можно сказать, поместите точку/яблоко на рамку. Круг радиусом 3 пикселя будет выглядеть как точка.
  • Строка 39–40 — Установите диапазон зеленого цвета. Это очень деликатный шаг, потому что выбор неправильного диапазона может полностью разрушить работу игры. Этот диапазон настроен для крышки бутылки зеленого цвета, которую я использую в видео ниже. Настройте его на цвет вашего объекта.
  • Строка 43 — это создаст маску. Он проверит каждый пиксель изображения и проверит, находится ли цвет этого пикселя в диапазоне (диапазон, указанный выше) или нет. Если он находится в диапазоне, отметьте его как белый пиксель, в противном случае отметьте его как черный пиксель.
  • Строки 44–45 Мы размываем и расширяем изображение, чтобы удалить любой шум, если он присутствует, чтобы улучшить реакцию игры со змеей в Python.
  • Строка 48–49 — мы просто выделяем контуры из маски. Из-за того, что крышка у нашей бутылки была круглой, наша маска тоже будет круглой белой на черном фоне. Таким образом, он выберет этот белый контур.

  • Строка 52 — Проверяем, нашли контуры или нет.
  • Строка 53. Выберите самый большой контур с точки зрения площади, потому что во многих случаях также улавливаются контуры с небольшим шумом.
  • Строка 54 — Вычислить минимальную охватывающую окружность контура.
  • Строка 56–57 — Вычислить моменты контура и найти центр тяжести контура. Этот центроид будет таким же, как центр крышки от бутылки.
  • Строка 59 — Если радиус самого большого найденного нами контура больше 10, то мы уверены, что это крышка от бутылки.
  • Линия 60 — Нарисуйте круг радиусом 2 (он будет выглядеть как точка) в центре (вы можете видеть в центре бутылки).
  • Строка 62–63 — Вобще :), делал для тюнинга.
  • Строка 68–70 — мы просто проверяем, меньше ли расстояние между пастью нашей змеи (центр бутылки) и яблоком 5 пикселей, помечаем его как съеденное и увеличиваем счет.
  • Строка 71–72 — если счет достигает 20, установите флаг = 1, что на экране отобразит «ВЫ ВЫИГРЫВАЕТЕ».
  • Строка 73–75 — увеличить емкость списка и сбросить apple_x и apple_y на None.
  • Строка 77–82 — Соберите змейку. Список l будет содержать все последние n точек, через которые прошла наша змейка, и провести между ними линии, которые будут иметь вид змейки. Строка 80 просто назначает случайный цвет каждой строке.
  • Строка 85 — Ставим партитуру на рамку.
  • Строка 86–87. Если флаг=1 означает, что вы набрали 20 очков, выведите «ВЫ ВЫИГРЫВАЕТЕ».
  • Строка 89–90 — Показать основное изображение.
  • Строка 93–94 — если пользователь нажимает клавишу ESC, ломается код.

Окончательные результаты…

Давайте поиграем в игру…

Дайте мне знать, если у вас есть какие-либо вопросы относительно игры Snake на Python, связавшись со мной по электронной почте или через LinkedIn.

Для дальнейшего объяснения кода и исходного кода посетите здесьhttps://machinelearningprojects.net/snake-game-in-python/

Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…

Прочитайте мой предыдущий пост: КАК НАЙТИ САМЫЕ ДОМИНИРУЮЩИЕ ЦВЕТА НА ИЗОБРАЖЕНИИ В PYTHON С ИСПОЛЬЗОВАНИЕМ KMEANS CLUSTERING

Ознакомьтесь с другими моими проектами машинного обучения, проектами глубокого обучения, проектами компьютерного зрения, проектами НЛП, проектами Flask на machinelearningprojects.net.