Jogos Vorazes - Eat or Die
Se você não comer, você morre. Se você come, você vive (até morrer). Você vai morrer, então tente morrer por último.
visão global
Há uma ilha povoada com um rebanho de presas. Você controla um pacote de cinco predadores. Seu objetivo é manter sua mochila viva. Faça isso comendo presas. As presas tendem a fugir de predadores e tentam permanecer em um rebanho de outra maneira. Naturalmente, seu bando estará no mesmo campo que todos os outros bando , então a competição tentará comê-los antes que você possa. Não deixe isso desanimar você, ou você vai morrer de fome.
Como jogar
Crie e envie um programa de linha de comando para direcionar seu pacote. Ele receberá informações de estado do programa de controle no STDIN e comandos de saída no STDOUT. O formato é descrito em detalhes abaixo. Cada programa será executado apenas uma vez e deve permanecer em execução até que não haja mais membros do pacote ativos. Você precisará ler as entradas assim que chegar e responder rapidamente. Há um tempo limite estrito de 200ms para cada resposta. Se você ainda não respondeu, seu pacote não receberá novas instruções para o turno atual.
Se o seu programa não puder ser executado pelo controlador, ele não será considerado válido. Inclua a string da linha de comando que precisarei usar para executar seu envio. Se houver instruções especiais (para configurar compiladores, etc.), inclua-as. Se eu não conseguir fazê-lo funcionar, solicitarei ajuda nos comentários. Se você não responder, não poderei aceitar seu envio.
O torneio será realizado em um sistema Linux de 64 bits. Lembre-se disso ao fornecer as instruções necessárias.
Detalhes
A posição e direção de cada criatura estão na forma de um par de números de ponto flutuante de precisão dupla (por exemplo
double
) representando suasx
ey
coordenadas, respectivamente.Cada criatura é considerada um ponto. Isso significa que eles podem se sobrepor e ocupar o mesmo espaço. Você não será deixado de lado, e não há conceito de colisão com outras criaturas.
A ilha é uma praça, 500 unidades ao lado. Se você tentar se aventurar além desses limites, ficará preso na borda. A origem
{0,0}
está no canto superior esquerdo,x
aumentando para a direita ey
aumentando para baixo. Novamente, o mapa não quebra .O jogo começa com 1500 + (packCount * 50) presas. Eles estarão reunidos no centro da ilha, mas rapidamente decidem começar a se mover.
Os pacotes serão organizados em um círculo uniformemente espaçado ao redor do perímetro. A ordem dos pacotes é embaralhada; portanto, não conte com a partida em um local específico.
Presas podem ver todos os outros animais em um raio de 30 unidades. Eles podem se mover no máximo 6,0 unidades por turno.
Os predadores podem ver todos os outros animais em um raio de 50 unidades. Eles podem se mover a um máximo de 6,1 unidades por turno. Isso significa que eles podem ver presas antes de serem vistos e (apenas) fugir deles.
Os predadores vivem e morrem de acordo com o nível de fome . Começa às 1000 e diminui um a cada turno. Se, após o movimento, um predador estiver dentro de 1 unidade de presa, ele o comerá automaticamente. Isso remove a presa e define a fome do predador para 1000. Cada predador pode comer apenas uma presa por turno. Se houver mais de um dentro do alcance, ele comerá o que o loop chegar primeiro (não necessariamente o mais próximo). Um predador morre se sua fome chegar a zero.
Os pacotes começam com cinco membros cada. A cada 5000 turnos, todos os pacotes ainda no jogo geram um novo membro. Será colocado dentro do alcance visível de um membro do bando. Verifique se suas entradas podem lidar com mais de cinco membros.
A cada 1000 turnos, mais presas aparecem. O número de novas presas será o número de predadores vivos menos um.
Predadores não podem atacar outros predadores. Eles comem presas quando pegam. É isso aí.
A ordem dentro de um turno é:
- Todas as presas tomam decisões
- Todos os predadores tomam decisões
- Todas as presas
- Todos os predadores se movem / comem
A ordem em que cada pacote toma suas decisões / movimentos será aleatória a cada turno.
Protocolo (Geral)
Todas as comunicações são feitas no formato de sequência US-ASCII
. Os números são convertidos em strings usando Java Double.toString()
ou Integer.toString()
. Sua saída deve ser formatada para que possa ser lida pelo Java Double.valueOf(String)
(você não estará produzindo números inteiros). Para detalhes sobre formatos analisáveis, consulte a documentação paraDouble
. Todos os campos em uma linha são separados pelo \t
caractere padrão e as novas linhas \n
. A cadeia inteira será encerrada com um byte nulo \0
.
Nos exemplos abaixo, estou usando <>
para marcar os campos por questões de legibilidade. Eles não estão presentes nas strings reais.
Protocolo (entrada)
A sequência de entrada varia em comprimento, dependendo de quantas criaturas são visíveis para o seu pacote. Pode exceder 100k caracteres, esteja preparado para isso. A configuração básica é:
Linha 0: informações básicas sobre o jogo.
turn
é o número do turno atual e as contagens são o número total de presas e predadores restantes no campo. Estes estãointeger
em forma de string.<turn>\t<preyCount>\t<predatorCount>\n
Linha 1: IDs e níveis de fome exclusivos dos membros do seu grupo. Estes não são fornecidos na mesma ordem para todas as entradas. Use os IDs exclusivos para rastrear membros individuais, não a ordem em que eles aparecem na entrada. Novamente, estes são
integer
como strings. Para um pacote de dois, isso seria:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Linha 2: As posições dos membros do seu bando, na mesma ordem que a linha 1 . Estes são
double
como string:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
As seguintes linhas são a visibilidade de cada membro do pacote, na mesma ordem que a linha 1 . Estes serão dados em duas linhas por membro.
O primeiro para cada um consiste em locais para a presa que ele pode ver. O segundo são os locais para os predadores que ele pode ver. Esses locais não são únicos como um todo. Por exemplo, se dois membros da matilha puderem ver o mesmo animal, ele estará na sequência de ambos os membros. Além disso, seus próprios membros do bando serão incluídos. Se você quiser excluí-los, compare os locais com seus próprios membros. Todos os locais estão no double
formato de sequência.
Para cada membro vivo:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Finalmente, o último caractere será \0
, no início da próxima linha.
Exceção: Se você receber a entrada dead\0
, seu pacote está morto. Termine seu programa normalmente, por favor. O controlador deve desligar todos os processos vivos quando fechado, mas eu prefiro não ter processos zumbis por todo o lado. Como cortesia, você pode incluir um tempo limite de entrada. Por exemplo, minha classe de exemplo termina se não receber entrada por 15 segundos.
Protocolo (Saída)
A saída é simples. Você fornecerá um par de double
valores para cada membro do live pack. Eles representam o movimento que você gostaria que eles realizassem neste turno. Por exemplo, se sua criatura estiver atualmente em {100.0, 100.0}
e você der um comando {-1.0, 1.0}
, eles irão para {99.0, 101.0}
. Todos os números estarão em uma única linha, separados por tabulação.
Por exemplo, se você tivesse 3 membros da matilha vivos, isso seria uma resposta válida:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Este seria mover suas criaturas por {1.0,-1.0}
, {2.0,-2.0}
, e {3.0,-3.0}
. O pedido é o mesmo que o recebido na entrada. Não esqueça o final \0
!
Se você fornecer informações inválidas, ocorrerão maus resultados. Se um número único não puder ser analisado como a double
, ele se tornará zero. Se a string como um todo não puder ser analisada, nenhuma nova instrução será dada e todo o seu pacote seguirá as instruções da curva anterior.
Todas as direções serão fixadas a uma distância máxima de 6,1 unidades. Você pode se mover mais devagar que isso, se quiser. Por exemplo, {1, 0}
você moverá uma unidade. {6,8}
(distância 10) moverá você apenas 6,1 unidades e reduzirá para cerca de {3.66, 4.88}
. A direção permanece constante.
Importante: O programa de controle lê seu STDOUT e STDERR. Se você lançar uma exceção e imprimir no STDERR, é muito improvável que a mensagem esteja na forma de uma resposta válida. Tente evitar fazer isso.
Programa de Controle / Teste
A fonte do controlador pode ser encontrada aqui em bitbucket.org . Você precisará compilá-lo antes de executar. A classe principal é Game
e todas as classes estão no pacote padrão. Para executar, inclua o comando de cada pacote como um argumento separado. Por exemplo, se você deseja executar um Java ChaserPack e um Python LazyPack.py, você pode usar:
java Game "java ChaserPack" "python LazyPack.py"
No mapa, as presas aparecem em verde e os predadores em vermelho. No entanto, o pacote que for o primeiro pacote fornecido como argumento será colorido em azul. O objetivo é distingui-los mais facilmente para fins de teste. Os predadores também piscarão em branco por cinco quadros quando comerem.
O jogo continuará até o último predador morrer de fome, gravando no console quando ocorrerem eventos de fome ou extinção. Quando o jogo terminar, a pontuação será dada para cada pacote. Se você não quiser ver os eventos de inanição / extinção, use o -silent
argumento Então ele produzirá apenas a pontuação final. Você deve passar isso como o primeiro argumento :
java Game -silent "java ChaserCat" "./someOtherPack"
Incluído é um pacote Java esqueleto chamado GenericPack
. Inclui as operações básicas de entrada / saída necessárias. Está aqui para dar um exemplo claro de como analisar e responder. Se você deseja adicionar um modelo em outro idioma, entre em contato.
Também está incluído um predador baseado no modelo ChaserPack
,. Não será incluído no torneio e é incluído apenas para fins de teste. Ele tem um desempenho muito ruim, devido a uma falha de segmentação intencional. Se você não pode vencê-lo, continue tentando.
Abaixo está um exemplo de execução do programa de controle (clique para o vídeo). A qualidade do vídeo não é ótima (desculpe), mas você pode ter uma ideia de como a presa se move. ( cuidado: áudio )
Pontuação
O vencedor será determinado pelo torneio, ganhando pontos em cada rodada.
Cada rodada prossegue até que todos os predadores estejam mortos. Cada pacote será pontuado com base em quando seu último membro morreu de fome. Eles receberão pontos com base no pedido. Os pontos serão acumulados por dez rodadas, e o vencedor é o pacote com o maior número total de pontos.
O primeiro lugar de cada rodada receberá 100 pontos. Para cada lugar depois disso, a recompensa será reduzida em 20% (arredondado para baixo). Isso continuará até que os pontos cheguem a zero (após o 17º lugar). Os lugares com mais de 18 anos não receberão pontos pela rodada. Os pacotes que empatarem receberão pontos iguais. Por exemplo:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
O máximo de pontos possíveis ao longo do torneio é de 1000, desde o primeiro lugar todas as dez vezes.
Se vários programas terminarem o torneio empatado em primeiro lugar, outro torneio de dez rounds será realizado apenas com as entradas do primeiro colocado . Isso continuará até que um vencedor apareça.
Vou tentar executar um torneio aproximadamente semanalmente, ou à medida que novas inscrições chegarem.
Regras adicionais (jogar limpo!)
Você não pode ler ou gravar em nenhum recurso externo. Como você não invocará o programa várias vezes, qualquer informação de estado pode ser armazenada internamente.
Não interfira com outros processos / envios. Isso não significa não tentar roubar suas presas, fugir delas, etc. Isso significa não interferir na execução do processo. Isso é a meu critério.
Os participantes estão limitados a um máximo de três entradas. Se você enviar mais, pontuarei apenas os três primeiros enviados. Se você deseja revogar um, exclua-o.
As entradas podem não existir apenas para apoiar outras entradas. Cada um 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). De qualquer forma, verifique se você não excedeu o tempo limite. Você não pode invocar a
Game
própria classe de forma alguma.
Resultados - 29 abril 2014
Aqui estão os resultados do último torneio de dez rounds:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Pacotes enviados antes das 09:00 EDT 2014/04/29 estão incluídos nesta execução.
Você também pode ver os detalhes de cada rodada . Por alguma razão, decidi numerar as rodadas para trás, para que comece com a "rodada 10".
Atualizações
23/04/2014: FGreg relatou um bug relacionado a tempos limite (obrigado!). Uma correção foi implementada, para que os testadores desejem atualizar o código do programa de controle.
fonte
Respostas:
Clarividente
Código atualizado para enfrentar o AbleDogs
Woo hoo! Finalmente supera esse Netcats! Expandi o código existente (créditos para o Geobits!) Com algumas pequenas modificações para criar este pacote de previsão futura. Nada supera os predadores que sabem onde a presa se moverá!
Dos dois testes que fiz, meu grupo sempre venceu o Netcats. Mas isso não será tão bom se não houver outros pacotes, pois a previsão ainda falha se houver muitas outras presas nas proximidades.
Provavelmente, posso incluir o truque do CivilizedBeasts para reduzir substancialmente o número de presas durante os primeiros milhares de turnos.
Do nome da minha mochila, você deve saber qual estratégia eu uso = D
Editar :
Melhore os casos especiais quando a versão anterior ficou parada na esquina.flock[ALIGN]
Fator de presa incluídoContei quantas presas cada pacote come, e aqui está o resultado:
Meu bando é muito agressivo, e acho que a maioria das 916 conta com o roubo de presas do Netcats, assim como o RubySpiders.
Infelizmente, o CivilizedBeasts está perdendo devido ao camelo central da EcoCamel.
E o EcoCamel (com fome de 500) é bastante eficiente, come o suficiente para sobreviver até o fim.
Também com este clarividente atualizado, o jogo mal chega a 10.000 turnos.
O código:
fonte
Netcats
Aqui está um pacote para você começar. Estende a
GenericPack
classe incluída no programa de controle. Ele foi aprimorado desde a postagem original e não passa mais fome com um rebanho escasso.Os Netcats usam uma rede em forma de V para prender presas no canto, onde podem comê-las à vontade. A rede é formada com um membro "principal" no centro. Uma vez que a cabeça come, ela troca de lugar com o membro da matilha mais faminto, já que a cabeça é normalmente a primeira a ter a oportunidade de comer.
A rede começa um pouco pequena, mas aumenta quando o rebanho fica menor, a fim de arrastar o campo com mais eficiência.
Se nenhuma presa é visível, a formação se amplia para um padrão de busca ingênuo, cobrindo a maior parte da ilha.
Quando o pacote chega a dois membros, a rede simplesmente não funciona. Nesse ponto, cada um segue seu próprio caminho, avidamente comendo a coisa mais próxima que pode encontrar e dando um passeio semi-aleatório.
Esta versão sobrevive muito melhor do que os ingênuos Netcats vistos no vídeo vinculado na pergunta.
fonte
Aranhas Rubi
Como às vezes menos é mais e muitas soluções provavelmente tentariam encurralar a presa de qualquer maneira ...
Eu pensei que minha mochila pudesse apenas se separar e esperar que outros fizessem o trabalho.
Advertência: Na verdade, ele não fica em execução, nem lê as entradas quando chega nem responde rapidamente. Ainda assim, como funciona bem com o controlador, espero que se qualifique sem mais ajustes.
fonte
CivilizedBeasts
Finalmente, hora de mostrar minhas bestas!
Minha raça acha que a caça é um tanto primitiva, então eles trabalham juntos em uma equipe de 4 pessoas e abandonam seu quinto aliado, porque: menos predadores = mais presas para si mesmos. O que eles basicamente fazem é o que os humanos fazem, pegam presas e cuidam bem do gado;)
Torna-se bastante difícil para meus seios sobreviverem com menos de 200 presas no turn + -12.000, apenas com Netcats inimigos no jogo. Você ficará feliz com esta raça, pois ela realmente devora enormes quantidades de presas com velocidade, como nenhuma outra raça consegue (não que abates rápidos e grandes garantam a vitória, mas influencia o (longo) tempo que uma rodada inteira leva consideravelmente).
fonte
Abutres de rubi
Aí vem um pacote de parasitas mais ativos . Eles estão tentando cercar o predador em movimento mais próximo , para que possam roubar sua presa . Eles são um pouco dependentes da sorte, pois não têm uma maneira inteligente de escolher quem seguir, mas geralmente estão atacando caçadores e às vezes aranhas .
Eles não estão completamente terminados, como eu postei isso para aumentar o tempo :)
Espero:
22 de abril de 2014: Adicionado tédio , que os torna menos pegajosos e permite que caçam presas por conta própria e procurem predadores
fonte
EvilEco CamelsEdit: Mutação # 2. Ah, não, estou atrasado com a implementação da previsão do movimento das presas, para ser o primeiro a vencer os Netcats. OK, que assim seja.
Esta mutação tem
$hunger_critical
variável (constante). Mudá-lo para um valor acima de 1000 faz com que Camels sempre caçam, como Clarividentes. Então:Se
$hunger_critical
estiver definido como, por exemplo, 500 (como abaixo), então meus Camelos (depois de ver os horrores da civilização ) tentam se comportar de maneira ecológica (por isso eles mudaram o nome de sua raça), ou seja, matam apenas quando estão com fome. Se não estiverem com fome, eles patrulham áreas críticas da ilha - centro e cantos, para evitar massacres sem sentido por alguns outros caçadores. Bem, com o centro, mais ou menos funciona. A idéia de circular nos cantos era afastar a presa e dificultar a vida dos gatos e parasitas. Bem, isso não funciona. Presas estúpidas entram nos cantos de qualquer maneira.É interessante, também, que o
flock[ALIGN]
componente só possa ser adivinhado por predadores, e minha implementação seja diferente da justhalf. Eu tenho medo há algum pequeno bug no meurip-offimplementação de código Geobits', observando / comparando caça individual de Camelos vs clarividentes.E o programa está meio longo agora, desculpe.
Edit: Mutação # 1. A ilha acaba sendo bastante radioativa (o que explica a falta de vegetação e a natureza inexplicável das criaturas 'presas'), então aqui está a primeira mutação dos meus camelos. Qualquer um deles pode se tornar um caçador solo, se estiver com fome ou se não houver espaço livre para todos. Hunter tenta perseguir ativamente presas próximas. Se não houver, ele patrulha em um amplo círculo ao redor do centro da ilha e persegue a criatura mais próxima quando a encontra. Infelizmente, a direção da presa se torna imprevisível quando está perto de seu enxame (vale a pena investigar ...), então a perseguição a solo não é muito eficiente. Mas, se for bem-sucedido, o Camel vai digerir no canto livre mais próximo (se houver). Quando o nível de fome está abaixo de certo nível, qualquer camelo abandona seu canto (provavelmente xingando Netcats ('onde está a comida?' )) e fica livre em roaming por conta própria. E assim por diante.
A mesma piada contada duas vezes não é engraçada, mas (1) eu tive que começar de algum lugar e sou novo nessas coisas, (2) Honesto, pensei em táticas de canto (e quem não o fez?), Assistindo Netcats, antes de Ruby Aranhas apareceram na ilha.
Então, já ouviu falar em camelos carnívoros? Um dia, animais pobres acordaram nesta ilha abandonada por Deus e não encontraram grama nem árvores, mas muitas coisas estranhas, verdes, embora comestíveis, que se movem rapidamente (muito irritantes). Não tendo hábitos de caça (mas eles sofrerão mutações em breve, espero), meus Camelos desenvolveram um esquema muito maligno para sobreviver: eles se dividem e se dividem em um dos quatro cantos, e o quinto deles vai para o centro (para morrer primeiro, como acontece). Em seus destinos, eles esperam pacientemente, realizando uma espécie de dança de guerra de camelo, ou talvez apenas tentem não pisar em outros animais já lá, aranhas e tudo ...
fonte
vec
propriedade é basicamente o deslocamento da curva anterior para a curva atual. E, como eu disse, combinamos na curva anterior para descobrir qual presa segue por qual caminho, não podemos confiar na ordem das presas. Isso é possível porque as presas geralmente (no cenário típico) mantêm distância suficiente uma da outra (> 12 unidades) e, portanto, na maioria das vezes podemos combinar as presas no turno anterior ao turno atual.AbleDogs - PHP
Esses cães simpáticos aprenderam a morder os bezerros de uma presa para cutucá-la pelas paredes. Eles também gostam de vagar pelo pasto em busca de novas presas. Por fim, eles foram ensinados a não comer, a menos que realmente precisem das calorias.
Coloque o código em um
AbleDogs
arquivo e execute-o comphp AbleDogs
Considerações gerais
É o fim do jogo que conta. Você pode ter o algoritmo de caça mais inteligente de todos os tempos, se não detectar e capturar as últimas presas mais rapidamente que a oposição, você perde.
Se seus predadores não puderem capturar uma presa sozinha (ou pelo menos em pares), você estará brindando assim que a densidade da presa cair baixa o suficiente para depender da sorte cega ou do bloqueio das presas nas esquinas.
Um preditor de movimento de presas é basicamente obrigatório. Não consigo imaginar vencer um programa baseado em preditores sem ter seu próprio preditor.
Caça à cauda
A maneira mais ineficiente de capturar uma presa é persegui-la. Supondo que um único predador persiga uma única presa e sem influências externas (paredes, outras presas, etc.), uma perseguição pela cauda pode durar para sempre. Assim que você entra no raio de visão da presa de 30 unidades, a presa foge na velocidade 6 para o seu 6,1, para ganhar 0,1 distância por turno: em uma linha reta, você precisará de cerca de 300 voltas para obtê-lo.
Levando em conta o tamanho da arena, uma presa viajará no máximo na diagonal de 500 unidades quadradas antes de atingir uma parede ou um canto, o que levará no máximo 117 voltas.
A estratégia vencedora é, obviamente, encontrar uma maneira de desacelerar as presas, ou seja, tendo outro predador ou uma parede / canto à sua frente.
Preditor
Com uma velocidade de presa de 6, uma presa pode se mover para uma área de 36 * pi unidades ao quadrado. Com um raio de captura de 1, uma estimativa cega de onde a presa será a próxima tem uma chance de 1/36 * pi (cerca de 1%) de sucesso. Claramente, algo precisa ser feito para melhorar isso!
Observando o código do mecanismo de simulação, você pode ver que as entradas são:
Embora todas as posições estejam disponíveis, as velocidades anteriores de presa não. A única maneira de calcular essas velocidades seria rastrear todas as presas de uma volta para a outra, o que é quase impossível de fazer (a menos que você implemente um algoritmo de rastreamento de movimento muito inteligente). Portanto, um preditor pode reproduzir facilmente todos os termos da computação, exceto a contribuição de velocidade que deve ser adivinhada.
No caso de uma única presa, a velocidade pode ser rastreada sem muitos problemas, o que permite criar um preditor "perfeito" para capturar uma presa isolada do rebanho. O que é basicamente tudo o que você precisa para o final de jogo, quando as presas são muito poucas para interagir umas com as outras. Quando as presas são abundantes e o efeito do rebanho é forte o suficiente para enganar o preditor, a enorme densidade de presas compensará os erros (se você não pegar a que estava almejando, é provável que encontre um de seus amigos mais próximos )
Goading presas
Com o conhecimento exato do cálculo da velocidade da presa, é possível "orientar" uma presa em direção à direção desejada, ajustando a posição do predador.
Isso permite prender uma presa contra uma parede ou direcioná-la para outro membro da matilha. Tentei algumas estratégias refinadas, como beliscar uma presa entre dois membros da matilha. Infelizmente, isso se mostrou menos eficiente do que a rotina atual de "prender e escanear", pois manter dois predadores ocupados para perseguir uma única presa deixa a oposição com muitos predadores livres para explorar o pasto.
Roubar presas
Uma característica do comportamento das presas é que a influência de um predador aumenta proporcionalmente à sua distância da presa (desde que permaneça dentro do raio de visão da presa). Quanto mais próximo o predador chegar de uma presa, menor será a presa.
Isso significa que quando dois predadores competem para capturar uma presa, o mais próximo é obrigado a obtê-la primeiro. Mesmo um competidor super inteligente que conseguisse se posicionar bem na frente do eixo caçador / presa basicamente assustaria a presa nas mandíbulas do competidor.
Para conseguir roubar uma presa, são necessários pelo menos um par de predadores. Um irá para a matança, e o (s) outro (s) permanecerá (m) dentro do raio de visão da presa, tanto quanto for possível, para maximizar a influência e incitar a presa em direção ao caçador.
Além disso, toda mudança de direção permitirá que a competição diminua a curva em direção à presa, e permanecer atrás do competidor só é possível se o "aguilhão" estiver perto o suficiente da presa no início da ação.
Portanto, o roubo de presas tem apenas uma chance de sucesso se as posições iniciais dos "ladrões" forem favoráveis e você puder poupar pelo menos um segundo predador. Na minha experiência, isso não vale a complexidade.
Alterações sugeridas
Para permitir estratégias mais complexas, mover o predador acima da velocidade máxima da presa pode ter um custo em pontos de fome, proporcional ao excesso de velocidade. Digamos, por exemplo, subir a velocidade 6 é gratuito e todo ponto de velocidade acima de 6 custa 100 pontos de fome (ir para 6,3 custa 30 pontos de fome por turno, queimar 1000 pontos de fome permitiria atingir a velocidade 16 por uma volta - e morrer se você não pegue uma presa fazendo isso!).
Em vez de dar a morte a um predador aleatório quando mais de um está perto o suficiente para comer uma presa, sugiro dividir o ganho (por exemplo, 3 predadores receberiam 333,33 pontos de fome cada). Isso permitiria estratégias mais intrigantes para o final de jogo (sombrear um predador inimigo se tornaria útil se você considerar que tem mais pontos de fome, por exemplo).
A cor especial para o primeiro pacote é bastante difícil de ver. Sugiro ciano ou laranja em vez de azul.
fonte
Lazy Pack Haskell
Você precisará da plataforma haskell para executar isso. Então você usa o
runhaskell
comando para executá-lo. Minha matilha espera a presa chegar até eles.fonte
-silent
opção, embora ...Não é uma inscrição, estou sempre interessado em adicionar cores personalizadas para cada inscrição participante no rei-da-colina ;)
E também o processo alimentar não é visualizado alterando a cor, mas alterando o tamanho, para que possamos ver vários eventos alimentares em pouco tempo.
Game.java
Predator.java
fonte