2011-01-13 4 views
2

지금까지는 게임을 많이 사용했지만 지금까지 모든 기능을 추가 할 수 없습니다. 문제를 해결할 수 없기 때문입니다.멀티 플레이어 게임에서 플레이어를위한 서버의 개별 보드

내가 클래스 보드를 가지고 있고, 각 보드가 그 사각형에 사각형과 조각을 가지고 있다고 가정 해 보겠습니다. 많은 플레이어가 게임에 연결되어 있으므로 각 플레이어 (및 옵서버 등)마다 단일 보드가 있어야합니다. 제 질문은 그걸 어디서 시작해야할까요?

먼저 Board 클래스의 여러 인스턴스가 필요하다고 생각합니다. 그런 다음 해당 보드를 바인딩하고 개인 게임 (게임은 GUID로 식별 됨)을 바인딩하는 방법이 필요합니다.

제 질문은 어디에서 시작해야합니까?

지금까지는 데이터베이스를 많이 사용하고 있지만 실제로는 최적이 아니었고 현재의 접근 방식으로는 내가 원하는 모든 것을 수행 할 수 없었습니다 (향후 참조를 위해 보드 상태를 덤프하는 등).

답변

1

보드 게임은 게임 상태를 저장하는 복잡성 때문에 MongoDB와 같은 비 관계형 데이터베이스를 훌륭하게 사용할 수 있습니다.

이 옵션이 아닌 경우 (전체 Microsoft 스택을 사용한다고 가정 함) 데이터 저장 영역에 대한 관계형 접근을 피할 수 있습니다. 게임의 특성을 알지 못하면서 추측 할 수밖에 없습니다. 그렇기 때문에 나는 예를 들어 낙서를 사용할 것입니다. 이사회 덤프

당신은 boardState 테이블에 그대로 전체 보드의 상태를 저장할 수있는 모든 처리가 다음 처리 할 수 ​​

* * * o * 
* w o r d 
* * v * * 
* * e * * 
* * r * * 

이 (5 × 5 비 규제 낙서 보드 :))와 같은 응용 프로그램 논리에 의해. 이 정보를 관계형으로 저장하려고한다면 데이터베이스 오버 헤드를 상상해보십시오! 낙서가 이야기하는 "이동"을 가지고 있지 않지만

이동 확인

이 어쨌든 데이터베이스를 피해야한다 무언가이다. 워드 검사, 보드 제한, 게임 논리 등과 같은 모든 프로세스는 응용 프로그램 계층에서 전적으로 처리해야합니다. 내가 당신이라면

응용 프로그램 구현

, 난 당신이 각각 Board 객체를 포함의 Game 클래스의 인스턴스를 갖는 거라고 경로에 계속 것입니다. 모든 것을 메모리에 저장하고 응용 프로그램 계층에서 필요한 모든 계산을 수행해야합니다 (게임을 나중에 저장하기 원하면 보드 상태, 게임 점수). 이때 데이터베이스에 덤프하십시오.


게임 논리에 대해 알지 못하는 사이에 나는 그것을 어떻게 처리 할 것인지 추측 할 수 없으므로 20,000 피트 아래로 내려다 볼 수 있습니다.

업데이트 : 새로운 정보에 근거하여

은, 난 그냥 메모리에 GUID 식별자와 GameCollection 클래스를로드 할 것입니다.colGames[GUID]colGames[GUID].Board의 보드를 통해 개별 게임에 액세스 할 수 있습니다. 게임이 끝나고 저장된 후에 모든 관련 정보를 데이터베이스에 저장하고 메모리에서 제거하십시오.

+0

체스 게임입니다. FEN 문자열에 게임 상태를 저장하고 사용자 등급을 저장하는 등 기본 작업에만 SQL Server를 사용하려고합니다. 싱글 플레이 게임을 수행하는 데 문제가 없습니다. 그게 바로 간단한 문제입니다. 여러 사용자가 단일 서버에서 재생할 수 있도록합니다. 내가 만든 각 게임마다 보드 클래스를 소유해야한다는 것을 알고 있습니다. 잘 모르는 것은 보드 클래스의 인스턴스를 여러 개 독립적으로 만드는 방법입니다. –

+0

새 정보에 대한 나의 답변이 업데이트되었습니다. –

+0

하하. 진지하게. "복잡성이 복잡하기 때문에"? 당신은 복잡하지 않기 때문에 남자 야. – TomTom

0

약 2 년 전에 페이스 북으로 멀티 플레이어 온라인 카드 게임을했습니다. 불행히도 게임은 더 이상 작동하지 않습니다. 게임은 Azure에서 호스팅되었습니다. 프런트 엔드는 Silverlight에서 수행되었습니다. 게임 상태를 유지하는 방법은 Azure Table Storage의 항목과 같습니다. 나는 ProtoBuf (매우, 매우 빠름)을 사용하여 게임 상태를 연재했다. 각 게임마다 고유 한 식별자로 GUID가 있습니다. 이 GUID는 Azure 테이블 저장소의 키 역할을했습니다. 요청이 들어 왔을 때마다 게임 상태를 deserialize하고 메시지를 처리 ​​한 다음 변경 사항이 발생하면 기존 게임 상태를 덮어 씁니다. SQL Server를 다른 용도 (통계 등)로 사용했지만 게임 상태를 유지하지 않았습니다. 어쩌면 SQL을 사용하는 것이 Azure Table Storage보다 빠르지 만 성능은 결코 문제가되지 않았으므로 절대로 살펴 보지 않았습니다.

관련 문제