Возникли проблемы с уклонением от стеныPython

Программы на Python
Гость
Возникли проблемы с уклонением от стены

Сообщение Гость »

Привет, ребята, я попробовал довольно много способов, но по каким-то причинам змея в коде вообще не может избегать стен. Красная точка — змея, зеленая точка — еда. В лабиринте пустое пространство равно 0, а -1 обозначает стену. Ниже приведен мой код для поискового агента:

Код: Выделить всё

import heapq

class A_Star_Implementation:
def __init__(self, state):
self.state = state
self.maze = state.maze.MAP
self.start = (state.snake.HeadPosition.X, state.snake.HeadPosition.Y)
self.goal = (state.FoodPosition.X, state.FoodPosition.Y)

def heuristic(self, a, b):
# Use Manhattan distance as the heuristic
return abs(a[0] - b[0]) + abs(a[1] - b[1])

def a_star_search(self):
open_set = []
heapq.heappush(open_set, (0 + self.heuristic(self.start, self.goal), 0, self.start))
came_from = {}
g_score = {self.start: 0}

while open_set:
_, _, current = heapq.heappop(open_set)

if current == self.goal:
return self.reconstruct_path(came_from, current)

for dx, dy in [(1, 0), (0, 1), (-1, 0), (0, -1)]:  # Directions: right, down, left, up
neighbor = (current[0] + dx, current[1] + dy)
if 0 = State.maze.WIDTH or c < 0):
self.isAlive = False
elif(State.maze.MAP[r][c] == -1):
self.isAlive = False
elif(c == State.FoodPosition.X and r == State.FoodPosition.Y):
self.score = self.score + 10

class SnakeState():
def __init__(self, Color, HeadPositionX, HeadPositionY, HeadDirectionX, HeadDirectionY, mazeFileName):
self.snake = Snake(Color, HeadPositionX, HeadPositionY, HeadDirectionX, HeadDirectionY)
self.maze = Maze(mazeFileName)
self.generateFood()

def generateFood(self):
"""
Method to randomly place a circular 'food' object anywhere on Canvas.
The tag on it is used for making decisions in the program
"""
FoodFlag = False
while (FoodFlag == False):
x = random.randrange(3, self.maze.WIDTH  - 3)
y = random.randrange(3, self.maze.HEIGHT - 3)

if(self.maze.MAP[y][x] != -1):
FoodFlag = True

self.FoodPosition = Vector(x,y)

def printState(self):
# Printing the current state of the snake and the maze
print("Snake Head Position:", end=" ")
self.snake.HeadPosition.show()
print("Food Position:", end="  ")
self.FoodPosition.show()
# Printing the maze
print("Maze:")
for row in self.maze.MAP:
print(row)
и main.py такой же, как

Код: Выделить всё

import threading
import State as ST
import AgentSnake as AS
import time
import View as V

class Main:
def __init__(self, State, AgentSnake, SnakeSpeed=30):
self.State = State
self.AgentSnake = AgentSnake
self.View = V.SnakeViewer(self.State,SnakeSpeed)

def setDirection(self, k):
if(k == 0):
self.State.snake.HeadDirection.X = 0
self.State.snake.HeadDirection.Y = -1
elif(k == 6):
self.State.snake.HeadDirection.X = 0
self.State.snake.HeadDirection.Y = 1
elif(k == 3):
self.State.snake.HeadDirection.X = 1
self.State.snake.HeadDirection.Y = 0
elif(k == 9):
self.State.snake.HeadDirection.X = -1
self.State.snake.HeadDirection.Y = 0

def ExecutePlan(self, Plan):
for k in Plan:
self.setDirection(k)
self.State.snake.moveSnake(self.State)
if(self.State.snake.isAlive == False):
break
time.sleep(1/self.View.SPEED)
self.View.UpdateView()

def StartSnake(self):
if(self.State.snake.isAlive == False):
return
PlanIsGood = True
Message = "Game Over"
while(self.State.snake.isAlive and PlanIsGood):
ScoreBefore = self.State.snake.score

Plan = self.AgentSnake.SearchSolution(self.State)
self.ExecutePlan(Plan)

ScoreAfter = self.State.snake.score

if(ScoreAfter == ScoreBefore):
PlanIsGood = False
self.State.generateFood()
time.sleep(1/2)

if(self.State.snake.isAlive):
Message = Message + "  HAS A BAD PLAN"
else:
Message = Message + " HAS HIT A WALL"
self.View.ShowGameOverMessage(Message)
def Play(self):
t1 = threading.Thread(target=self.StartSnake)
t1.start()
t2 = threading.Thread(target= self.View.top.mainloop())
t2.start()
t1.join()
t2.join()

def main():
state = ST.SnakeState('red', 10, 10, 0, 1,"Maze.txt")
Agent = AS.AgentSnake()
state.printState()
Game = Main(state,Agent)
Game.Play()

if __name__ == '__main__':
main()
Буду благодарен за советы и ошибки, чтобы я мог лучше работать с другими алгоритмами поиска. В данный момент я не добавлял другие алгоритмы, поэтому очень ценю помощь в решении этой проблемы
Изображение


Подробнее здесь: https://stackoverflow.com/questions/781 ... g-the-wall

Вернуться в «Python»