Làm thế nào để tham chiếu một vị trí bản đồ trong mã?


8

Tôi đang mã hóa một phiên bản kỹ thuật số của trò chơi bảng Macao có bản đồ phẳng tương tự như bên dưới. Người chơi có một "con tàu" bắt đầu trong hộp màu xanh và có thể đi theo các đường đứt nét theo bất kỳ hướng / hướng nào. Các hình chữ nhật lớn hơn đại diện cho các vị trí thành phố.

Tôi bị mắc kẹt trong các vấn đề sau.

  1. Làm thế nào để tôi ghi lại vị trí của mỗi con tàu? Tôi đang nghĩ các tọa độ như X, Y nhưng điều đó không cho tôi biết phân khúc của nó

  2. Làm thế nào để tôi xây dựng các tuyến đường như các đối tượng? Tôi có đặt chúng trong một mảng không?

  3. Cuối cùng; để đo khoảng cách giữa 1 hình chữ nhật và hình chữ nhật khác, nó sẽ cần tính xem có bao nhiêu phân đoạn để xác định khoảng cách ngắn nhất. Tôi tin rằng điều này có thể được giải quyết thông qua một thuật toán đường dẫn đơn giản.

Tôi chưa từng tạo một bản đồ như thế này trước đây trong một dự án nhưng sẽ hoan nghênh mọi sự giúp đỡ về cách di chuyển này về phía trước.

khái niệm bản đồ


Nhìn thấy sự nhầm lẫn do câu trả lời của tôi, bạn có thể chỉnh sửa câu hỏi của mình và chỉ định xem khoảng cách giữa dấu gạch ngang có phải là điểm mà tàu có thể dừng và ở lại không, hoặc nếu chúng chỉ là tuyến và tàu phải dừng và chỉ ở trong thành phố :)
Vaillancourt

Dấu gạch ngang thể hiện các điểm hợp pháp duy nhất mà tàu có thể dừng / ở lại. Chúng cũng hoạt động như các tuyến hợp pháp. Các thành phố cũng tính. Một chiếc thuyền buồm sẽ cần hạ cánh vật lý tại thành phố mong muốn. Bỏ qua các không gian.
Atilla Jax

Câu trả lời:


8

Tôi sẽ đề nghị bạn bắt đầu bằng cách xây dựng một biểu đồ nút (một loạt các nút và cung (đôi khi được gọi là các cạnh)).

  • Các nút là các thành phố và giao lộ "gạch ngang"
  • Các thành phố liên kết vòng cung và giao lộ "gạch ngang"

Sau đó, tất cả các nút này có thông tin như vị trí 'vật lý' của chúng (tọa độ x / y trên bản đồ).

Để giải quyết vấn đề của bạn:

  1. bạn sử dụng vị trí được đặt trong các nút để suy ra vị trí và hướng.
  2. điều này sẽ phụ thuộc vào việc thực hiện biểu đồ nút của bạn.
  3. sử dụng thuật toán tìm đường dẫn như A * để tìm tuyến đường tốt nhất giữa vị trí hiện tại của bạn và điểm đến. Biểu đồ của bạn, một lần nữa, sẽ được sử dụng cho điều đó.

Điều này sẽ giúp bạn bắt đầu.

Biên tập

Biểu đồ nút được tạo ra có thể trông như thế này:

Biểu đồ nút được sản xuất

Tất nhiên, các cung được mô tả trong hình sẽ là các cung liên kết các nút trong biểu đồ.

Bây giờ, từ câu hỏi không rõ liệu các nút giao nhau có phải là điểm mà tàu có thể ở lại hay không , nhưng vì nó được thiết kế như một trò chơi trên bảng, tôi cho rằng nếu có nhiều hơn một dấu gạch giữa hai thành phố, thì đó là vì chi phí nhiều hơn để đi từ thành phố này sang thành phố khác (ví dụ bạn cần 2 trên một con xúc xắc thay vì chỉ 1). Với suy nghĩ này, tôi cho rằng một con tàu có thể ở lại những điểm này (nhưng không phải trên cung).

Tuy nhiên, nếu không phải như vậy, các nút giao nhau vẫn có thể được sử dụng cho mục đích điều hướng giữa các thành phố. Điều này sẽ cung cấp cho các tàu theo dõi vuông, tuy nhiên, vì vậy có lẽ nên thực hiện một cách tiếp cận khác cho điều đó. Ví dụ: các cạnh có thể chứa dữ liệu mô tả cách chúng nên được di chuyển (spline, chuỗi dấu chấm, v.v.).


