Giter Site home page Giter Site logo

brunoabdon / domino Goto Github PK

View Code? Open in Web Editor NEW
2.0 5.0 0.0 1.94 MB

Jogo de Dominó programável 🁏

Home Page: http://brunoabdon.github.io/domino/apidocs/

License: GNU General Public License v3.0

Java 100.00%
domino game artificial-intelligence dominoes programming-game

domino's People

Contributors

brunoabdon avatar dependabot[bot] avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Forkers

brunoabdon-ns

domino's Issues

Jogador iterativo

Implementar um Jogador que simplesmente pergunta a um humano que Pedra jogar.

Seria a possibilidade de uma pessoa jogar contra as classes.

Esse jogador exibiria uma gui com as pedras na mão dele, e jogaria a que recebesse um click do mouse, etc.

Empatando a primeira rodada, quem começa a segunda?

Normalmente, a primeira rodada começa com quem tem o Dozão (a maior carroça, na verdade) e as próximas começam sempre pela dupla que bateu na rodada anterior.

Se a rodada anterior empatou, eu acho que começa a mesma dupla que começou a anterior.

Mas se a rodada anterior foi a primeira? Quem começa essa pós empate? Quem tiver o Dozão, ou a mesma dupla que começou a anterior (por ter tido o Dozão antes?)

Também acho que o código não tá preparado pra isso. Nunca pensei nesse caso.

Mesa não limpa cabeças quando a partida começa

Quando uma partida começa, mesa.getNumeroDireita() e mesa.getNumeroEsquerda() estão retornando os valores da última rodada da partida anterior. Isso é um bug em MesaImpl.

Quando o evento "partidaComeçou" for lançado, a mesa tem que estar consistentemente limpa.

Permitir adicionar listeners pelo domino-config.xml

O arquivo de configuração deve ter um elemento pra se configurar classes de listeners, que a aplicação vai instanciar e associar ao jogo.

Talvez precise criar um método de inicialização pros listeners, permitindo passar um mapa de parâmetros pelo xml....

Ou talvez deveria existir uma anotação @Listener ?

Jogar por rede

Permitir Jogadores jogarem remotamente, sem ter que copiar o código pra a maquina onde está rodando o jogo.

É possível fingir que tocou

Se um jogador disser que tocou tendo pedra jogável na mão, o jogo continua normalmente. Isso é roubo. Tem que verificar.

Fazer cache de Jogadas?

Será que não vale a pena criar previamente todas as instâncias possíveis de br.nom.abdon.domino.Jogada?

Existem 57 Jogadas possíveis:

  • cada uma das 28 Pedras pra Esquerda; mais
  • cada uma das 28 Pedras pra Direita; mais
  • o toque

Uma Partida deve ter no mínimo umas 20 jogadas (chutando!). Um Jogo inteiro 4 vezes mais. Talvez, pra um único Jogo, não valha a pena. Mas, pra vários, deve começar a valer a pena rápido.

A classe br.nom.abdon.domino.Jogada esconderia seu construtor e exporia um método estático que retornaria uma Jogada, dado o Lado e a Pedra.

Toda Jogada seria imutável.

(A preocupação que a classe Partida tem em chamar getLado() e getPedra() só uma vez seria eliminada)

A classe em si deveria seria final...

...não seria então o caso de ser um enum também?

Melhorar o esquema de excecões

Jogo.jogar() deveria lançar uma exceção que, pelo seu tipo, poderia identificar se houve um erro de configuração, erro por parte de um dos jogadores ou algum outro erro inesperado.

Erros no arquivo xml em DominoApp deveria gerar mensagens de erro no System.err, e não stack traces.

Contagem de pontos da empate sem ser

Na contagem de pontos quando a partida trava (todos os jogadores tocam), existe pelo menos um senário onde o jogo erra na contagem:

Se o primeiro e o segundo jogador tiver o mesmo número de pontos na mão, o terceiro tiver mais que eles e o quarto menos, o quarto deveria ganhar. O resultado tá saindo empate.

Implementar um Gravador / Reprodutor de jogos

Implementar um Gravador de Jogos que, ouvindo os eventos de um jogo, vá gravando o jogo e persista ele em algum arquivo.

Esse arquivo poderia então ser lido depois pelo Reprodutor de Jogos, que iria vendo o que aconteceu e disparando os eventos correspondentes. Se conectado à interface gráfica, seria possível reassistir o jogo.

Jogos salvos também seriam bons pra se estudar estatistificas do que acontece.

Tornar o gerador de aleatoriedade configurável no `DominoConfig`/ `domino-config.xml`

O bean DominoConfig deve ter um atributo do tipo com.github.abdonia.domino.motor.RandomGoddess, para ser configurável como será a geração de aleatoriedade do jogo. Esse parâmetro deve poder ser lido do domino-config.xml.

