2012-01-19 4 views
0

mysql을 사용하여 효율적인 턴 기반 시스템을 설계하는 방법에 대한 지침이 필요합니다. 요구 사항과 게임 흐름은 "친구와의 단어"게임과 유사합니다. 전투 통계가 산출 될 수 있도록 각 전투의회전 기반 게임을위한 데이터베이스 디자인

  • 역사를 저장해야하지만, 여기에 내 머리 위로 떨어져 시스템의 요구 사항입니다. 현재이 방법은 단순히 승패 횟수를 결정하는 것입니다.

  • 전투의 현재 상태를 항상 사용할 수 있어야합니다 (사용자가 선택을 취소하거나 알림을 보내서 앱을 종료하고 다시 시작할 수 있어야합니다).

  • 가능한 한 최소한의 데이터베이스 요청 만 있으면 효율적이어야합니다. 잠재적으로 클라이언트 기반이 큰 초당 요청 수가 많아 질수록 요청 횟수가 많아집니다.

일반적인 게임 흐름 :

  1. 플레이어가 전투 다른 플레이어 턴 타임 아웃 값을 선택 후 확인을 기다린다.
  2. 확인이 성공하면 시작 플레이어가 자신의 차례를 따라야합니다. 턴을하는 것은 공격/이동을 선택하는 것을 의미합니다.
  3. 플레이어가 자신의 차례를 따라 데미지를 계산하여 데이터베이스에 전달합니다. 그러면 다른 플레이어에게 자신의 차례임을 알려주는 푸시 알림이 전송됩니다.
  4. 프로세스는 승리 조건이 충족 될 때까지 반복됩니다 (특정 플레이어의 건강 상태가 일정 수준에 있거나 턴 시간이 초과 될 때).

누구든지 데이터베이스에 효율적으로 통합 할 수있는 방법을 제안 할 수 있습니까?

+0

이 질문은 StackOverflow에 맞추기에는 너무 광범위합니다. 이와 같은 개념적 질문에 대해서는 http://gamedev.stackexchange.com 또는 http://programmers.stackexchange.com을 고려하십시오. –

+0

죄송합니다. 여기에 게시하는 데 새로운입니다. 내가 gamedev로 옮길 수 있다면 그렇게 할거야. – Firefly

답변

2

게임 :

ID - 255 (게임이 큰 경우 INT (11) 자동 증가가 밖으로 실행할 수) VARCHAR
START_DATE - 날짜
종료일 - 날짜
CURRENT_USER는 - 11 (가능성이없는 당신이 배출됩니다 int입니다 이 많은 사용자)
map - int 10 (얼마나 많은지도가 있는지 또는 무작위인지에 따라 다름)
gamestate -이 부분은 상태를 앱에 보내는 방법에 크게 의존합니다.
토큰 - varchar 50 (승인 할 항목) 에 대한 enticate)
상태 - TINYINT 1 (또는 열거 보류중인하려는 경우, 준비, 폐쇄)

행동 :

ID - VARCHAR 255
GAME_ID - VARCHAR 255
USER_ID - 11
날짜를 int로 - 날짜 시간
작업 - tinyint 1 (얼마나 많은 작업을했는지에 따라 다릅니다.열거 공격, 이동, 방어 등)
데이터 - 수행하지만,이 데이터는 통계입니다 있었는지에 대한 몇 가지 세부 사항 만이 아닌 다른 사용자에게 보낼 수

사용자 :

이 ID - 11
을 int로 사용자 이름 - (예를 들어) VARCHAR (50)
등 ... ID가 우리가 여기서 관심 유일한 때문에 그렇게 중요하지 않은 사용자

나는 등 기본적인 아이디어 InnoDB의 대 부호,의 MyISAM과 같은 모든 세부 사항을 설명 야생 갈 didnt는 관련 게임 데이터가있는 게임 테이블과 액션 관계형 테이블 o 나중에 통계 나 일정을 처리 할 수 ​​있습니다.

