Làm thế nào để xác định phạm vi chuyển động có thể có trong trò chơi chiến lược theo lượt, dựa trên khoảng cách?


11

Tôi đang tạo một trò chơi chiến lược theo lượt 2 chiều bằng c ++ và SFML-2.0. Chuyển động dựa trên khoảng cách thay vì dựa trên lưới, với một số mảnh hình tam giác khác nhau, trên một ngã rẽ nhất định, mỗi vòng có thể xoay tại chỗ hoặc di chuyển về phía trước.

Chuyển động sẽ hoạt động theo cách mà người chơi chọn một vị trí cho quân cờ để di chuyển tới, điều này tạo ra một đường dẫn tiềm năng cho quân cờ đi. Khi người chơi xác nhận quyết định của mình, quân cờ sẽ di chuyển dọc theo con đường đó đến vị trí mong muốn. Các đường dẫn bị giới hạn bởi hai yếu tố: khoảng cách, quãng đường có thể đi được bao xa, có tính đến bất kỳ ngã rẽ nào (vì vậy nếu có đường cong, nó sẽ là chiều dài dọc theo đường cong và không trực tiếp từ điểm này sang điểm khác); và góc lái, mảnh có thể xoay bao xa tại bất kỳ điểm nào (và lên đến mọi điểm) trong khi di chuyển (ví dụ: từ -30 đến 30 độ).

Câu hỏi của tôi là, làm thế nào tôi nên đi về việc xác định phạm vi vị trí tiềm năng mà người chơi có thể chọn để di chuyển mảnh?

Tôi không hoàn toàn chắc chắn phương trình và / hoặc thuật toán sẽ sử dụng ở đây. Kế hoạch ban đầu của tôi vô cùng phức tạp, đến mức gần như không thể thực hiện được, hãy để một mình giải thích, và tại thời điểm này tôi hoàn toàn lạc lối với dự án bị đình trệ.

Làm cách nào tôi có thể xác định phạm vi mà một đơn vị có thể di chuyển, có tính đến bán kính quay của nó?

Ví dụ, trong hình dưới đây. Các đường màu đỏ, xanh dương và xanh lá cây sẽ có cùng chiều dài. Vòng tròn màu tím biểu thị phạm vi chuyển động mà đơn vị có thể di chuyển. (Hình dạng có thể không chính xác và các đường có thể không thực sự có cùng độ dài, nhưng bạn hiểu ý)

nhập mô tả hình ảnh ở đây


Nó vẫn chỉ có thể di chuyển cùng một khoảng cách (tổng cộng). Vậy câu hỏi thực sự là về để tìm ra "bao xa nó bật?" / "Bao nhiêu nó cần bật?" / " Nơi làm nó cần bật?". Bạn có thể cần bắt đầu từ việc xác định đường dẫn thông thường, sau đó bước bắt đầu quay lại cho các góc trên một số tiền nhất định; lưu ý rằng khoảng cách cuối cùng sẽ dài hơn trên một đường thẳng (rẽ mới nhất) so với các đường cong.
Clockwork-Muse

Có, khoảng cách đi là yếu tố giới hạn chính. Rào cản lớn nhất của tôi ở đây là tôi cần tính đến việc mảnh có thể xoay và tiếp tục quay, tại bất kỳ thời điểm nào nó có thể chạm tới, miễn là nó vẫn còn khoảng cách.
sfphilli

Ý bạn là gì, phạm vi mà một đơn vị có thể di chuyển? Bạn có nghĩa là những điểm nó có thể di chuyển đến? Làm thế nào bạn quen thuộc với đại số tuyến tính (vectơ)?
BlueRaja - Daniel Pflughoeft

1
Kịch bản thực tế nào bạn đang cố gắng mô hình hóa? Vấn đề của bạn quá mơ hồ về các yêu cầu, dẫn đến quá nhiều giải pháp tiếp cận được đề xuất. Có một cách tiếp cận nổi tiếng đối với (hầu như) mọi vấn đề cụ thể trong lĩnh vực này, nhưng mọi người đều đoán được vấn đề nào trong số nhiều vấn đề mà bạn đang thực sự giải quyết.
Pieter Geerkens

1
@PieterGeerkens Tôi cho rằng vì OP không yêu cầu mã, họ đang yêu cầu một thuật toán. Và đã cung cấp đủ chi tiết về kịch bản mà một thuật toán có thể được hình thành một cách hợp lý. Điều này là phổ biến và được chấp nhận.
MichaelHouse

