Là tốt hơn để dữ liệu mã cứng hoặc tìm một thuật toán?


8

Tôi đã làm việc trên một boardgame có lưới hex như bảng này:

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

Vì bảng sẽ không bao giờ thay đổi và các khoảng trắng trên bảng sẽ luôn được liên kết với cùng các không gian khác xung quanh nó, tôi có nên mã hóa mọi khoảng trống với các giá trị mà tôi cần không? Hoặc tôi nên sử dụng các thuật toán khác nhau để tính toán các liên kết và truyền tải?

Cụ thể hơn, trò chơi hội đồng quản trị của tôi là một trò chơi 4 người trong đó mỗi người chơi có lưới hex 5x5x5x5x5x5 (một lần nữa, hình ảnh ở trên). Mục tiêu là đi từ dưới cùng của lưới lên trên cùng, với nhiều chướng ngại vật khác nhau và mỗi người chơi có thể tấn công lẫn nhau từ rìa lưới của họ vào những người chơi khác dựa trên hệ số nhân.

Vì lưới người chơi sẽ không bao giờ thay đổi và khoảng cách của bất kỳ khoảng trống tùy ý nào từ mép lưới sẽ luôn giống nhau, tôi chỉ nên mã số này vào từng khoảng trống, hoặc tôi vẫn nên sử dụng thuật toán tìm kiếm đầu tiên khi Người chơi đang tấn công?

Điều duy nhất tôi có thể nghĩ về mã hóa cứng mọi thứ là tôi sẽ mã 9+ 2 (5 + 6 + 7 + 8) = 61 ô riêng lẻ. Có bất cứ điều gì khác mà tôi thiếu mà tôi nên xem xét sử dụng các thuật toán phức tạp hơn không?


Tôi có thể cho bạn biết diện tích của một cuộc tấn công bán kính là 1 cộng với tổng các điều khoản của chuỗi được cho bởi f (n) = 6 (n-1) từ n = 1 đến n = x trong đó x là số hàng. EG 3 hàng (bán kính 10 feet) = 1 + 6 + 12 = 19
eazimmerman

Đây là mã giả của những gì tôi đã mô tả int numberOfHexagonsInArea(int rows) { int area = 1; while(rows>0) { area += (rows-1)*6; rows--; } return area; }
eazimmerman

