Modelando uma resolução de ataque customizada no AnyDice: o dado não-draw mais alto do pool

3

Estou experimentando as probabilidades de várias resoluções de ataque de "pool morto" para um jogo que estou projetando, sabendo que os pools geralmente serão de 1 a 4 dados, com sacrifícios para aumentar temporariamente um pool de dados.

O problema que estou tendo é o seguinte:

  • maior atacante die > o defensor mais alto morre muito freqüentemente, e ataques raramente passam. Aumento oferece apenas pequenas vantagens em 2-4 dados. As estacas não se sentem intensificadas.
  • maior atacante die > = maior defensor die desenha com muita freqüência, então os ataques geralmente são bem-sucedidos. O boost também é fraco em 2-4 dados.

Para remediar isso, estou pensando na seguinte resolução: primeiro ganho não vencido alto ganha : 6, 5 ganha vs 6, 3 e ambos vencem 6 , já que há são dados que sobraram. Em poucas palavras, os draws são retirados da equação.

Como eu modelaria isso em anydice (sem sacrifícios, apenas [nondraw 5] > [nondraw 4] - como situações)?

    
por Alex Mitan 05.12.2017 / 16:59

1 resposta

Basta usar a comparação de sequências.

A documentação poderia explicar isso melhor, mas acontece que (com uma suposição sobre sua intenção) isso é realmente trivial com as comparações internas do Anydice. Na documentação sobre seqüências:

Compared to a sequence

The sequences are compared number by number, from left to right, resulting in either a 1 or a 0.

A experimentação mostra que isso significa que ela realmente percorre as sequências, comparando o valor enésimo do primeiro ao valor enésimo do outro. Se tivermos duas sequências, A e B, então A > B itera a sequência:

  1. retorna 1 se o enésimo valor de A for maior que o valor N de B

  2. retorna 0 se o valor de N de A for menor que o valor de N de B

  3. passa para o N + 1o valor se eles forem iguais

Ele também retorna 1 se B ficar sem elementos antes de A ou 0 se A ficar sem elementos antes ou ao mesmo tempo que B.

Então, se você comparar as sequências:

{6,4,3,2} > {6,4,2,1} : 1

{6,4,3,2} > {6,4,3,3} : 0

{6,4,3,2} > {6,4,3} : 1

{6,4,3} > {6,4,3,1} : 0

{6,6,5} > {6,5,5,1} : 1

Você pode fazer esse tipo de comparação com dados se os converter em seqüências usando uma função antes de compará-las.

function: compare ATTACK:s to DEFENCE:s {
  result: ATTACK > DEFENCE
}

output [compare 4d6 to 3d6]

Quando a função compare ATTACK to DEFENCE é invocada, os ATTACK:s e DEFENCE:s na declaração convertem quaisquer argumentos fornecidos em uma sequência. Quando um conjunto de dados é convertido em uma sequência, ele se torna uma sequência que representa os resultados da rolagem desse conjunto de dados, classificado de alto a baixo (e a função é invocada uma vez para cada resultado possível do rolo e as estatísticas de resultados juntas) .

Este programa recebe paradas de dados e faz um pouco de comparação de sequências para lhe dizer qual delas ganha nessas circunstâncias. Isso supõe que sua regra é que 6,6,5 vence 6,5,5 , ou seja, esses dados se anulam em uma base de 1: 1; se você pretendia diferentemente, isso se torna muito mais complexo para descrever e Anydice começa a não ser muito eficiente.

Mas eu quero contar o número de empates!

Infelizmente, a comparação de sequências não permite que você faça isso. Mas se você escrever seu próprio iterador de loop manualmente, ele será executado com menos eficiência do que qualquer comparação construída com qualquer dado (assim você estará limitado a conjuntos de dados menores antes que qualquer dado desista do programa), mas você pode obter essas informações:

function: compare ATTACK:s to DEFENCE:s {
  loop N over {1..[lowest of #ATTACK and #DEFENCE]} {
    if N@ATTACK > N@DEFENCE { result: N }
    if N@ATTACK < N@DEFENCE { result: -N }
  }
  if #ATTACK > #DEFENCE {result: #DEFENCE +1}
  if #ATTACK < #DEFENCE {result: -#ATTACK -1}
  result: 0
}

Basicamente, fazemos um loop sobre o comprimento da matriz mais curta fazendo o elemento por comparação de elementos, e quando obtemos uma vitória ou falha, retornamos N para o sucesso (ou -N para falha). Isso significa que alcançamos o enésimo elemento da matriz antes de obtermos um resultado e, portanto, N-1 pares de dados foram cancelados. Depois, há o bit extra de lógica no final que determina quem ganha se todos os dados que conseguiu comparar forem empates (e garante que o resultado seja consistente com o acima, subtraia 1 do valor absoluto para calcular quantos pares de dados foram cancelados).

Este programa implementa o código acima. No meu teste, ele pode fazer até 5d6 vs 5d6 antes de começar a demorar muito para que qualquer dado seja executado (como você espera que os conjuntos de dados estejam no intervalo de 1-4, esperamos que ainda seja útil para você).

    
05.12.2017 / 22:09