Seu gentil vizinho, Doctor Tree, acabou de lhe dar três criaturas mágicas chamadas Codémon. Há um torneio de batalha na cidade vizinha de Colorville. Você é o melhor, como ninguém nunca foi?
visão global
Este é um torneio de batalha. Cada jogador controla um time de três monstros, e o objetivo é nocautear (matar) o outro time. São 100 rodadas, com pontos concedidos por vitórias e empates. O time com mais pontos ganha!
Monstros
Um Codémon é uma pequena criatura complicada. Existem cinco tipos (elementos) para escolher, três estatísticas e três slots de movimentação em cada um.
Tipos
Cada codémon recebe um tipo. Os cinco tipos são Normal, Psíquico, Fogo, Água e Grama. Cada um tem seus pontos fortes e fracos. O dano é baseado no seguinte gráfico:
Os números são multiplicadores de danos. Por exemplo, Água atacando fogo tem um modificador de 0,5 (meio dano), enquanto Grama atacando fogo é dobrada (2).
Estatísticas
Cada monstro tem três estatísticas que determinam suas habilidades de batalha. Ataque aumenta o dano que causa. Defesa diminui o dano necessário. A velocidade permite que ele se mova antes daqueles com velocidade mais baixa.
Cada monstro tem um valor inicial de 50 para cada estatística e um máximo de 100. Quando você cria seus monstros, você poderá atribuir 80 pontos adicionais de estatística (cada). Lembre-se de que nenhuma estatística individual pode ultrapassar 100. Portanto, você pode ter uma distribuição 100/80/50, 90/80/60 ou 65/65/100, mas 120/50/60 é ilegal. Qualquer equipe com estatísticas ilegais é desqualificada. Você não precisa usar todos os 80 pontos, mas provavelmente não deve ir com o mínimo de 50/50/50.
Você também pode considerar a HP um status, mas cada codémon tem 100 HP não modificáveis. Quando a HP cai para zero, eles não conseguem continuar lutando. HP é reabastecido para 100 antes de cada batalha.
Movimentos
Cada monstro conhece três movimentos de batalha. Os três escolhidos devem ser distintos, portanto, não há furação / furação / furação.
Existem 15 movimentos, três de cada tipo. Cada tipo tem um ataque direto, um ataque mais fraco com um efeito e um único movimento de efeito.
id name type power uses usable effect
0 Punch N 20 - NFWG
1 Heal N 0 3 NFWG Heals 50 HP
2 Slow N 10 5 NFWG Enemy speed x0.8
3 Pain P 20 - PFWG
4 Sleep P 0 3 PFWG No enemy action until wake
5 Weaken P 10 5 PFWG Enemy Atk x0.8
6 Fireball F 20 - NPFW
7 Burn F 0 3 NPFW Enemy -10 HP each turn
8 Sharpen F 10 5 NPFW Own Atk x1.25
9 Watergun W 20 - NPWG
10 Confuse W 0 3 NPWG Enemy may strike itself (10 power)
11 Shield W 10 5 NPWG Own Def x1.25
12 Vine G 20 - NPFG
13 Poison G 0 3 NPFG Enemy -5xTurns HP each turn
14 Sap G 10 5 NPFG Enemy Def x0.8
type
refere-se ao tipo de movimento. power
é seu poder impressionante. uses
indica quantas vezes ele pode ser usado por batalha ( -
é ilimitado). usable
mostra por quais tipos ele pode ser usado (por exemplo, o Punch não pode ser atribuído a um tipo psíquico, pois não existe P
). effect
mostra quais efeitos os movimentos têm. Há 75% de chance de cada efeito funcionar, exceto Heal, que sempre funciona.
Para efeitos que alteram as estatísticas de um monstro, os efeitos podem ser empilhados . Por exemplo, o uso de Weaken duas vezes pode reduzir o ataque do seu oponente para 0,64 de eficácia. Efeitos que não alteram as estatísticas de um monstro (Sleep, Burn, etc) não são acumulados .
O sono coloca o oponente no sono, com 60% de chance de acordar no início de cada turno. Nenhuma ação será tomada por monstros adormecidos.
Queimadura danifica o oponente em 10 PV ao final de cada turno, quando ativo . O veneno funciona da mesma forma, mas aumenta cada vez mais. No primeiro turno, são 5 e ganha 5 a cada turno depois. Então, no quarto turno, será prejudicial para 20. Estes são danos simples, não afetados pelo tipo de monstro ou sujeitos a bônus.
A confusão pode fazer um monstro atacar a si mesmo, em vez de fazer o que foi solicitado. Esse ataque tem poder 10 e tem 30% de chance de acontecer em um determinado turno.
Para ficar claro, os efeitos duram até o final da batalha (exceto Dormir, como mencionado acima).
Os movimentos também recebem um aumento de 20% no poder se usados por um monstro do tipo correspondente. Por exemplo, um monstro Grass usando Vine é impulsionado, enquanto ele usa Punch, ele não é.
Estatísticas secretas
As estatísticas e o tipo (mas não os movimentos) de cada monstro são de conhecimento público. Seus oponentes poderão ver o que estão lutando, a fim de escolher a melhor ação. No entanto, também existem bônus disponíveis que estão ocultos.
Especificamente, após cada duas batalhas, você receberá um ponto de status "bônus" para cada monstro do seu time. Pontos são dados a todos os monstros, mortos ou vivos, vencedores ou perdedores. Você pode atribuir isso a qualquer uma das três estatísticas que escolher. Você não pode empilhá-los em um único monstro; cada monstro recebe um de cada vez. Esses pontos são imunes ao limite de 100. Como haverá 100 rodadas de batalha, isso significa que você pode obter uma única estatística de até 149 se distribuir todos os seus bônus a ela. Novamente, o oponente verá apenas suas estatísticas "básicas"; portanto, quanto mais você estiver no torneio, mais o conhecimento deles diverge da verdade.
Batalha
A batalha ocorre entre equipes de três, com uma ativa em cada equipe por vez. No início, você verá o time do oponente e será solicitado a escolher qual monstro será o seu primeiro jogador "ativo".
Depois disso, as curvas ocorrem com as seguintes etapas:
- Switch: Switches obrigatórios de monstros ocorrem (se houver)
- Escolha ação de batalha
- Switch: Qualquer switch monstro opcional (escolhido como ação de batalha) ocorre
- Verificação do sono: possibilidade de acordar do sono
- Ataque 1: Se possível, o monstro mais rápido usa seu movimento selecionado
- Ataque 2: Se possível, o outro monstro usa seu movimento selecionado
- Dano causado: Aplique dano de queimadura / veneno a monstros vivos
"Mais rápido" significa o monstro com maior velocidade. Se ambas as estatísticas de velocidade forem as mesmas, é escolhido por PRNG coin flip a cada turno.
No final de qualquer turno em que seu monstro ativo morre, você será solicitado a escolher um novo ativo. Você também pode optar por trocar de monstro ativo como sua jogada em qualquer turno (desde que você tenha mais de um vivo). Novamente, se você alternar como sua jogada, não fará uma batalha nesse turno.
Monstros não são "processados" quando inativos. Isso significa que eles não sofrem danos por queimadura / veneno, os contadores de veneno não se acumulam, não acordam do sono, etc. Nenhum efeito é removido ou alterado ao alternar . Este não é o outro jogo de luta de monstros. Se você sair com o ataque levantado e queimado, eles ainda estarão lá quando você voltar.
Dano de efeito ocorre se você mata seu oponente ativo ou não. Dessa forma, os membros de ambas as equipes podem morrer em um único turno.
Quando um time fica sem monstros utilizáveis, eles perdem. Se as duas equipes acabarem no mesmo turno, será um empate. Se a batalha durar 1000 turnos, é um empate.
A fórmula para determinar os danos é:
floor((effAttack / effDefense) * movePower * typeMultiplier * moveBoost)
effAttack
e effDefense
são as estatísticas efetivas para os monstros. O ataque eficaz é obtido adicionando Ataque e Ataque Bônus, multiplicando (por 0,8 ou 1,25) se algum efeito o alterar. Lembre-se de que esses efeitos podem ser acumulados.
O dano só pode ser 0 quando o modificador de tipo é 0 (Normal <--> Psíquico) ou o Poder do movimento é 0 (Heal, Burn, etc). Caso contrário, o mínimo é imposto em 1.
Torneio
Os torneios duram 100 rodadas. Em cada rodada, as equipes são embaralhadas e emparelhadas aleatoriamente. Se houver um número ímpar de equipes, o restante receberá um tchau (pontuação como empate). Ao vencer uma batalha, o time ganha 2 pontos, o empate vale 1 e não perde nada. A equipe com mais pontos no final vence!
Se as equipes estiverem empatadas, um torneio com apenas as equipes empatadas em primeiro lugar será realizado para determinar a ordem dos desempates.
Protocolo
O controlador enviará ao seu programa um dos quatro comandos. O primeiro caractere determina o tipo de comando, com os dados a seguir, se necessário.
Seu programa aceitará o comando como argumento e responderá em STDOUT dentro de um segundo . Não fique vivo ouvindo STDIN, ele não estará lá. Cada comando gerará um novo processo.
Você pode gravar dados / estado no disco. Coloque todos os arquivos em uma subpasta com o mesmo nome que sua equipe. Não escreva mais de 32 kilobytes de dados ou você será desqualificado. Os dados persistirão entre as rodadas, mas serão limpos entre os torneios.
Comandos
Dados da equipe
Isso é enviado uma vez no início do torneio para registrar seu time. Sua resposta deve ser constante , não diferente para cada torneio.
Inquerir:
T
Resposta:
name|member0|member1|member2
name
é uma string com o nome da sua equipe. Use apenas alfanuméricos para facilitar a análise. memberN
é uma string de membro, fornecendo os detalhes de cada monstro:
Cadeia de membros:
name:typeid:attack:defense:speed:moveid0:moveid1:moveid2
Novamente, 'name' é uma string, dessa vez com o nome desse monstro. typeid
é o seu tipo Os IDs de tipo estão na ordem mostrada no gráfico acima, com Normal = 0 e Grama = 4.
Os próximos três campos são suas estatísticas básicas. Lembre-se dos limites descritos na seção de estatísticas acima.
Os três últimos são os movimentos do seu monstro. Os IDs são mostrados no gráfico de movimentação acima.
Um exemplo de resposta de dados da equipe pode ser assim:
DummyTeam|DummyA:0:50:60:70:0:1:2|DummyB:0:50:60:70:0:1:2|DummyC:0:50:60:70:0:1:2
Qualquer equipe que enviar de volta dados ilegais, mal formatados ou ilegais aqui não participará até que sejam corrigidos.
Escolha Ativo
Isso é enviado no início de cada batalha e quando um monstro morre e precisa ser trocado.
Inquerir:
C#battleState
battleState
mostra o estado da batalha atual. Tenha paciência comigo aqui, é feio:
yourTeamState#theirTeamState
Onde se XteamState
parece:
name:activeSlot|member0state|member1state|member2state
activeSlot
mostra qual monstro está ativo no momento (0-2). Os estados membros têm dois sabores. Se é sua equipe, fornece informações extras. Assim,
Seu membroXstate:
name:id:attack:defense:speed:hp:typeid:poisonedturns:moveCount0:moveCount1:moveCount2:bonusAttack:bonusDefense:bonusSpeed:effectid:effectid:effectid
Seu membro Xstate:
name:id:attack:defense:speed:hp:typeid:poisonedturns:effectid:effectid:effectid
id
é simplesmente um identificador inteiro que você pode usar para rastrear monstros, se não gostar de usar name
.
attack:defense:speed
são suas estatísticas básicas .
poisonedturns
informa quantos turnos você foi envenenado.
moveCountX
informa quantos usos restam para cada movimento. Se 0, não pode ser usado. Para movimentos ilimitados, isso será negativo.
bonus(stat)
é a quantidade de pontos de bônus que você atribuiu a cada estatística.
effectid
é uma lista de efeitos de tamanho variável que foi aplicada ao seu monstro. Haverá não ser uma fuga :
na corda, se existem efeitos activos presentes ou não. Se houver efeitos empilhados, eles aparecerão como múltiplos efeitos na lista.
Os IDs de efeito são:
0 NONE (should not appear, internal use)
1 POISON
2 CONFUSION
3 BURN
4 SLEEP
5 HEAL (should not appear, internal use)
6 ATTACK_UP
7 ATTACK_DOWN
8 DEFENSE_UP
9 DEFENSE_DOWN
10 SPEED_DOWN
Resposta:
memberSlot
A única resposta necessária é um número único 0,1,2, informando qual membro você deseja estar ativo. Este deve ser um membro capaz de lutar. Não envie de volta 1
se o membro 1 estiver morto.
Ação de Batalha
A cada turno, você precisa decidir o que fazer.
Inquerir:
A#battleState
O battleState
aqui é exatamente como descrito acima.
Resposta:
Para usar uma movimentação, envie de volta o slot em que a movimentação está. Por exemplo, se eu atribuir o Punch ao slot 0, o envio 0
executará o Punch.
Para mudar para outro membro, envie o slot do membro mais dez . Então, para mudar para o membro 2, envie 12
.
Qualquer coisa que não esteja em [0,1,2,10,11,12] é considerada inválida e não resultará em nenhuma ação nesse turno.
Estatísticas de bônus
Após cada duas batalhas, você recebe um ponto de bônus secreto para cada membro da equipe.
Inquerir:
B#yourTeamState
O estado da sua equipe é o mesmo mostrado acima, não me faça repeti-lo.
Resposta:
stat0:stat1:stat2
Sua resposta representará qual status aumentar para cada membro da equipe. O ataque é 0, a defesa é 1, a velocidade é 2.
Portanto, para aumentar a velocidade do membro, o ataque do membro dois e a defesa do membro três, você responderia com:
2:0:1
Controlador
O controlador pode ser encontrado no BitBucket: https: //Geobits@bitbucket.org/Geobits/codemon.git
Apenas jogue todos os arquivos de classe compilados, envios e players.conf em uma pasta e execute.
A classe principal do controlador é chamada Tournament
. O uso é:
java Tournament [LOG_LEVEL]
Os níveis de log de 0 a 4 fornecem informações crescentes. O nível 0 realiza o torneio silenciosamente e apenas fornece os resultados, enquanto o nível 3 fornece comentários passo a passo. O nível 4 é saída de depuração.
Você pode adicionar envios ao torneio em players.conf
Simplesmente adicione a string da linha de comando necessária para executar o programa, uma por linha. As linhas que começam com #
são comentários.
Na sua postagem, inclua o comando que precisarei adicionar ao meu players.conf
e todas as etapas de compilação (se necessário).
Está incluído um time fictício composto por todos os membros normais com os três movimentos normais. Eles escolhem movimentos aleatoriamente e têm estatísticas terríveis. Divirta-se batendo nele.
Regras diversas
Você não pode ler ou gravar em nenhum recurso externo (exceto em sua própria subpasta, até 32 kB, conforme observado acima).
Sua equipe precisa entrar no torneio "às cegas". Isso significa que você não pode analisar a fonte de outras pessoas para descobrir o que um time / monstro específico fará em uma determinada situação. Você pode analisar os movimentos / estatísticas do seu oponente e acompanhar o andamento do torneio, mas não codifica essas informações.
Não interfira com outros processos / envios. Não é possível invocá-los, usar a reflexão para acessar seus dados, etc. Não mexa no meu computador. Apenas não tente. Isso é a meu critério. Os infratores podem ser impedidos de entrada futura.
Os participantes estão limitados a um máximo de duas entradas. Se você enviar mais, pontuarei apenas os dois primeiros enviados. Se você deseja revogar um, exclua-o.
As entradas podem não existir apenas para apoiar outras entradas. Além disso, você não pode tentar desqualificar indiretamente outros competidores (por exemplo, usando um nome de equipe de 27 milhões de caracteres para jogadores de DQ que tentam gravá-lo no disco). Cada envio deve jogar para ganhar por seu próprio mérito.
Seu programa pode gerar no máximo um processo filho por vez (total de descendentes, não diretos). Os processos principal e qualquer processo filho devem terminar diretamente após a saída. De qualquer forma, verifique se você não excedeu o tempo limite.
O torneio será realizado no meu computador executando o Ubuntu com um processador Intel i7 3770K.
Resultados
Estes são os resultados dos jogadores atuais. É muito próximo entre os principais candidatos, e estou pensando em aumentar o número de rodadas até 500 (e ajustar o espaçamento dos pontos de bônus para combinar). Alguma objeção, comentário?
------- Final Results -------
158 Happy3Campers
157 LittleKid
71 InsideYourHead
68 HardenedTrio
46 BitterRivals
Resultados completos de reprodução por reprodução no Google Drive
bye
para um número desigual de competidores e seria garantido que os pares de partidas fossem justos e distribuídos uniformemente.
n^2
não n
. Com apenas os 7 concorrentes atuais e 100 rodadas, são 2100 batalhas (vs 300 como estão e 1500 com 500 rodadas). Isso só piora à medida que mais entradas entram. Eu poderia reduzir o número de rodadas, mas hesito em fazer isso devido à variabilidade inerente (em relação aos status esp), e ter um múltiplo de 50 (para pontos de bônus) é mais fácil.