Помогите дописать и понять Алгоритм А*

Общие вопросы о Unity3D

Помогите дописать и понять Алгоритм А*

Сообщение Ryzen 08 июл 2020, 17:47

Добрый день друзья.
Я слабый программист совсем :D, пытаюсь как неделю понять а*, написал как сам вижу его, можете ли вы помочь мне его дописать или ткнуть носом, что не так:
Есть класс который создает саму клетку
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Клетка : MonoBehaviour
{
    public bool Занята = false;
    public bool Проверена = false;
    public int Ширина = 0;
    public int Высота = 0;
    public int Цена = 0;
    public int Всего = 0;
    public int Растояние = 0;
    public GameObject Сылка_На_Себя;



    void Start()
    {
        Ссылка = Сылка_На_Себя.GetComponent<MeshRenderer>().material;
       
    }
   

}

 

Тут создаю карту:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Карта : MonoBehaviour
{
    [SerializeField]
    private GameObject Ячейка_Карты;
    [SerializeField]
    private int Ширина;
    [SerializeField]
    private int Высота;
    public Клетка[,] Крта_Масив;

    void Start()
    {
        Создать_Карту();
    }

   
    void Update()
    {
       
    }


    private void Создать_Карту()
    {
        Крта_Масив = new Клетка[Ширина, Высота];

        for (int y = 0; y < Высота; y++)
        {
            for (int x = 0; x < Ширина; x++)
            {
                GameObject создать = Instantiate(Ячейка_Карты, new Vector3(x, 0, y * -1), Quaternion.identity);
                Клетка клетка = создать.GetComponent<Клетка>();
                Крта_Масив[x, y] = клетка;
                Крта_Масив[x, y].Ширина = x;
                Крта_Масив[x, y].Высота = y;
            }
        }

    }

}

 

