Posso impedir que o movimento diagonal explore mais o mapa?

57

Em uma grade de peças em que o movimento em qualquer uma das 8 direções leva exatamente a mesma quantidade de voltas (regras do estilo do tabuleiro de xadrez), posso impedir que o movimento diagonal mostre mais peças novas do que o movimento ortogonal?

Por exemplo: Você é a caixa vermelha na imagem abaixo. Atualmente, as células verdes estão visíveis para você (campo de visão quadrado). Você pode mover uma distância de um bloco em qualquer uma das oito direções.

Se você se mudar para nordeste , explorará 13 novos blocos (mostrados em azul). Se você se mudar para o sul , explorará apenas 7 novas peças (mostradas em roxo).

grade com visibilidades dependentes da posição

Como posso tornar a viagem em cada direção igualmente favorável à exploração?

Senhor Smith
fonte
27
Esta é uma falha fundamental no design de um jogo como este. Você não deve permitir movimento diagonal ou alternar para algo como uma grade hexagonal que não tenha esse problema.
Tetrad
11
@ Tetrad Você não está errado sobre isso ser uma falha, mas provavelmente não percebe o quão predominante é em jogos como este .
Sr. Smith
8
Em qualquer jogo em que o movimento ortogonal e diagonal sejam igualmente rápidos, sempre haverá algumas coisas em que o movimento diagonal é melhor do que o movimento ortogonal e vice-versa. Simplesmente não é solucionável - se você abrir um buraco, outro se abre.
Patashu
3
Não é uma resposta completa, mas no seu jogo é possível fazer com que um movimento diagonal demore mais que um ortogonal como proporcional ao comprimento diagonal? Segundo, você pode ter uma solução mista em que o movimento usa o padrão de diamante e a distância da vista usa o quadrado?
Validade 22/04
2
Outra não é uma resposta: os movimentos ortogonais se comportam como agora, mas os movimentos diagonais fazem com que a fonte de luz fique "imprecisa" - não revela todos os 13 quadrados que acabaram de chegar, mas apenas 7 (ou mais) deles, determinados aleatoriamente.
Snowbody

Respostas:

67

Dungeons and Dragons 3.5 (RPG em papel e caneta) tem uma solução usada para cálculos de movimento e raio baseado em grade: o movimento diagonal custa 1,5 o que custa ortogonal. Como a diagonal de um quadrado de unidade é de aproximadamente 1.414, 1,5 está bem próximo.

Como o D&D 3.5 suporta apenas movimentos inteiros, a maneira como isso é calculado é que o movimento ortogonal custa "um quadrado". Seu primeiro movimento diagonal também custa apenas "um quadrado", mas a segunda diagonal custa "dois quadrados". Você alterna um e dois quadrados para cada movimento diagonal. A implementação desta regra de movimento no seu jogo resolverá vários problemas com o movimento diagonal.

Como este diagrama mostra, essa regra de movimento cria uma aproximação razoável dos círculos e também não é desativada em mais de 1 quando comparada à distância real (quando estiver a 15 unidades da partida).

insira a descrição da imagem aqui

Se o seu raio de visão / exploração também for calculado dessa maneira, o movimento diagonal e as descobertas na diagonal serão tão próximos ou distantes quanto os ortogonais.

dinamarquês
fonte
Exatamente o que eu queria sugerir. Embora seja interessante notar que essa estratégia cai em termos de restrição de movimento se o personagem puder mover apenas um espaço por turno (o que parece ser o caso no diagrama da pergunta?). Você pode "lembrar" se eles estão em diagonais ímpares / pares entre os turnos, embora isso possa ser confuso / frustrante para o jogador. Independentemente disso, isso funciona bem para a questão da visibilidade.
Alexis Beingessner
5
@AlexisBeingessner, é verdade. E o questionador indicou que ele queria um movimento semelhante ao rei do xadrez, mas acho que, como esse é um site de desenvolvimento de jogos de computador, eu apontaria uma boa solução de jogo. Se isso é mais um enigma ou uma questão de matemática pura, eu esperaria em outro site. Se for para um jogo desonesto, alguns deles já suportam velocidades de movimento variáveis.
22414 Dane
A maioria dos jogos do tipo Roguel parece ser baseada em turnos, mas na verdade tem um componente de tempo; portanto, se você se mover na diagonal, outros objetos terão mais tempo para reagir antes que você faça outro movimento.
Kos
67