Hình ảnh OP được đăng không được thể hiện tốt bằng biểu đồ nút. Vì có một giao điểm của các cạnh không có nút (ở bên phải).
MichaelHouse

Bạn có thể có 2 loại nút: nút thành phố và nút giao nhau. Tôi cho rằng chúng là những điểm mà con tàu có thể ở lại sau khi người chơi quay đầu, và rằng một con tàu chỉ có thể đi qua các cung và không ở lại trên chúng. Hãy xem liệu tôi có thể thêm một hình ảnh.
Vaillancourt

@ Byte56 Tôi đã thêm một chút chi tiết về những gì tôi nghĩ, có lẽ bây giờ nó rõ ràng hơn!
Vaillancourt

2
Ah, giải pháp này rõ ràng hơn với hình ảnh. +1 cho các kỹ năng Photoshop điên rồ (và cho câu trả lời hay).
Alexandre Desbiens 7/07/2015

Vâng, đây là lỗi của tôi, tôi không muốn đăng một hình ảnh thực tế vì lý do bản quyền nên đã giải thích rất nhanh về nó.
Atilla Jax

1

Alexandre đã đưa ra một câu trả lời tốt. Tôi nghĩ rằng tôi sẽ đâm một ví dụ cụ thể.

Ví dụ là C #, nhưng hy vọng nó đủ chung để thực hiện bằng bất kỳ ngôn ngữ nào bạn chọn sử dụng.

using System;
using System.Collections.Generic;

public class SimpleGraph
{
    private int _numberOfCities;
    private int[] _paths;


    public SimpleGraph()
    {
        _numberOfCities = 9;
        _paths = new int[_numberOfCities * (_numberOfCities + 1) / 2];

        AddPath(0, 2, 1);
        AddPath(0, 3, 2);
        AddPath(3, 4, 2);
        AddPath(3, 5, 1);
        AddPath(3, 2, 1);
        AddPath(2, 1, 1);
        AddPath(2, 6, 1);
        AddPath(5, 6, 1);
        AddPath(6, 7, 1);
        AddPath(5, 7, 1);
        AddPath(6, 8, 5);
        AddPath(7, 8, 5);
        AddPath(1, 8, 6);
    }


    public void AddPath(int cityA, int cityB, int distance)
    {
        int pathIndex = getPathIndex(cityA, cityB);
        if (pathIndex < 0 || _paths.Length <= pathIndex) return;

        _paths[pathIndex] = distance;
    }


    public void RemovePath(int cityA, int cityB)
    {
        AddPath(cityA, cityB, 0);
    }


    public int GetPathDistance(int cityA, int cityB)
    {
        int pathIndex = getPathIndex(cityA, cityB);
        if (pathIndex < 0 || _paths.Length <= pathIndex) return 0;

        return _paths[pathIndex];
    }


    public bool HasPath(int cityA, int cityB)
    {
        return GetPathDistance(cityA, cityB) > 0;
    }


    public List<int> GetAvailableCities(int currentCity)
    {
        var result = new List<int>();

        for (int i = 0; i < _numberOfCities; i++)
        {
            if (HasPath(currentCity, i)) result.Add(i);
        }

        return result;
    }


    private int getPathIndex(int cityA, int cityB)
    {
        if (cityA == cityB) return -1;

        int small, big;

        if (cityA < cityB)
        {
            small = cityA;
            big = cityB;
        }
        else
        {
            small = cityB;
            big = cityA;
        }

        return (big * (big - 1) / 2) + small;
    }
}

Đây là biểu đồ biểu đồ của bản đồ của bạn nếu bạn đánh số các thành phố theo cách sau: Thành phố được đánh số

Sau đó, tất cả những gì bạn cần làm là theo dõi một số nguyên từ 0 đến 9, đó là vị trí hiện tại của tàu của bạn và sử dụng các phương pháp để tìm đường đi.


Các phân đoạn là các bước mặc dù. Mặc dù tôi đánh giá cao sự giúp đỡ. Một con tàu không thể nhảy từ 8-7 mà không đi trên 5 bước được phân đoạn (đường màu đen)
Atilla Jax

Trong trường hợp đó, bạn vẫn có thể sử dụng lớp được cung cấp, nhưng sẽ có các nút không phải là thành phố và nút.
PatrickSharbaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.