На сегодняшний день я выполнил множество проектов почти во всех областях науки о данных, от машинного обучения, глубокого обучения, компьютерного зрения до НЛП, но эта игра в бессмертных змей на 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.