146 lines
4.3 KiB
Python
146 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Dijkstra Pathfinding Test - Headless
|
|
====================================
|
|
|
|
Tests all Dijkstra functionality and generates a screenshot.
|
|
"""
|
|
|
|
import mcrfpy
|
|
from mcrfpy import automation
|
|
import sys
|
|
|
|
def create_test_map():
|
|
"""Create a test map with obstacles"""
|
|
mcrfpy.createScene("dijkstra_test")
|
|
|
|
# Create grid
|
|
grid = mcrfpy.Grid(grid_x=20, grid_y=12)
|
|
grid.fill_color = mcrfpy.Color(0, 0, 0)
|
|
|
|
# Initialize all cells as walkable floor
|
|
for y in range(12):
|
|
for x in range(20):
|
|
grid.at(x, y).walkable = True
|
|
grid.at(x, y).transparent = True
|
|
grid.at(x, y).color = mcrfpy.Color(200, 200, 220)
|
|
|
|
# Add walls to create interesting paths
|
|
walls = [
|
|
# Vertical wall in the middle
|
|
(10, 1), (10, 2), (10, 3), (10, 4), (10, 5), (10, 6), (10, 7), (10, 8),
|
|
# Horizontal walls
|
|
(2, 6), (3, 6), (4, 6), (5, 6), (6, 6),
|
|
(14, 6), (15, 6), (16, 6), (17, 6),
|
|
# Some scattered obstacles
|
|
(5, 2), (15, 2), (5, 9), (15, 9)
|
|
]
|
|
|
|
for x, y in walls:
|
|
grid.at(x, y).walkable = False
|
|
grid.at(x, y).color = mcrfpy.Color(60, 30, 30)
|
|
|
|
# Place test entities
|
|
entities = []
|
|
positions = [(2, 2), (17, 2), (9, 10)]
|
|
colors = [
|
|
mcrfpy.Color(255, 100, 100), # Red
|
|
mcrfpy.Color(100, 255, 100), # Green
|
|
mcrfpy.Color(100, 100, 255) # Blue
|
|
]
|
|
|
|
for i, (x, y) in enumerate(positions):
|
|
entity = mcrfpy.Entity(x, y)
|
|
entity.sprite_index = 49 + i # '1', '2', '3'
|
|
grid.entities.append(entity)
|
|
entities.append(entity)
|
|
# Mark entity positions
|
|
grid.at(x, y).color = colors[i]
|
|
|
|
return grid, entities
|
|
|
|
def test_dijkstra(grid, entities):
|
|
"""Test Dijkstra pathfinding between all entity pairs"""
|
|
results = []
|
|
|
|
for i in range(len(entities)):
|
|
for j in range(len(entities)):
|
|
if i != j:
|
|
# Compute Dijkstra from entity i
|
|
e1 = entities[i]
|
|
e2 = entities[j]
|
|
grid.compute_dijkstra(int(e1.x), int(e1.y))
|
|
|
|
# Get distance and path to entity j
|
|
distance = grid.get_dijkstra_distance(int(e2.x), int(e2.y))
|
|
path = grid.get_dijkstra_path(int(e2.x), int(e2.y))
|
|
|
|
if path:
|
|
results.append(f"Path {i+1}→{j+1}: {len(path)} steps, {distance:.1f} units")
|
|
|
|
# Color one interesting path
|
|
if i == 0 and j == 2: # Path from 1 to 3
|
|
for x, y in path[1:-1]: # Skip endpoints
|
|
if grid.at(x, y).walkable:
|
|
grid.at(x, y).color = mcrfpy.Color(200, 250, 220)
|
|
else:
|
|
results.append(f"Path {i+1}→{j+1}: No path found!")
|
|
|
|
return results
|
|
|
|
def run_test(runtime):
|
|
"""Timer callback to run tests and take screenshot"""
|
|
# Run pathfinding tests
|
|
results = test_dijkstra(grid, entities)
|
|
|
|
# Update display with results
|
|
y_pos = 380
|
|
for result in results:
|
|
caption = mcrfpy.Caption(result, 50, y_pos)
|
|
caption.fill_color = mcrfpy.Color(200, 200, 200)
|
|
ui.append(caption)
|
|
y_pos += 20
|
|
|
|
# Take screenshot
|
|
mcrfpy.setTimer("screenshot", lambda rt: take_screenshot(), 500)
|
|
|
|
def take_screenshot():
|
|
"""Take screenshot and exit"""
|
|
try:
|
|
automation.screenshot("dijkstra_test.png")
|
|
print("Screenshot saved: dijkstra_test.png")
|
|
except Exception as e:
|
|
print(f"Screenshot failed: {e}")
|
|
|
|
# Exit
|
|
sys.exit(0)
|
|
|
|
# Create test map
|
|
print("Creating Dijkstra pathfinding test...")
|
|
grid, entities = create_test_map()
|
|
|
|
# Set up UI
|
|
ui = mcrfpy.sceneUI("dijkstra_test")
|
|
ui.append(grid)
|
|
|
|
# Position and scale grid
|
|
grid.position = (50, 50)
|
|
grid.size = (500, 300)
|
|
|
|
# Add title
|
|
title = mcrfpy.Caption("Dijkstra Pathfinding Test", 200, 10)
|
|
title.fill_color = mcrfpy.Color(255, 255, 255)
|
|
ui.append(title)
|
|
|
|
# Add legend
|
|
legend = mcrfpy.Caption("Red=Entity1 Green=Entity2 Blue=Entity3 Cyan=Path 1→3", 50, 360)
|
|
legend.fill_color = mcrfpy.Color(180, 180, 180)
|
|
ui.append(legend)
|
|
|
|
# Set scene
|
|
mcrfpy.setScene("dijkstra_test")
|
|
|
|
# Run test after scene loads
|
|
mcrfpy.setTimer("test", run_test, 100)
|
|
|
|
print("Running Dijkstra tests...") |