여기서 중요한 것은 gamedata와 token이 게임 사이를왔다 갔다하고 있기 때문입니다. 이상적으로 토큰은 각 게임마다 고유 한 앱에서 비교할 해시이므로 사용자는 브라우저 나 무언가를 사용하여 게임에 대한 업데이트를 게시 할 수 없습니다. 이것 뒤에는 전혀 중요하지 않을 수도있는 다른 철학이 있습니다.

그래서 gamedata는 직렬화 된 배열, 텍스트, 얼룩 등일 수 있습니다. 전달하는 데이터의 양 및 형식에 따라 다릅니다. 직렬화되지 않은 응답은

[0] => [ // player 1 
    [0] => [ // army position and status 
     [0] => '2,2,98,1', //x, y, health, mode (1 => defense, 2 => offense, etc) 
     [1] => '120,10,45,2', // could also break down into another array layer 
     [3] => '222,155,100,1' 
    ], 
    [1] => [ // bases 
     [0] => '130,45,34', //x, y, health 
     [1] => '356,25,10' 
    ], 
    [2] => [ // game data 
     [0] => '12245' // money 
     [1] => '41324131232' // timestamp of when last turn began 
     [2] => 0 // bool whether or not they are up at bat 
    ] 
] 

과 같을 수 있으며 이것은 플레이어 1의 데이터입니다. 그래서 이것을 직렬화하고 암호화 할 수 있습니다. 그러나 이것은 제가 gamestate 분야에 있어야한다고 말하고있는 것입니다. 그래서 당신은 게임 자체에 대한 더 많은 정보로 더욱 분명해질 수있는 필요에 맞는 데이터 유형을 사용하게 될 것입니다.

관계 옵션을 살펴볼 수도 있지만 게임 자체의 친밀 성을 모른 채이 기본 샘플은 작은 게임에 적합합니다.

어쨌든,이 대답은 내가 원하는 것 또는 원격으로 닫을 수있는 것이 전부는 아닐 수 있습니다. 그러나 아마 원래 게시 한 것보다 낫습니다. 그래도 게임에 행운이 있기를 바랍니다. 게임을 만드는 즐거움과 지금은 이스트와 안드로이드를위한 시간입니다.

+0

미안하지만 튜토리얼을 요구하지 않았습니다. 이런 종류의 게임 플레이를 지원하기 위해 데이터를 어떻게 구성 할 수 있는지에 대해 자세히 설명합니다. DB 테이블 예제는 대부분 레이아웃 예제와 관련하여 내가 원하는 전부였다. 실제로 큐가 있거나 다른 것을 가지고있는 서버를 실행할 계획이 아니 었습니다. 각 플레이어가 이동에 따라 새로운 상태를 계산하고 서버의 데이터베이스를 업데이트하는 이벤트 기반이었습니다. 두 번째 플레이어는 다음을 읽었을 것입니다. 새로운 주와 그 다음 그들의 움직임을한다. – Firefly

+0

글쎄, 좋아. 그러나 막연한 대답이라 할지라도 게임 자체에 대해 더 많이 알 필요가 있습니다. 예를 들어, 다양한지도가 있습니까, 무작위로 생성 된지도, 그리드에서 실행되는지도, PvP와 더 비슷합니까, 플레이어가 군대를 가졌는지, 집단이 있는지 등등. 나는 내 대답을 업데이트하려고 할 수 있습니다. 맞춰 보면 도움이 될지 모르겠다. –

+0

감사합니다. 업데이트 된 대답은 내가했던 것보다 훨씬 가깝습니다. 게임에는 맵이나 보드가 없습니다. 포켓몬과 같은 1vs1 전투와 같습니다. 통신은 php/json webservice를 통해 이루어지며 이미 사용자 및 인증/토큰 시스템이 있습니다. 내 문제는 주로 게임/전투와 새로운 소식이 많은 도움이되는 행동을 나타내는 방법이었습니다. 필자는 데이터베이스에 JSON과 같은 gamedata 열을 저장하는 것을 실제로 생각하지는 않았지만 필요한 각각의 실제 열을 생각했습니다. JSON 기반 필드를 사용하는 것이 더 효율적이고 유연합니다. :) – Firefly