Você precisa alterar a forma do campo de visão.

Assim, quando você se move em qualquer direção, o mesmo número de novos quadrados se torna visível.

Aqui está uma possibilidade:

exemplo de grade

ChargingPun
fonte
5
Interessante; Eu nunca considerei um campo de visão de diamante. No entanto, também há um problema com essa visão; é uma péssima idéia viajar na diagonal agora, porque se você encontrar um inimigo enquanto viaja na diagonal, ele estará significativamente mais perto de você do que se estivesse viajando ortogonalmente.
Sr. Smith
43
@ Mr.Smith, sim, isso é um problema novo, mas eu já resolveu o seu antigo ...
ChargingPun
De fato você fez; parece que não fui suficientemente específico com a pergunta.
Sr. Smith
8
Uma forma circular ajudaria aqui?
Amitp
3
@amitp Esta é uma forma circular - desde que a função de distância seja a distância de Manhattan.
Daniel Wagner
27

Para que o movimento diagonal e ortogonal revele aproximadamente a mesma área, você precisa de duas coisas (cada uma das quais, sozinha, já foi sugerida em outra resposta ou comentário):

  1. Intervalo de visão aproximado circular :

    Imagem do intervalo de visão pseudo-circular

    Por si só, isso não dará exatamente a mesma área revelada para os dois tipos de movimento. Por exemplo, na imagem acima, o movimento ortogonal revela 9 quadrados, enquanto o movimento diagonal revela 13. Ainda é melhor que a proporção 13/7 para a área de vista quadrada no seu exemplo.

    De fato, à medida que o raio da vista aumenta, a proporção de áreas reveladas por etapa diagonal / ortogonal tende a √2 ≈ 1,414 para uma área circular, enquanto a mesma proporção para uma área de vista quadrada tende a 2.

  2. Movimento diagonal mais lento :

    Na vida real, caminhar na diagonal por um campo quadrado leva mais tempo do que caminhar por um dos lados. De fato, leva cerca de √2 ≈ 1,414 vezes mais. Se você deseja que o movimento no seu jogo pareça realista, você deve fazer isso acontecer também.

    Na prática, 3/2 = 1,5 é uma boa aproximação de √2. Assim, você pode fazer cada etapa ortogonal levar duas unidades de tempo e fazer cada etapa diagonal levar três. Com a área de visualização de exemplo acima, isso produz 9/2 = 4,5 quadrados revelados por unidade de tempo para movimento ortogonal e 13/3 = 4,33 quadrados revelados por unidade de tempo para movimento diagonal. Bem perto, não é?

    Como alternativa, se você preferir "1 passo = 1 unidade de tempo" para movimento ortogonal, poderá usar algo como o sistema de D&D sugerido por Dane e fazer com que cada segundo passo diagonal consuma uma volta extra. (Se você fizer isso, no entanto, precisará fornecer a cada unidade um contador explícito de quantas etapas diagonais foram executadas; caso contrário, poderá acabar com explorações como, por exemplo, E, NE, E, NE, .. . sequcia de movimento que permite a um jogador para explorar mais rápido do que o pretendido.)

Ilmari Karonen
fonte
Uma maneira fácil de impedir tais explorações seria dizer que os custos de um movimento diagonal levam dois ticks, exceto quando precedidos por um movimento na mesma direção que levou dois ticks.
Supercat
11
@ supercat: É verdade, mas isso deixaria a sequência E, NE, E, NE, ... notavelmente menos eficiente para explorar do que o movimento ortogonal / diagonal reto, o que também pode não ser desejável.
Ilmari Karonen
Isso deixaria a sequência menos eficiente, mas e daí? Nem todos os métodos de exploração devem ser igualmente eficientes. Na verdade, pode não ser ruim ter uma penalidade de tempo para alterações de orientação, com uma isenção para os casos em que a mudança antes ou depois foi na diagonal com carga dupla.
Supercat
2
Eu fiz algo semelhante há algum tempo e resolvi fazer com que o movimento ortogonal custasse dois "ticks" por quadrado, e o movimento diagonal custasse três.
Mason Wheeler
11

Como você está usando uma grade e sabe em qual direção o usuário está seguindo, não há nada que o impeça de adaptar a resposta anterior e usar campos de visão diferentes, dependendo da direção.

