Thuật toán tìm đường A* (A-Star)

Nền tảng:
3D
2D
Tags:
AI
Algorithm
Pathfinding

C# Code

// A* là một thuật toán phức tạp, đây là một phiên bản giả mã/đơn giản hóa để hiểu ý tưởng chính.
using System.Collections.Generic;

public class AStarPathfinder {
    public List<Node> FindPath(Node startNode, Node targetNode) {
        List<Node> openSet = new List<Node>();
        HashSet<Node> closedSet = new HashSet<Node>();
        openSet.Add(startNode);

        while (openSet.Count > 0) {
            Node currentNode = openSet[0];
            // Tìm node có F-cost thấp nhất trong openSet
            for (int i = 1; i < openSet.Count; i++) {
                if (openSet[i].FCost < currentNode.FCost || 
                   (openSet[i].FCost == currentNode.FCost && openSet[i].hCost < currentNode.hCost)) {
                    currentNode = openSet[i];
                }
            }

            openSet.Remove(currentNode);
            closedSet.Add(currentNode);

            if (currentNode == targetNode) {
                return RetracePath(startNode, targetNode);
            }

            foreach (Node neighbour in GetNeighbours(currentNode)) {
                if (!neighbour.isWalkable || closedSet.Contains(neighbour)) continue;

                int newMoveCost = currentNode.gCost + GetDistance(currentNode, neighbour);
                if (newMoveCost < neighbour.gCost || !openSet.Contains(neighbour)) {
                    neighbour.gCost = newMoveCost;
                    neighbour.hCost = GetDistance(neighbour, targetNode); // H-cost: chi phí ước tính
                    neighbour.parent = currentNode;

                    if (!openSet.Contains(neighbour)) openSet.Add(neighbour);
                }
            }
        }
        return null; // Không tìm thấy đường đi
    }
    // Các hàm phụ trợ như RetracePath, GetNeighbours, GetDistance cần được triển khai...
}

public class Node {
    public bool isWalkable; public Vector3 worldPosition;
    public int gCost, hCost; public Node parent;
    public int FCost { get { return gCost + hCost; } }
}

Triển khai thuật toán A* (A-Star), một trong những thuật toán tìm đường hiệu quả nhất cho AI, kết hợp giữa chi phí đã đi (G-cost) và chi phí ước tính đến đích (H-cost).

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Thuật toán Dijkstra tìm đường đi ngắn nhất từ một đỉnh nguồn đến tất cả các đỉnh khác trong một đồ thị có trọng số không âm. Hữu ích cho việc tính toán phạm vi di chuyển.

AI
Algorithm
Pathfinding

Thuật toán tìm kiếm theo chiều rộng (BFS) duyệt qua đồ thị theo từng lớp. Rất hữu ích để tìm đường đi ngắn nhất trên bản đồ không có trọng số (ví dụ: lưới ô vuông).

AI
Algorithm
Pathfinding

Thuật toán tìm kiếm theo chiều sâu (DFS) đi sâu vào một nhánh cho đến khi hết đường, sau đó quay lại. Thường được dùng để giải mê cung hoặc duyệt cây dữ liệu (skill tree).

AI
Algorithm
Pathfinding

Hướng dẫn thiết lập và sử dụng hệ thống Navigation (NavMesh) tích hợp sẵn của Unity để AI có thể tự động tìm đường đi trong môi trường 3D phức tạp.

3D
AI
Pathfinding
Navigation

AI chỉ có thể 'nhìn thấy' và phát hiện người chơi nếu họ nằm trong một hình nón phía trước mặt nó. Hữu ích cho các game stealth.

AI
Gameplay
Stealth

AI sẽ bắn đạn về phía người chơi khi họ ở trong tầm tấn công và có một khoảng thời gian chờ (cooldown) giữa mỗi lần bắn.

AI
Gameplay
Spawning
Physics

AI sẽ phát hiện người chơi trong một phạm vi nhất định và bắt đầu di chuyển về phía họ. Khi người chơi ra khỏi phạm vi, AI sẽ dừng lại.

AI
Movement
Gameplay
Player

Một script đơn giản cho AI để di chuyển tuần tự qua một danh sách các điểm (waypoints). Khi đến điểm cuối cùng, nó sẽ quay trở lại điểm đầu tiên.

AI
Movement
Gameplay

Một cấu trúc để một con boss thay đổi hành vi và bộ kỹ năng khi máu của nó xuống dưới các ngưỡng nhất định.

AI
Gameplay
Combat

So sánh các thuật toán sắp xếp như Bubble Sort, Insertion Sort và Quick Sort và khi nào nên sử dụng chúng trong game (ví dụ: sắp xếp bảng xếp hạng).

Algorithm
Architecture
Optimization