Nó không có vẻ rất khó? Từ {X,Y}bạn rõ ràng có thể đi đến {X-1, Y}{X+1, Y}trên cùng một hàng. Trên các hàng bên dưới và bên trên, bạn có thể đi đến {X, Y-1}{X, Y+1}. Cuối cùng, tùy thuộc vào số chẵn của Y, bạn có thể truy cập {X-1, Y-1}{X-1, Y+1}hoặc {X + 1, Y-1} `và{X+1, Y+1}
MSalters

Câu trả lời:


12

Tôi đoán tôi sẽ lấy điểm đối diện ở đây và lập luận chống lại việc sử dụng các giá trị tĩnh. Trong trường hợp này, tất cả các vùng hex mà bạn đang nói đến là (a) dễ tính toán - bạn không cần sử dụng BFS hoặc bất cứ điều gì quá phức tạp; bạn sẽ có thể lặp lại tất cả các hình lục giác trong bất kỳ hình lục giác nào với các vòng lặp gấp đôi đơn giản; và (b) không phải thứ gì đó bạn sẽ cần phải tính toán 'trên đường bay' rất thường xuyên. Tại tồi tệ nhất bạn chỉ nên cần phải tính toán chúng một lần mỗi lần lượt, và nếu nhiều hệ thống làm muốn các tế bào xúc động trước một hiệu ứng thì bạn có thể dễ dàng nhớ cache các giá trị ra thành một mảng 'reachableCells' hay cái gì tương tự; bất kể, việc tính toán rất dễ dàng đến mức nó có thể được thực hiện miễn phí một cách hiệu quả về mặt chi phí cho mỗi khung hình.

Vì vậy, bạn nhận được gì cho điều đó? Uyển chuyển. Ngay bây giờ thật dễ dàng để nói rằng những giá trị này sẽ không bao giờ thay đổi, nhưng các trò chơi có một sở trường làm bạn ngạc nhiên; ngay cả khi nhiều khả năng hơn là các khu vực này sẽ không thay đổi, về cơ bản bạn không từ bỏ điều gì bằng cách xây dựng tính linh hoạt đó và có một cơ hội tốt trong tương lai - bạn sẽ cảm ơn bạn trong tương lai. Hơn nữa, ngay cả khi đó là những khu vực cuối cùng bạn sử dụng, các vòng lặp được viết tốt để lặp lại qua các khu vực sẽ dễ hiểu và gỡ lỗi hơn bất kỳ loại mảng gạch cố định nào. Tôi thực sự không thấy bất kỳ lợi ích có ý nghĩa nào khi sử dụng dữ liệu được mã hóa cứng so với lợi ích của việc đi theo cách khác.


11

Nếu các giá trị sẽ không bao giờ thay đổi, chúng cũng có thể là tĩnh. Tại sao lại lãng phí thời gian của CPU để tính toán lại một cái gì đó sẽ giống như lần trước?

Tuy nhiên, họ không nhất thiết phải là 'mã hóa cứng':

  • Bạn có thể đặt các giá trị trong một tệp dữ liệu và tải nó vào lúc bắt đầu.
  • Bạn có thể thực hiện tìm kiếm trong khi chơi và lưu trữ các giá trị khi bạn tìm thấy chúng.

Cách đầu tiên có ý nghĩa nếu bạn nghĩ rằng bạn có thể thay đổi hình dạng hoặc kích thước bản đồ trong tương lai. Cách thứ hai có ý nghĩa nếu tính toán các giá trị tĩnh là một chút khó khăn.

Tôi không biết bản đồ lục giác sáu chiều trông như thế nào, hoặc tại sao có các ô 9 + 2 (5 + 6 + 7 + 8), nhưng kết quả tốt nhất cho tình huống của bạn - và thực sự là hầu hết các tình huống trong lập trình trò chơi - là để mã trong bất cứ điều gì giúp bạn có được kết quả chính xác nhanh nhất. Bạn có thể khái quát nó thành một thuật toán sau nếu bạn cần. "Mã cho ngày hôm nay", như một số người nói.


Tất cả điều này. Đầu tiên làm cho nó hoạt động sau đó xoa dịu cái tôi;)
Mike Cluck

2
Chỉ để làm rõ sự nhầm lẫn của bạn, tôi nghĩ rằng OP khi đề cập đến lưới lục giác 5x5x5x5x5x5 không đề cập đến 6 kích thước vật lý (hoặc ảo), mà thay vào đó là một hình lục giác hình lục giác, trong đó mỗi cạnh của hình lục giác chứa 5 hình lục giác nhỏ hơn dọc theo chiều dài của nó, tương tự như thế này (bỏ qua các chấm đen). Trong trường hợp đó, bảng sẽ chứa các ô 9 + 2 (5 + 6 + 7 + 8).

Vâng, tôi thấy rằng từ sơ đồ được đăng lên trong một chỉnh sửa.
Kylotan

0

Q: đây có phải là trò chơi hex duy nhất bạn từng viết không? Không?

A: Sau đó, rõ ràng bạn nên cố gắng linh hoạt ở bất cứ nơi nào nó không làm bạn tốn nhiều công sức hơn. Bất kể bạn định nghĩa bảng như thế nào, hãy trình bày nó trong thời gian chạy với các liên kết rõ ràng. Rất thuận tiện để di chuyển mã và logic mối quan hệ theo các liên kết ngang, độc lập với kích thước hoặc cấu trúc liên kết của bảng.

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.