Por exemplo, você pode estender o campo para incluir os cantos quando você viaja nas direções cardeais e reduzi-lo em dois quadrados em cada extremidade em suas caixas diagonais para que cada um descubra 9 quadrados.

Outra alternativa, dependendo de como sua iluminação funciona, seria usar uma melhor aproximação de círculo com antialiasing, para revelar parcialmente alguns quadrados.

user43497
fonte
Esse é um compromisso interessante; se você viajar na diagonal, nem todas as células que normalmente seriam visíveis estarão visíveis. Você pode esperar uma vez (para explorar essas células) ou continuar se movendo.
Sr. Smith
8
qual resposta é "a resposta anterior"?
achou do
7

Que tal, em vez de ter um alcance fixo de visualização, fazer com que a área de visibilidade do jogador dependa da direção que o jogador estava seguindo, bem como talvez da direção que o jogador enfrentou nos últimos turnos (um jogador que estava se movendo para o norte pode ser capaz de imediatamente dê um passo para o sul, mas pode dar algumas voltas para obter a distância máxima de visualização nessa direção). Um jogador que segue para o norte, saindo de um corredor estreito, para uma sala grande e continua viajando para o norte, tem visibilidade limitada a leste e oeste, e provavelmente deveria. Quando o jogador para de se mover, é possível que o sistema "explore" automaticamente as áreas invisíveis que estão dentro do raio de visão atual do jogador, mas enquanto o jogador está se movendo ativamente, o campo de visão deve ficar mais confinado.

supercat
fonte
3

Como uma alternativa a um campo de visão mais complexo (que, como discutido acima, adiciona seus próprios problemas devido às restrições de um layout baseado em grade), você pode tentar emular o efeito do movimento em um jogo que não seja baseado em uma descrição discreta. grade. Onde o movimento livre é possível, um movimento diagonal de uma unidade seria exatamente isso, não as ~ 1,41 unidades de movimento vistas com uma grade quadrada.

Embora você não possa forçar o movimento de uma unidade sem perder a grade decrescente (o que alteraria o design do seu jogo de forma bastante significativa), talvez você possa acompanhar o movimento extra realizado e soltar os movimentos mais tarde: acompanhe os 0,41s extras e uma vez que totalizem mais do que isso. 1.00 fazem com que a unidade pule uma jogada. Ou o contrário: considere a diagonal como normal, adicione 0,41s para cada movimento horizontal ou vertical e dê crédito extra ao movimento uma vez que seja maior que 1 (ou 1,41 para um movimento diagonal).

Você precisaria ter cuidado ao apresentar isso aos seus jogadores de uma maneira que pareça suave e justa. Em um cenário multi-jogador humano, essas mudanças podem se tornar algo que os jogadores aproveitam estrategicamente - isso pode ser um problema ou pode haver uma maneira natural de misturar isso com a mecânica do jogo (talvez permita que os jogadores armazenem um pequeno quantidade de "créditos de movimentação não utilizados" que eles podem usar para reagir rapidamente mais tarde e receber 0,41s de movimentação adicional para alimentar (ou retirar) esse pool.

Isso funcionaria melhor se as entidades de controle do jogador se movimentassem se movessem mais de uma unidade a cada turno. Por exemplo, três pontos de movimento podem ser usados ​​como três movimentos horzontais ou dois diagonais com 0,16 restantes na piscina para mais tarde. Quando atingir 1,00, o jogador recebe um movimento hor / muito "livre" e, a 1,41, um movimento diagonal livre. Você pode limitar o extra a 1,5 para forçá-lo a ser usado ou perdido nesse ponto para impedir o jogador de manter essa energia armazenada por séculos ou deixá-la acumular.

Obviamente, isso é uma complicação das regras do jogo que pode ser completamente indesejável e seria impraticável para um jogo não computadorizado, mas se você pudesse fazê-lo funcionar dentro das regras existentes do jogo, limitaria a diferença de exploração entre as direções do movimento sem a necessidade de abandonar o formato da grade.

David Spillett
fonte
2

Você pode fazer o jogador mover dois espaços se mover para cima, baixo, esquerda ou direita e apenas um na diagonal. Não seria exatamente igual, mas estaria muito mais perto.

drdavehere
fonte
Esta é uma boa idéia, mas eu acredito que equivale a simplesmente banir movimento diagonal (como uma diagonal está a apenas dois movimentos ortogonais)
Vality