minitruco-android icon indicating copy to clipboard operation
minitruco-android copied to clipboard

Não deixar JogadorCPU aceitar truco em jogo perdido

Open chesterbr opened this issue 1 year ago • 9 comments

Isso foi muito mitigado com a limitação do aceite do truco ao jogador humano, mas talvez tenhamos que ver isso também.

(mas talvez seja só caso de blefe)

chesterbr avatar Mar 17 '23 15:03 chesterbr

Ok, a situação é a seguinte:

  • Jogo está "ganho" (elaborar isso) para a dupla do bot
  • Bot é o último da rodada (pé?)
  • É meio duh ele trucar, porque...
  • É TOTALMENTE duh se um dos outros dois aceitar (eles já vão perder)

chesterbr avatar May 17 '23 03:05 chesterbr

Então, para o último item (aceitar truco com jogo perdido):

Se eu (bot) recebi um pedido de truco e não tem mais como ganhar essa partida eu não devo aceitar truco jamais (é provocação)

Logo, o melhor lugar para implementar isso é JogadorBot.

chesterbr avatar May 17 '23 03:05 chesterbr

possoPerderMaoNessaRodada = (rodada = 2a. && resultado da 1a. != vitória minha) || rodada = 3a.

chesterbr avatar May 17 '23 04:05 chesterbr

estouPerdendoEstaRodada = max(cartasJogadasPelaMinhaDupla.valorTruco) < max(cartasJogadasPelaOutraDupla.valorTruco)

chesterbr avatar May 17 '23 04:05 chesterbr

possoReverterPerdaDaMao = aindaNaoJogueiEssaRodada && max(cartasNaMao.valorTruco) > max(cartasJogadasPelaOutraDupla.valorTruco)

chesterbr avatar May 17 '23 04:05 chesterbr

desses três vem a primeira regra:

ao receber pedido de aumento: se (possoPerderMaoNessaRodada && estouPerdendoEssaRodada && !possoReverterPerdaDaMao) responde não, nem passa pela Estrategia

vale a pena ver se a estratégia já não está fazendo isso

chesterbr avatar May 17 '23 04:05 chesterbr


E voltando para o outro item: não trucar se já estiver com o jogo ganho...

chesterbr avatar May 17 '23 04:05 chesterbr

Para fazer isso agora, eu teria que mexer no JogadorCPU (o que é um hack bem feio). Fiz uma exploração de tentar sinalizar isso no SituacaoJogo (de forma a permitir que as estratégias tenham essa inteligência), mas o código ali está bem enroscado:

  • o JogadorBot mantém uma instância única de SituacaoJogo (economia de alocação herdada do Java ME), e ela é atualizada em parte pelo JogoLocal, e em parte pelo próprio JogadorBot. Eu tentei pelo menos consolidar essa atualização no JogoLocal (que é onde faz mais sentido), mas percebi que:
    • o JogadorHumano e o JogadorBot mantém o controle sobre se a dupla pode ou não pedir aumento (acho até que tem um TODO pra mudar isso em algum lugar, porque é algo que permite bugs como #29), então um prereq é retornar esse controle para Jogo

Então as tarefas aqui seriam, pela ordem:

  • [ ] Centralizar o controle sobre a dupla poder pedir ou não aumento no JogoLocal (e de repente incorporar isso na notificação de vez?)
  • [ ] Colocar um equivalente de cartasRestantes do JogadorBot no Jogo com isso dá pra
  • [ ] Consolidar atualização do SituacaoJogo no próprio Jogo
  • [ ] Limar a instância fixa e fazer o jogo retornar um novo SituacaoJogo sempre

Tudo isso seria para permitir mudanças sãs em SituacaoJogo, e aí uma delas seria colocar a propriedade que sinaliza se o jogo está perdido (e, portanto, a estratégia não deve aceitar truco, a não ser que ainda tenha carta pra ganhar, ou algo assim).

chesterbr avatar May 18 '23 01:05 chesterbr

(cheguei a mover a criação do SituacaoJogo para JogoLocal, mas deu alguma zica; tá no stash stash@{0}: On bot-reboot: tentativa de isolar a criação do SituaçãoJogo)

chesterbr avatar May 18 '23 01:05 chesterbr