Câu trả lời:


4

Tạo trường dòng chảy hoặc khoảng cách, sử dụng Dijsktra's.

Về cơ bản, điền vào một lưới bằng thuật toán Dijkstra không có đích (có thể là một tên khác cho điều đó; không biết điều đó). Chỉ cần lấy từng nút mở, tính toán các hàng xóm có thể tiếp cận, đẩy chúng vào danh sách mở, đặt vào danh sách đã đóng, cập nhật đường dẫn "tiếp theo" của nút cha là phù hợp, v.v. Khi xác định chi phí để tiếp cận nút mới, hãy xem xét các giới hạn rẽ.

Kết quả bây giờ là bạn có một mạng lưới tất cả các nút của bạn về cách quay lại từ đầu. Các nút không thể đạt được sẽ không được chạm vào bước đầu tiên. Các nút có thể đạt được sẽ có phần tử "nút tiếp theo dọc theo đường dẫn tốt nhất có thể đến cha mẹ" để bạn có thể làm nổi bật tất cả các nút và sau đó cũng sử dụng thông tin này để hiển thị hoặc thực hiện đường di chuyển khi người dùng di chuyển hoặc nhấp vào các vùng được tô sáng.


Không hoàn toàn làm thế nào tôi sẽ giải thích khái niệm, hoặc cách tôi sẽ thực hiện nó, nhưng chắc chắn là cách tiếp cận đúng.
Pieter Geerkens

Sự hiểu biết của tôi về thuật toán, tương tự, là việc truyền qua nút cần phải độc lập với đường dẫn. Vì vậy, để thực hiện điều này, bạn cần thêm một mức độ tự do khác (một trục khác để tạo các nút của bạn) dành riêng cho việc đối mặt. Nói cách khác, bạn sẽ có một nút cho mỗi kết hợp X, Y, có khả năng Z và Đối mặt khác nhau. Mặt khác, việc tìm đường đi ngắn nhất để vào một nút không phân biệt giữa các khía cạnh khác nhau khi rời khỏi nó. Đúng không? Nếu đó là trường hợp, phương pháp này có thể quá chuyên sâu?
TASagent

@TASagent: điểm tốt, tôi đã không nghĩ rằng một trong những hoàn toàn. Các thuật toán sau đó có thể là một chút nhưng cách tiếp cận nên làm việc.
Sean Middleditch

@PieterGeerkens: Tôi đồng ý rằng đó là một lời giải thích tồi. Bạn nên làm cho câu trả lời của riêng bạn mà giải thích tất cả tốt hơn.
Sean Middleditch

Điều này có vẻ như khá gần với những gì tôi cần, nhưng tôi phải thừa nhận rằng tôi chưa bao giờ nghe về thuật toán đó và vì vậy không biết cách khái quát nó theo những gì tôi cần. Bạn có tình cờ có một liên kết đến bất kỳ thông tin hoặc hướng dẫn tốt về nó?
sfphilli

4

Một giải pháp vũ phu sẽ là:

  1. Tạo một vòng tròn các đỉnh xung quanh đơn vị, với đơn vị ở giữa. Bán kính của vòng tròn là khoảng cách di chuyển tối đa. Mật độ của các đỉnh có thể thay đổi tùy thuộc vào mức độ chi tiết mà bạn muốn kết quả cuối cùng.
  2. Đối với mỗi vị trí đỉnh, mô phỏng chuyển động của bộ phận lái về phía vị trí đó. Điều này được thực hiện trong một vòng lặp chặt chẽ mà không cần kết xuất.
  3. Khi đạt được khoảng cách tối đa trong mô phỏng lái, di chuyển đỉnh tới điểm của đơn vị mô phỏng. Điểm này là điểm gần nhất mà đơn vị có thể đến đỉnh đó trước khi lượt hiện tại kết thúc. Điều này có tác dụng thu nhỏ vòng tròn theo kích thước của chuyển động thực tế.
  4. Sử dụng các đỉnh đó, cùng với một đỉnh ở giữa đơn vị để tạo một vòng tròn được hiển thị để vẽ khoảng cách di chuyển có thể.

nhập mô tả hình ảnh ở đây

