Я пытаюсь создать змеиный ИИ с библиотекой python -NEAT. Проблема, с которой я столкнулся, связана с входами в нейронную сеть. Прямо сейчас я просто вычисляю расстояние от всех его стен (вверху, справа, слева, снизу) и расстояние от еды до корма и подаю его в нейронную сеть. с другой стороны, на многих видео YouTube и в других потоках на разных платформах люди говорят о том, чтобы проверить, свободны ли берега слева, справа и спереди и где находится еда. Мой вопрос: как мне это получить? Использую ли я opencv для захвата изображений или в Pygame есть другой способ?
Вот мой объект-змея
class Snake:
def __init__(self):
self.snake_block = 10
self.x = int(round(random.randrange(0, height - self.snake_block) / 10.0) * 10.0)
self.y = int(round(random.randrange(0, height - self.snake_block) / 10.0) * 10.0)
self.dx = 0
self.dy = 0
self.snake_head = []
self.snake_full = []
self.snake_length = 1
self.dtw = 0
self.dbw = 0
self.dlw = 0
self.drw = 0
self.brain = SnakeAI()
self.direction = 4
self.dfx = 0
self.dfy = 0
self.step_allowed = 100
self.decesion = []
def draw(self):
for x in self.snake_full:
pygame.draw.rect(screen, red, (x[0], x[1], self.snake_block, self.snake_block))
def move(self):
if self.direction is 0:
self.dy = -self.snake_block
self.dx = 0
if self.direction is 1:
self.dy = self.snake_block
self.dx = 0
if self.direction is 2:
self.dy = 0
self.dx = -self.snake_block
if self.direction is 3:
self.dy = 0
self.dx = self.snake_block
self.step_allowed -= 1
self.x += self.dx
self.y += self.dy
self.snake_head = []
self.snake_head.append(self.x)
self.snake_head.append(self.y)
self.snake_full.append(self.snake_head)
if len(self.snake_full) > self.snake_length:
del self.snake_full[0]
self.draw()
def grow(self):
self.snake_length += 1
def senses(self, fx, fy):
self.dtw = self.y - 0
self.dbw = self.y - height
self.dlw = self.x - 0
self.drw = self.x - width
self.dfx = self.x - fx
self.dfy = self.y - fy
Вот как я передаю его нейронной сети
snake.senses(food.x, food.y)
output = nets[snakes.index(snake)].activate((height, abs(snake.dbw), width, abs(snake.drw),
abs(snake.dfx), abs(snake.dfy)))
output = int(np.argmax(output))
snake.direction = output
snake.move()