Раскрасьте плитки, которые ведут к цели, используя .pgm и python - PullRequest
0 голосов
/ 02 ноября 2018

import Labyrinthe laby = Labyrinthe.creer(9,13)

Этот код создаст следующий массив списков:

[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 2, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 0, 0, 1, 0, 1, 0]
[0, 1, 1, 1, 1, 1, 0, 1, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 0, 0, 0, 0, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 1, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 0, 0]
[0, 1, 0, 1, 0, 1, 1, 1, 0]
[0, 1, 0, 1, 0, 0, 0, 1, 0]
[0, 1, 1, 1, 1, 1, 0, 3, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]

, где

  • '0' - это стена
  • '1' - это путь
  • '2' - стартовая плитка
  • '3' - целевой тайл

Я использовал следующий код, чтобы записать пиксели в файл .pgm и установить их цвет в тонах в диапазоне от 0 до 255, где 0 (100% белый) - самый светлый тон, а 255 - самый темный (100% черный).

size = 20  #size of a tile in pixels
rows = len(laby)
columns = len(laby[0])
height = size * rows 
width = size * columns

f = open("laby.pgm", "w")
f.write("P2\n" + str(width) + " " + str(height) + "\n255\n") 

for y in range(height):
    for x in range(width):
        indx = x // size
        indy = y // size
        a = laby[indy][indx]
        if a == 0:
            f.write(str(50) + " ")   # colors the pixels
        elif a == 2:
            f.write(str(100) + " ")
        elif a == 3:
            f.write(str(170) + " ")
        else:
            f.write(str(a) + " ")
f.close()

Приведенный выше код выведет изображение, как показано ниже:

The output of the code written in laby.py

Какой код мне нужен, чтобы дать компьютеру команду раскрасить плитки, которые ведут к цели?

1 Ответ

0 голосов
/ 02 ноября 2018

Чтобы найти путь между A и B, вам нужен алгоритм кратчайшего пути. Большинство из них используют график.

Сначала вам нужно преобразовать свой лабиринт в график. Это легкая часть. Узлы - это 1, 2 и 3 в вашем лабиринте, и между всеми узлами, которые соединяются вместе, есть грань. Используйте координаты, чтобы различать узлы. 2 - это (1,1), и он соединяется с 1 (1,2), который соединяется с (1,3), который соединяется с (1,4) и (2,3) ...

После этого вы можете реализовать алгоритм кратчайшего пути, чтобы найти путь от A (1,1) до B (11,7). Это сложнее сделать, если вы не знакомы с этим алгоритмом. Двумя наиболее известными являются Bellman-Ford и Dijkstra. Я позволю вам найти их, так как у них обоих есть лучшие варианты, и это зависит от размера графа и от того, могут ли пути быть циклическими.

Если у вас есть путь, вы окрашиваете его в другой цвет.

...