Vì vậy, bắt đầu với vòng tròn màu xanh, bạn sẽ xử lý các đường dẫn của mình, kết thúc bằng vòng tròn màu tím. Sau đó, bạn có thể sử dụng các điểm đó với một điểm trung tâm trên đơn vị để tạo ra các hình tam giác màu đỏ cần thiết để hiển thị hình dạng. (Chỉ tạo hình ảnh đó khiến tôi nhận ra rằng hình dạng đó không chính xác, nhưng sẽ rất thú vị khi xem những gì thực sự chính xác)


3

Tôi sẽ mở rộng giải pháp của Sean trong một câu trả lời riêng biệt, vì nó đại diện cho một cách tiếp cận khác với những gì tôi đã đề xuất ban đầu.

Giải pháp này có thể đại diện cho phương pháp dễ tiếp cận nhất. Nó yêu cầu phân vùng môi trường của bạn thành các nút. Đúng, đây là giới thiệu lại một cách tiếp cận dựa trên lưới, nhưng nó có thể được thực hiện tương đối tốt hoặc được sử dụng cho tìm đường rộng với định vị tốt hơn được xử lý trong nút. Cấu trúc nút càng thô, đường dẫn càng nhanh.

Vấn đề lớn ở đây là bạn thực sự đang đối phó với tàu phải đối mặt, vì vậy nhiều giải pháp tìm đường truyền thống không thể được sử dụng mà không sửa đổi. Chúng thường không liên quan đến đường dẫn, ở chỗ chúng không quan tâm đến cách bạn đến nút mà bạn tham gia. Điều đó hoạt động tốt khi tăng tốc, giảm tốc và quay đầu tức thì và miễn phí. Thật không may cho bạn biến không phải là miễn phí. Tuy nhiên, vì thực sự có thêm một phần thông tin bị bỏ trong đơn giản hóa này, chúng ta có thể mã hóa nó thành một biến khác. Trong vật lý, điều này sẽ được gọi là không gian pha.

Giả sử 2 chiều bây giờ, bạn có thể ngoại suy cho 3:

Thông thường, bạn sẽ cần một nút cho mỗi vị trí tọa độ riêng biệt, cho phép. Ví dụ:

(0,0) - (1,0) - (2,0)
  | \  /  |  \  / |
(0,1) - (1,1) - (2,1)

V.v. Bạn sẽ xây dựng một nút của các điểm liền kề và kết nối chúng bằng sự phụ thuộc không gian. Sau đó, bạn sẽ sử dụng thuật toán của Dijkstra, tiêu diệt các nút vượt quá giá trị chuyển động được phép cho lượt chơi, cho đến khi không còn nút nào chưa được khám phá, còn lại được kết nối với các nút được khám phá. Mỗi nút theo dõi khoảng cách nhỏ nhất cần thiết để đạt được nó.

Để mở rộng phương pháp này có thể sử dụng được với Xoay vòng, hãy tưởng tượng cùng một nút bấm trong 3 chiều. Hướng Z tương ứng với xoay / quay và theo chu kỳ, nghĩa là nếu bạn tiếp tục di chuyển theo hướng + Z bạn quay lại nơi bạn bắt đầu. Bây giờ, các nút tương ứng với các vị trí liền kề chỉ được kết nối qua mặt tương ứng với hướng đó. Bạn lặp lại qua các nút được kết nối với các nút đã khám phá như bình thường. Tôi khuyên bạn nên giới hạn ở N, NE, E, SE, S, SW, W, NW trong sơ đồ này.

Giải pháp này có thể cho bạn biết tất cả các vùng không gian có thể truy cập, cũng như đường dẫn tốt nhất để đến đó, bạn có bao nhiêu vòng quay khi đến đó và tất cả các định hướng bạn có thể có khi đến đó.

Sau đó, khi thực sự thực hiện đường dẫn, bạn có thể tự do nội suy / chia khối theo cách của bạn để làm cho nó trông chân thực hơn.


1
Thật tuyệt vời. Tôi sẽ cần nghiên cứu một chút về thuật toán và thử nghiệm nó trong trò chơi của mình, nhưng điều này thực sự gây ấn tượng với tôi vì sự phù hợp hoàn hảo, đặc biệt là khi tôi có thể khái quát nó cho một số phần quan trọng khác của trò chơi.
sfphilli

1

