Como implementar o mecanismo de jogo baseado em turnos?

17

Vamos imaginar um jogo como Heroes of Might and Magic, ou Master of Orion, ou o seu jogo baseado em turnos. Qual é a lógica do jogo por trás do próximo turno? Há algum material ou livro para ler sobre o tópico? Para ser específico, vamos imaginar o loop do jogo:

void eventsHandler(); //something that responds to input
void gameLogic(); //something that decides whats going to be output on the screen
void render(); //this function outputs stuff on screen

Todos aqueles que estão sendo chamados dizem 60 vezes por segundo. Mas como o turn-based entra aqui? Eu posso imaginar que em gameLogic () existe uma função como endTurn () que acontece quando um jogador clica nesse botão, mas como eu manejo tudo isso? Precisa de insights.

Dvole
fonte

Respostas:

21

Um jogo baseado em turnos será governado por uma máquina de estado . Basicamente, você colocaria uma série de estados que podem ocorrer em uma ordem lógica.

Em um nível alto, o turno de um jogador pode ser o início de um novo estado, seguido por todas as ações possíveis permitidas durante esse turno.

Por exemplo

  • Estado - mudar de jogador
    • agora é a vez do jogador 1
  • Ações permitidas
    • ataque
      • selecione inimigo para atacar
    • defender
      • selecione a unidade para defender
    • mover unidade
      • selecione a unidade para mover
      • verifique para garantir a circulação
    • etc

Obviamente, isso aumentará rapidamente, pois eu apenas traçei um plano extremamente limitado. Ter uma boa compreensão de possíveis estados desde o início significa que você deve estar em uma boa posição para implementar. Eu enfatizaria muito bem desenhar exatamente como você deseja que o jogo seja executado ... um bom jogo baseado em turnos exige muito planejamento da OMI.

te
fonte
Um projeto antigo da minha escola que foi uma tentativa de desenvolvimento de 3 meses no Final Fantasy Tactics :) Usa uma máquina de estado (algumas delas, na verdade), conforme descrito acima. sourceforge.net/projects/bpfat
James
Ei, e o Game Engine para estratégia baseada em turnos? Poderia dar algum conselho? Pode ser motor Unreal poderia caber?
Rantiev
Cada um na sua. Se você está confortável com o mecanismo Unreal, não há nada de errado nisso. Depende apenas de qual mecânica você deseja aproveitar. Uma pesquisa rápida indica que existe um kit de ferramentas atual para o mecanismo Unreal para ajudar a criar jogos de estratégia baseados em turnos, embora não seja gratuito.
the_e
3

Recentemente, criei um jogo de estratégia baseado em turnos semelhante ao Master of Orion (agora é apenas um jogador, o multijogador seria um pouco mais complexo, mas uma ideia semelhante). Aqui está a minha lógica de função endTurn (na minha classe principal do Game Controller):

//for all computer players:
computerTakeTurn(player)

//for all players
moveShips(player)

//for all players
endTurn(player)//see this function below

//for all planets
planet.repairFleet()

//for all players
resolvePlanetaryConflicts(player)

//check to see if any players were destroyed or if the game is over
checkPlayerDestroyedAndGameOver()

A função de final de jogo do meu jogador executará funções específicas para esse jogador que não são afetadas pela ordem em que ocorre entre os jogadores:

eatAndStarve()

generatePlayerResources()

buildPlayerPlanetImprovements()

growPlayerPlanetPopulation()

Onde apropriado, essas funções retornam mensagens de status e / ou acionam eventos para que a GUI possa mostrar o que aconteceu durante o turno ou informar ao jogador que um computador foi destruído, etc.

Matt Palmerlee
fonte
você poderia fornecer o código-fonte apenas para conferir? Seria uma grande ajuda. Apenas para fins educacionais.
Dvole
@Dvole Atualmente, estou trabalhando na conversão do código do Silverlight / C # para JavaScript usando a tag de tela HTML5. Quando terminar, planejo abrir o código e, nesse momento, você é bem-vindo para ver exatamente como eu implementei essa função. Se ele ajuda a obter contexto, você pode jogar o meu jogo de estratégia espacial aqui: Astriarch - Régua das Estrelas
Matt Palmerlee
2
@Dvole Demorei um bom tempo, mas eu acabei de abrir a versão do Astriarch do Silverlight. Se você ainda estiver interessado você pode baixar o código-fonte do github aqui: github.com/mpalmerlee/Astriarch/tree/Silverlight
Matt Palmerlee