Cứu nhà nước roguelike?


11

Tôi đang làm việc trên một roguelike cơ bản bằng HTML5 và jQuery và tôi đã gặp một vấn đề.

Cách trò chơi hiện đang đứng, hệ thống chỉ lưu trạng thái trò chơi mỗi khi người dùng di chuyển giữa các tầng - để giảm thiểu chi phí. Điều nguy hiểm của điều này là, nếu người dùng gặp rắc rối, họ có thể chỉ cần đóng cửa sổ và quay lại trò chơi của họ ở đầu sàn hiện tại. Điều này làm giảm đáng kể độ khó của trò chơi (và gần như đánh bại mục đích của một roguelike) - nhưng thật vô lý khi cứu trạng thái trò chơi với mỗi chuyển động hoặc tấn công của người chơi.

Tôi đã nghiên cứu các cách để lưu trạng thái trò chơi trên cửa sổ trình duyệt, nhưng tôi không hài lòng với chúng. Câu hỏi của tôi là: giả sử "lưu trạng thái trò chơi" có nghĩa là yêu cầu ajax / bài đăng nặng vừa phải, làm thế nào để tôi ngăn chặn hành vi gian lận này? Có một phương pháp đã biết để định lượng các thay đổi gia tăng / thủ tục đối với bản đồ 2d, trái ngược với việc lưu toàn bộ trạng thái bản đồ không? Xin lưu ý, tôi không yêu cầu "cách hiệu quả nhất" - Tôi đang tìm kiếm các phương pháp hiện có để khắc phục sự thiếu kinh nghiệm của mình.


Câu hỏi lập trình JavaScript rất chung chung và chung chung. Tôi đã bỏ phiếu nhưng sau đó tôi suy nghĩ lại vì điều đó thật thú vị nếu bạn xem xét cách bạn làm điều đó nếu bạn không thể kích hoạt một sự kiện không tải.
Tim Holt

Có lẽ tôi sẽ viết lại nó để giải quyết vấn đề đó trực tiếp =)
CodeMoose

@TimHolt - được chỉnh sửa theo đề xuất của bạn
CodeMoose

Câu trả lời:


8

Giải pháp rõ ràng là gửi mọi lệnh người chơi đến máy chủ như đã thực hiện và yêu cầu máy chủ ghi lại chúng; Bằng cách đó, nếu trò chơi bị hủy bỏ vì bất kỳ lý do gì, các lệnh đã ghi có thể được phát lại để khôi phục trò chơi về điểm mà trò chơi đã dừng lại.

Tất nhiên, khi lưu đúng cách, nhật ký lệnh cũ có thể bị loại bỏ (mặc dù bạn cũng có thể lưu nó để cho phép phát lại các trò chơi cũ; nếu bạn làm vậy, bạn có thể muốn đưa dấu thời gian vào nhật ký để phát lại theo thời gian thực ). Bạn cũng có thể muốn tự động thực hiện lưu đầy đủ sau khi n lệnh đã được thực hiện kể từ lần lưu cuối cùng (trong đó, giả sử, n = 1000) để tránh phát lại quá lâu nếu người chơi ở cùng cấp quá lâu trước khi đóng hoặc làm hỏng trò chơi .

Nếu trò chơi của bạn liên quan đến các số ngẫu nhiên (và, là một roguelike, thì có lẽ nó cũng vậy), bạn cũng cần đảm bảo rằng chúng có thể được tạo lại một cách chính xác trong khi phát lại. Một giải pháp là bao gồm mọi số ngẫu nhiên trong nhật ký phát lại; một cách khác là sử dụng trình tạo số giả ngẫu nhiên xác định và lưu hạt giống khi trò chơi được lưu.

Lưu ý rằng tất cả các phương thức này có thể được khai thác bằng cách giả mạo máy khách, nhưng đó thực sự là điều không thể tránh khỏi bất cứ khi nào bạn có logic trò chơi trên máy khách. Là một giải pháp thay thế gian lận, bạn có thể chạy trò chơi thực tế trên máy chủ và chỉ cần khách hàng gửi tất cả các lệnh của người chơi đến máy chủ và nhận lại cập nhật hiển thị. Đối với một roguelike, điều này cũng có thể khả thi. Rõ ràng, điều này cũng sẽ giải quyết vấn đề tiết kiệm trạng thái của bạn (mặc dù bạn vẫn có thể muốn thực hiện một số hình thức ghi nhật ký lệnh trên máy chủ, cả chức năng phát lại và cho phép khôi phục từ sự cố máy chủ). Nhược điểm là làm điều này sẽ khiến việc chơi ngoại tuyến trở nên bất khả thi (tất nhiên trừ khi bạn cũng cung cấp mã phía máy chủ để người chơi chạy cục bộ nếu họ muốn).


1
AFAIK tất cả các RGN đều là giả danh .. bạn cần phần cứng chuyên dụng để có được các giá trị ngẫu nhiên thực sự (chưa được phát hiện).
bobobobo

1
@bobobobo có giả ngẫu nhiên (được gieo hạt giống) và có các số ngẫu nhiên được bảo mật bằng mật mã (chưa được phát hiện) trong Nền tảng .Net. Nó có thể / có thể không phải là phần cứng ngẫu nhiên, nhưng nó đủ gần để không thể lưu trữ một hạt giống.
Rangoric

2

Xem /programming/3888902/javascript-detect-browser-close-tab-close-browser để biết một câu hỏi chung chung hơn cho cùng một câu hỏi.

Ngoài ra, hãy xem xét việc lưu toàn bộ trò chơi khi thay đổi sàn và tăng tốc độ cho mỗi lần di chuyển. Sau đó, bạn có thể chơi lại trò chơi cho đến điểm di chuyển cuối cùng.

Giả sử có một số sử dụng trình tạo số ngẫu nhiên, bạn có thể tạo và gieo lại trình tạo số ngẫu nhiên ở đầu mỗi tầng mới, sau đó lưu nó cùng với sàn. Sau đó, bạn có thể quay lại tải, và sẽ có thể phát lại các động tác với trình tự tương tự cho đến lần cuối cùng được thực hiện.


Cảm ơn Tim - một khi tôi đã nghĩ đến trò chơi dev, thật dễ dàng để ném bất cứ thứ gì chạm vào nó vào dev game. Đạo cụ cho việc cung cấp một câu trả lời nào.
CodeMoose

Đừng lo lắng - hãy xem nhận xét sửa đổi của tôi về câu hỏi :)
Tim Holt

Tôi đã có thể nói rằng đồng bằng tăng dần trên mỗi di chuyển quá.
bobobobo

2

Phương pháp tiếp cận, không phải tiết kiệm gia tăng, nhưng tìm thời gian để lưu toàn bộ:

  • onunload, như đã nói ở trên. Tôi đã thấy điều này là đáng tin cậy (nhưng sử dụnglocalStorage , không phải mạng, có thể thay đổi mọi thứ).
  • Lưu khi cửa sổ của bạn mất tập trung.
  • Lưu định kỳ: khi lần lưu cuối cùng chưa được trong n phút và người dùng chưa thực hiện bất kỳ đầu vào nào trong m giây.
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.