불량한 게임 상태를 저장 하시겠습니까?


11

HTML5와 jQuery를 사용하여 기본 악성 코드를 작성 중이며 문제가 발생했습니다.

게임이 현재 서있는 방식으로, 시스템은 사용자가 층 사이를 이동할 때마다 게임 상태를 저장하여 오버 헤드를 최소화합니다. 이것의 위험은 사용자가 문제에 처하면 창을 닫고 현재 층의 시작 부분에서 게임으로 돌아갈 수 있다는 것입니다. 이것은 게임의 난이도를 현저히 줄이며 (거의 악의적 인 목적을 거의 물리칩니다)-모든 단일 플레이어 움직임이나 공격으로 게임 상태를 저장하는 것은 부당합니다.

브라우저 창에서 게임 상태를 저장하는 방법을 연구했지만 그 결과에 만족하지 않습니다. 제 질문은 이것입니다 : "게임 상태 저장"이 적당히 무거운 아약스 / 포스트 요청을 의미한다고 가정하면,이 부정 행위를 어떻게 막을 수 있습니까? 전체지도 상태를 저장하는 것과 달리 2D지도의 증분 / 절차 변경을 정량화하는 알려진 방법이 있습니까? 나는 "가장 효율적인 방법"을 요구하는 것이 아니라 내 경험을 바로 잡기 위해 기존의 방법론을 찾고있다.


매우 일반적이고 일반적인 JavaScript 프로그래밍 질문입니다. 나는 투표를했지만 언로드 이벤트를 트리거 할 수 없다면 어떻게 할 것인지 고려하면 흥미 롭기 때문에 다시 생각했습니다.
Tim Holt

어쩌면 나는 그 문제를 직접적으로 해결하기 위해 그것을 다시 말할 것이다 =)
CodeMoose

@TimHolt-귀하의 제안에 따라 편집
CodeMoose

답변:


8

확실한 해결책은 모든 플레이어 명령을 서버로 보내 서버가 로그하도록하는 것입니다. 이렇게하면 어떤 이유로 든 게임이 중단되면 기록 된 명령을 재생하여 게임이 중단 된 지점으로 게임을 복원 할 수 있습니다.

물론, 적절한 저장이 완료되면 이전 명령 로그를 버릴 수 있습니다 (이전 게임을 재생할 수 있도록 저장할 수는 있지만 실시간 재생을 위해 로그에 타임 스탬프를 포함 할 수 있습니다) ). 플레이어가 게임을 종료하거나 충돌하기 전에 너무 오랫동안 같은 레벨에 머무르는 경우 플레이어가 너무 긴 재생 시간을 피하기 위해 마지막 저장 이후 ( n = 1000 과 같이 n 개의 명령 이후) n 개의 명령을 만든 후 자동으로 전체 저장을 수행 할 수도 있습니다 .

게임에 임의의 숫자가 포함 된 경우 (그리고 불량한 경우), 재생 중에도 정확하게 다시 만들 수 있는지 확인해야합니다. 한 가지 해결책은 모든 난수를 재생 로그에 포함시키는 것입니다. 또 다른 방법은 결정 론적 의사 난수 생성기를 사용하고 게임이 저장 될 때 시드를 저장하는 것입니다.

이러한 모든 방법은 클라이언트를 조작하여 악용 될 수 있지만 클라이언트에 게임 로직이있을 때마다 반드시 피할 수는 없습니다. 치트 방지 대안으로 서버에서 실제 게임을 실행하고 클라이언트가 모든 플레이어 명령을 서버로 보내고 디스플레이 업데이트를 다시 받도록 할 수 있습니다. 불량품의 경우이 방법이 적합 할 수 있습니다. 분명히 이것은 상태 저장 문제를 해결할 수도 있습니다 (그러나 재생 기능과 서버 충돌 복구를 위해 서버에 어떤 형태의 명령 로깅을 구현하고 싶을 수도 있습니다). 단점은 오프라인 플레이가 불가능하다는 것입니다 (물론 플레이어가 원하는 경우 서버 측 코드를 로컬에서 실행할 수있는 경우가 아니라면).


1
AFAIK의 모든 RGN은 의사 난수입니다. 진정한 임의의 값을 얻으려면 특수 하드웨어 가 필요 합니다.
bobobobo

1
@bobobobo는 의사 난수 (시드)가 있으며 .Net 플랫폼에는 암호로 안전한 임의의 숫자 (미시)가 있습니다. 하드웨어 랜덤이 아닐 수도 있지만 시드를 저장할 수 없을 정도로 가깝습니다.
Rangoric

2

동일한 질문에 대한보다 일반적인 질문은 /programming/3888902/javascript-detect-browser-close-tab-close-browser 를 참조 하십시오 .

또한 플로어 변경시 전체 게임을 저장하고 각 움직임마다 증분 델타를 저장하는 것을 고려하십시오. 그런 다음 마지막 이동 지점까지 게임을 재생할 수 있습니다.

난수 생성기를 사용한다고 가정하면, 각 새 층의 시작 부분에서 난수 생성기를 생성하고 다시 시드 한 다음 바닥과 함께 저장할 수 있습니다. 그런 다음로드시 다시 시드 할 수 있으며 마지막으로 수행 된 순서와 동일한 순서로 동작을 재생할 수 있어야합니다.


고마워 팀-일단 게임 개발자의 사고 방식에 들어 서면 게임 개발자에게 닿는 모든 것을 쉽게 넣을 수 있습니다. 어쨌든 답변을 제공하기위한 소품.
CodeMoose

걱정은 - 너무 질문에 내 개정 의견 : 볼
팀 홀트

각 움직임마다 증분 델타 도 말했을 것 입니다.
bobobobo

2

증분 저장이 아니라 전체 저장 시간을 찾는 방법 :

  • onunload앞에서 언급 한대로 나는 이것이 신뢰할 만하다는 것을 알았습니다 (그러나 localStorage네트워크가 아닌을 사용 하면 상황이 바뀔 수 있습니다).
  • 창에 포커스가 없으면 저장하십시오.
  • 주기적으로 저장 : 마지막 저장이 n 분이 아니고 사용자가 m 초 내에 입력을하지 않은 경우 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.