Тут сам расчет:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class А : MonoBehaviour
{
    public Клетка Начало;
    public Клетка Конец;
    public Карта Карта_Сылка;
    public Клетка[,] Крта_Масив;

    public List<Клетка> Провереные = new List<Клетка>();
    public List<Клетка> Ждущие_Проверку = new List<Клетка>();


    void Start()
    {

       
        Карта_Сылка = GameObject.Find("Скрипты").GetComponent<Карта>();
        Крта_Масив = Карта_Сылка.Крта_Масив;
        Клетка[] я = FindObjectsOfType<Клетка>();
        Начало = я[я.Length -42 ];
        Конец = я[20];

        for (int d = 0; d < 10; d++)
        {
            Крта_Масив[d, 5].Занята = true;
        }
        for (int d = 5; d < 37; d++)
        {
            Крта_Масив[d, 9].Занята = true;
        }




        //Начало = Провереные[Провереные.Count - 1];

        Поиск_Соседних_Ячеек();
        Найти_Наименьшее_Число();

     
        int dd = 0;
        foreach (var item in Ждущие_Проверку)
        {
            Начало = item;
            Поиск_Соседних_Ячеек();
            Найти_Наименьшее_Число();
        }
        foreach (var item in Ждущие_Проверку)
        {
            Провереные.Add(item);
        }
    }

   
    void Найти_Наименьшее_Число()
    {
        int костыль = 9999;
        for (int i = 1; i < Ждущие_Проверку.Count; i++)
        {
            if (Ждущие_Проверку[i].Всего <= костыль)
            {
                костыль = Ждущие_Проверку[i].Всего;
               
            }
            else
            {
                Ждущие_Проверку.RemoveAt(i);
                i --;
            }
        }

    }

    void Update()
    {
        foreach (var item in Провереные)
        {
            item.Путь_найден = true;
        }
    }


    void Поиск_Соседних_Ячеек()
    {
        Начало.Проверена = true;

        if(Начало.Ширина - 1 >= 0 && Начало.Ширина -1 <= Крта_Масив.GetLength(0) && Начало.Высота + 1 >= 0 && Начало.Высота + 1 <= Крта_Масив.GetLength(1))//
        {
            Клетка расчет = Крта_Масив[Начало.Ширина - 1, Начало.Высота + 1];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;
                   
                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 14;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                   
                }
            }
        }
        if (Начало.Ширина >= 0 && Начало.Ширина <= Крта_Масив.GetLength(0) && Начало.Высота + 1 >= 0 && Начало.Высота + 1 <= Крта_Масив.GetLength(1))//
        {
            Клетка расчет = Крта_Масив[Начало.Ширина, Начало.Высота + 1];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 10;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                 
                }
            }
        }
        if (Начало.Ширина + 1 >= 0 && Начало.Ширина + 1 <= Крта_Масив.GetLength(0) && Начало.Высота + 1 >= 0 && Начало.Высота + 1 <= Крта_Масив.GetLength(1))//
        {
            Клетка расчет = Крта_Масив[Начало.Ширина + 1, Начало.Высота + 1];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 14;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                   
                }
            }
        }
        if (Начало.Ширина - 1 >= 0 && Начало.Ширина - 1 <= Крта_Масив.GetLength(0) && Начало.Высота >= 0 && Начало.Высота <= Крта_Масив.GetLength(1))//
        {
            Клетка расчет = Крта_Масив[Начало.Ширина - 1, Начало.Высота];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 10;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                   
                }
            }
        }
        if (Начало.Ширина + 1 >= 0 && Начало.Ширина + 1 <= Крта_Масив.GetLength(0) && Начало.Высота >= 0 && Начало.Высота <= Крта_Масив.GetLength(1))//
        {
            Клетка расчет = Крта_Масив[Начало.Ширина + 1, Начало.Высота];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 10;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                 
                }
            }
        }
        if (Начало.Ширина - 1 >= 0 && Начало.Ширина - 1 <= Крта_Масив.GetLength(0) && Начало.Высота - 1 >= 0 && Начало.Высота - 1 <= Крта_Масив.GetLength(1))
        {
            Клетка расчет = Крта_Масив[Начало.Ширина - 1, Начало.Высота - 1];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 14;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                   
                }
            }
        }
        if (Начало.Ширина >= 0 && Начало.Ширина <= Крта_Масив.GetLength(0) && Начало.Высота - 1 >= 0 && Начало.Высота - 1 <= Крта_Масив.GetLength(1))
        {
            Клетка расчет = Крта_Масив[Начало.Ширина, Начало.Высота - 1];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 10;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                   
                }
            }
        }
        if (Начало.Ширина + 1 >= 0 && Начало.Ширина + 1 <= Крта_Масив.GetLength(0) && Начало.Высота - 1 >= 0 && Начало.Высота - 1 <= Крта_Масив.GetLength(1))
        {
            Клетка расчет = Крта_Масив[Начало.Ширина + 1, Начало.Высота - 1];
            if (расчет.Занята == false)
            {
                Ждущие_Проверку.Add(расчет);
                if (расчет.Проверена == false)
                {
                    расчет.Проверена = true;

                    int a = расчет.Ширина - Конец.Ширина;
                    int b = расчет.Высота - Конец.Высота;
                    if (a < 0) { a = a * -1; }
                    if (b < 0) { b = b * -1; }
                    расчет.Растояние = a + b;
                    расчет.Цена = расчет.Цена + 14;
                    расчет.Всего = расчет.Цена + расчет.Растояние;
                   
                }
            }
        }



    }


}

 
Последний раз редактировалось Ryzen 08 июл 2020, 18:11, всего редактировалось 3 раз(а).
Ryzen
UNец
 
Сообщения: 3
Зарегистрирован: 08 июл 2020, 17:35

Re: Помогите дописать и понять Алгоритм А*

Сообщение Ryzen 08 июл 2020, 17:49

Добился я пока что только поиска соседних ячеек и цена их, делаю я так: считаю дистанцию по "манхетану", цену клетки получаю как верх-низ-право-лево по 10 и наискосок по 14 и общая цена их равна сумме, у меня он находит соседнии но мне не понятно как реализовать алгоритм при котором найдены более 1 клетки, давайте разберемся вместе ^:)^
Последний раз редактировалось Ryzen 08 июл 2020, 18:12, всего редактировалось 1 раз.
Ryzen
UNец
 
Сообщения: 3
Зарегистрирован: 08 июл 2020, 17:35

Re: Помогите дописать и понять Алгоритм А*

Сообщение 1max1 08 июл 2020, 18:05

Не кидай код под спойлеры, ты же видишь он через (полная Ж) отображается.
Последний раз редактировалось 1max1 08 июл 2020, 18:42, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите дописать и понять Алгоритм А*

Сообщение Ryzen 08 июл 2020, 18:12

1max1 писал(а):Не кидай код под спойлеры ты же видишь он через (полная Ж) отображается.

Поправил.
Ryzen
UNец
 
Сообщения: 3
Зарегистрирован: 08 июл 2020, 17:35


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7