A classe Jogo não precisa mais ter um construtor recebendo RandomGoddess (se #19 for implementado).

O atributo deve ser considerado opcional. A implementação com.github.abdonia.domino.motor.DefaultRandomGoddess deve continua a ser usada quando nenhuma é especificada.

Criar eventos pra situações que abortam o jogo

Criar eventos (na OmniscientDominoEventListener) pra quando ocorre um bug de um jogador e o jogo é cancelado. Tipo:

   public void jogadorJogouPedraInvalida(int jogador, Lado lado, Pedra pedra);

   public void jogadorTentouRemoverPedraDaMesa(int jogador);

   public void jogadorErrouVontadeDeComeçar(int jogador);

   public void jogadorFaleceu(int jogador); //lançou uma RuntimeException....

Talvez criar também um evento pra dizer que o Jogo foi cancelado. Ou não, fica explicitado na documentação que esses eventos indicam o cancelamento da partida.

Uma UI pode querer reportar esses acontecimentos. E isso evita que Jogo.jogar(conf) precise silenciar completamente exceçães de jogadores ou de lançar elas.

Fazer um manual pra iniciantes

Fazer um manual pra iniciantes, que a pessoa leia e saiba implementar um Jogador e botar pra rodar uma partida, pelo menos.

Um evento deveria avisar qual foi o dorme

Mesmo sendo possível prever quais pedras foram pro dorme baseado nas pedras que foram distribuídas pros jogadores, deveria haver um evento específico anunciando quais pedras que foram pro dorme.

[DepShield] (CVSS 7.5) Vulnerability due to usage of org.yaml:snakeyaml:1.24

Vulnerabilities

DepShield reports that this application's usage of org.yaml:snakeyaml:1.24 results in the following vulnerability(s):

This is an automated GitHub Issue created by Sonatype DepShield. Details on managing GitHub Apps, including DepShield, are available for personal and organization accounts. Please submit questions or feedback about DepShield to the Sonatype DepShield Community.

Saber como foi escolhido quem começou a partida

Quando uma dupla começa a partida (por ter vencido a anterior), os jogadores não têm atualmente como saber se o Jogador da dupla que começou foi escolhido por ter querido começar mais que o outro, ou se quis tanto quanto e foi escolhido aleatoriamente.

Num jogo real, essa informação é acessível a todos os jogadores. Deveria haver um evento anunciando o desfecho das decisões de "quer começar".

Essa informação é útil por exemplo, pra saber se a mão do parceiro tá boa ou não, e decidir adotar a uma estratégia de jogar se sacrificando pelo parceiro.

Esconder JogadorWrapper, expor DominoConfig

O construtor da classe Jogo deve receber um DominoConfig, ao invés de receber 4 JogadorWrapper.

A classe 'JogadorWrapper` não deve mais ser pública (só é usada internamente pelo motor).

A classe DominoConfig deve ser movida pra o pacote com.github.abdonia.domino.motor (continuando pública), por "outros mains" vão utilizar ela pra criar Jogos.

A criação de 'JogadorWrappers que acontece em DominoAppdeve acontecer agora emJogo(ou em alguma classe utilitária interna do pacote) (ou num método de visibilidadedefaultdentro doDominoConfig`!).

Deve ser possível saber quantas pedras os outros Jogadores têm

Na vida real, quando um jogador vai jogar, ele tem acesso a informação de quantas pedras cada um dos outros tem na mão. Se ele perguntar, a galera tem que dizer. Não pode ficar escondendo não.

Como está implementado, o cara só sabe de quantas pedras os outros têm se for contando.

DominoConfig deveria aceitar instâncias e literais de classes

DominoConfig não deveria aceitar apensas Strings dos nomes das classes. Deveria aceitar também instâncias e literais de classes, dando mais de uma opção pra as classes que usam.

Deve ser possível setar o Jogador 3 com: getClasseJogador2Dupla1(String) ou getClasseJogador2Dupla1(Class). Chamando as duas versões pra o mesmo jogador, a posterior sobrescreve a anterior.

Deve existir também o setJogador2Dupla1(Jogador j).

O mesmo deve valer pra EventListeners e pra a RandomGodess.

Primeiro Jogador com mais chances de ter 6 carroças

Num teste que rodou 323.385 jogos, de um total de 2.336.737 partidas, 49 tiveram morte súbita por 6 carroças na mão. Estranhamente, em todos os casos, foi o primeiro jogador que teve as 6 carroças.

Analisando o log, não parece ter sido um erro do logger (escrevendo sempre o nome do primeiro jogador). De fato, o primeiro jogador sempre recebia 6 carroças.

5 carroças volta. 6 ganha um ponto

O jogo ainda não implementa a regra de que, quando um jogador começa com 5 carroças, a partida é anulada (volta as pedras, embaralha e começa de novo), e quando um começa com 6, a partida termina como vitória da dupla desse jogador, valendo 1 ponto.

Configurações avançadas: Usar cache

A classe DominoEventBroadcaster atualmente faz um cache de "jogadas de jogadores" que só é útil caso vários jogos forem ser jogados em seqüência. Pra rodar só um Jogo, esse cache até atrapalha (pq nunca, num mesmo jogo, vai se repetir do mesmo jogador jogar a mesma pedra do mesmo lado).

Esse cache deveria ser usado só quando solicitado. Seria uma configuração opcional em DominoConfig, que diria pra o Jogo usar ou não um broacaster com cache (default seria não usar).

DepShield encountered errors while building your project

The project could not be analyzed because of build errors. Please review the error messages here. Another build will be scheduled when a change to a manifest file* occurs. If the build is successful this issue will be closed, otherwise the error message will be updated.

This is an automated GitHub Issue created by Sonatype DepShield. GitHub Apps, including DepShield, can be managed from the Developer settings of the repository administrators.

* Supported manifest files are: pom.xml, package.json, package-lock.json, npm-shrinkwrap.json, Cargo.lock, Cargo.toml, main.rs, lib.rs, build.gradle, build.gradle.kts, settings.gradle, settings.gradle.kts, gradle.properties, gradle-wrapper.properties, go.mod, go.sum

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.