Có vẻ như trước tiên bạn có thể cần phải quyết định chính xác bạn muốn bật công việc như thế nào. Các tùy chọn như:

  • Nếu chúng di chuyển trong hình nón, đầu tiên xoay, sau đó bắt đầu di chuyển. Đây là giải pháp dễ dàng hơn để thực hiện và đường dẫn cho. Nó cũng ít thú vị hơn nên tôi không muốn sử dụng nó.

  • Xoay liên tục trong khi di chuyển, lên tới tổng cộng 45 độ. Điều này là rất nhiều khó khăn hơn, và hy vọng bạn là sau. Tích hợp số qua đường dẫn bằng dấu thời gian cố định có lẽ là cách dễ nhất để tiếp cận đường dẫn này. Hình nón của bạn sẽ được giới hạn bởi mức tối đa (+ X độ mỗi bước) và mức tối thiểu (-X độ mỗi bước).

Cách tốt nhất để vượt qua không gian với yêu cầu thứ hai phụ thuộc phần lớn vào môi trường mà họ sẽ di chuyển. Nếu có nhiều chướng ngại vật bạn phải vượt qua, thì mọi thứ có thể trở nên rất khó khăn và thực sự tốn kém. Tuy nhiên, nếu không có, thì bạn có thể tải trước (và thậm chí giảm dần) vòng quay để kết thúc ở vị trí mong muốn.

Tôi có cảm giác rằng tôi có thể chỉ đề cập một phần đến các chủ đề mà bạn có câu hỏi, vì vậy hãy thoải mái thêm nhiều hơn trong các bình luận và tôi có thể mở rộng cuộc thảo luận.


Tôi chắc chắn muốn sử dụng tùy chọn thứ hai, quay lên (ví dụ) 45 độ ở bất kỳ, và có khả năng mọi điểm, dọc theo một con đường. Cũng sẽ có những chướng ngại vật, mỗi cái lớn hơn những mảnh (nghĩ là những tảng đá khổng lồ). Cách ban đầu tôi nghĩ về điều này là tạo ra một hình nón của các điểm cuối có thể, và sau đó với mỗi điểm cuối đó sẽ tạo ra một hình nón mới, và cứ như vậy cho mọi vị trí có thể cho đến khi nó đạt được quãng đường tối đa di chuyển. Điều đó nói rằng, tôi không hoàn toàn chắc chắn làm thế nào để thực hiện điều này mà không cần quá phức tạp.
sfphilli

Hmmm, có vẻ như tôi đã / không rõ một chút về một số chi tiết. Nhìn lại câu hỏi tôi thấy bạn đã chỉ định 'theo lượt' và các đơn vị có thể 'xoay hoặc di chuyển' trong lượt của mình. Điều đó có nghĩa là, sau đó, người chơi sẽ vạch ra hành động của họ trước nhiều lượt và bạn có muốn thực hiện việc tìm đường trong khi họ di chuyển không? Một số làm rõ thêm về cách chuyển động được cho là hoạt động sẽ hữu ích.
TASagent

Không, điều tôi muốn nói là ở một ngã rẽ nhất định, người chơi có thể xoay mảnh của mình tại chỗ, tuy nhiên ở xa tùy thích hoặc họ có thể di chuyển theo hướng họ đang nhìn. Nếu họ di chuyển, họ có thể đi một khoảng cách cụ thể dọc theo một con đường và họ có thể xoay hoặc điều khiển đến một góc cụ thể (ví dụ như bất cứ nơi nào từ -45 đến 45 độ) trong khi di chuyển. Vì vậy, hãy tưởng tượng một con đường được chọn sẽ liên quan đến một đường cong để di chuyển sang trái hoặc phải. Đường dẫn sẽ được xác định bởi người chơi chọn một điểm họ muốn di chuyển đến, trong phạm vi các điểm có thể tôi gặp khó khăn khi xác định.
sfphilli

Ok, thật ra nghe có vẻ như, thật không may, các đặc điểm mong muốn của bạn có thể quá hạn chế đối với thuật toán Dijkstra mà chúng ta đang nói ở trên: - \. Có khả năng. Tôi sẽ phác thảo một số thứ cho việc này sau khi tôi về nhà.
TASagent

Bạn có thể muốn chỉnh sửa một số thông tin này mà bạn đã thu thập để làm rõ vấn đề thành câu hỏi ban đầu, vì vậy những người đến sau có thể bắt đầu với nhiều thông tin hơn.
TASagent
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.