# brunoabdon/domino architecture

> Architecture diagram of the GitHub repository brunoabdon/domino, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-20). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/brunoabdon/domino
- Repository: https://github.com/brunoabdon/domino

## Overview

domino é um jogo de programação: o usuário inicia a aplicação, que carrega jogadores e listeners, cria um jogo e executa partidas entre quatro IAs. Cada partida distribui pedras, consulta jogadores, valida jogadas na mesa, calcula batidas ou empate e atualiza o placar até uma dupla vencer. O motor também transmite eventos para logging e outras UIs. A arquitetura abaixo combina contratos de domínio, orquestração, configuração e observabilidade; alguns vínculos internos foram omitidos por os fontes não terem sido amostrados.

Main entry points: [`src/main/java/com/github/abdonia/domino/motor/Jogo.java`](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Jogo.java) (Orquestrador Jogo), [`src/main/java/com/github/abdonia/domino/motor/Partida.java`](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Partida.java) (Motor Partida), [`src/main/java/com/github/abdonia/domino/motor/DominoEventBroadcaster.java`](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DominoEventBroadcaster.java) (Despachante Eventos), [`src/main/java/com/github/abdonia/domino/app/DominoApp.java`](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/app/DominoApp.java) (Aplicação Domino)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Entrada e Configuração"]
  node_domino_app["Aplicação Domino<br/>[DominoApp.java]"]
  node_config_loader["Leitor YAML"]
  node_config["Configuração Domino<br/>[DominoConfig.java]"]
end

subgraph group_engine["Motor do Jogo"]
  node_jogo["Orquestrador Jogo<br/>[Jogo.java]"]
  node_partida["Motor Partida<br/>[Partida.java]"]
  node_random["Sorteio Aleatório"]
  node_wrapper["Adaptador Jogador"]
end

subgraph group_domain["Domínio e Estado"]
  node_mesa_impl["Mesa em Jogo<br/>[MesaImpl.java]"]
  node_mesa_api["Contrato Mesa<br/>[Mesa.java]"]
  node_pedra["Pedras Dominó<br/>[Pedra.java]"]
  node_jogada["Jogadas<br/>[Jogada.java]"]
  node_vitoria["Tipos Vitória<br/>[Vitoria.java]"]
  node_resultado["Resultado Partida"]
  node_dupla["Placar Duplas<br/>[Dupla.java]"]
end

subgraph group_players["Jogadores"]
  node_jogador_api["Contrato Jogador<br/>[Jogador.java]"]
  node_sample_ai["IAs de Exemplo"]
end

subgraph group_events["Eventos e Logging"]
  node_broadcaster["Despachante Eventos"]
  node_event_api["Contrato Eventos"]
  node_omni_api["Eventos Oniscientes"]
  node_logger["Logger de Eventos"]
end

node_terminal(("Usuário Terminal"))

node_terminal -->|"inicia aplicação"| node_domino_app
node_domino_app -->|"carrega configuração"| node_config_loader
node_config_loader -->|"produz configuração"| node_config
node_domino_app -->|"cria jogo"| node_jogo
node_jogo -->|"cria mesa"| node_mesa_impl
node_jogo -->|"executa partidas"| node_partida
node_jogo -->|"sorteia decisões"| node_random
node_jogo -->|"atualiza placar"| node_dupla
node_partida -->|"consulta jogador"| node_wrapper
node_wrapper -->|"invoca jogador"| node_jogador_api
node_sample_ai -->|"lê estado"| node_mesa_api
node_sample_ai -->|"cria jogada"| node_jogada
node_partida -->|"valida jogada"| node_mesa_impl
node_partida -->|"classifica batida"| node_vitoria
node_partida -->|"produz resultado"| node_resultado
node_jogo -->|"consome resultado"| node_resultado
node_jogo -->|"emite eventos"| node_broadcaster
node_partida -->|"emite eventos"| node_broadcaster
node_broadcaster -->|"despacha eventos"| node_event_api
node_broadcaster -->|"despacha detalhes"| node_omni_api
node_logger -->|"implementa contrato"| node_omni_api
node_broadcaster -.->|"notifica logger"| node_logger
node_config -->|"configura jogo"| node_jogo

click node_domino_app "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/app/DominoApp.java"
click node_config_loader "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/app/DominoYAMLConfigLoader.java"
click node_config "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DominoConfig.java"
click node_jogo "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Jogo.java"
click node_partida "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Partida.java"
click node_random "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DefaultRandomGoddess.java"
click node_wrapper "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/JogadorWrapper.java"
click node_mesa_impl "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/MesaImpl.java"
click node_mesa_api "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Mesa.java"
click node_pedra "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Pedra.java"
click node_jogada "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Jogada.java"
click node_vitoria "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Vitoria.java"
click node_resultado "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/ResultadoPartida.java"
click node_dupla "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Dupla.java"
click node_jogador_api "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Jogador.java"
click node_sample_ai "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/exemplos/JogadorSimplorio.java"
click node_broadcaster "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DominoEventBroadcaster.java"
click node_event_api "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/eventos/DominoEventListener.java"
click node_omni_api "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/eventos/OmniscientDominoEventListener.java"
click node_logger "https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/log/LoggerDominoEventListener.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_domino_app,node_config_loader,node_config toneBlue
class node_jogo,node_partida,node_random,node_wrapper toneAmber
class node_mesa_impl,node_mesa_api,node_pedra,node_jogada,node_vitoria,node_resultado,node_dupla toneMint
class node_jogador_api,node_sample_ai toneRose
class node_broadcaster,node_event_api,node_omni_api,node_logger,node_terminal toneIndigo
```

## Components

### Entrada e Configuração

- [Aplicação Domino](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/app/DominoApp.java): `src/main/java/com/github/abdonia/domino/app/DominoApp.java`
- [Leitor YAML](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/app/DominoYAMLConfigLoader.java): `src/main/java/com/github/abdonia/domino/app/DominoYAMLConfigLoader.java`
- [Configuração Domino](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DominoConfig.java): `src/main/java/com/github/abdonia/domino/motor/DominoConfig.java`

### Motor do Jogo

- [Orquestrador Jogo](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Jogo.java): `src/main/java/com/github/abdonia/domino/motor/Jogo.java`
- [Motor Partida](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Partida.java): `src/main/java/com/github/abdonia/domino/motor/Partida.java`
- [Sorteio Aleatório](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DefaultRandomGoddess.java): `src/main/java/com/github/abdonia/domino/motor/DefaultRandomGoddess.java`
- [Adaptador Jogador](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/JogadorWrapper.java): `src/main/java/com/github/abdonia/domino/motor/JogadorWrapper.java`

### Domínio e Estado

- [Mesa em Jogo](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/MesaImpl.java): `src/main/java/com/github/abdonia/domino/motor/MesaImpl.java`
- [Contrato Mesa](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Mesa.java): `src/main/java/com/github/abdonia/domino/Mesa.java`
- [Pedras Dominó](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Pedra.java): `src/main/java/com/github/abdonia/domino/Pedra.java`
- [Jogadas](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Jogada.java): `src/main/java/com/github/abdonia/domino/Jogada.java`
- [Tipos Vitória](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Vitoria.java): `src/main/java/com/github/abdonia/domino/Vitoria.java`
- [Resultado Partida](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/ResultadoPartida.java): `src/main/java/com/github/abdonia/domino/motor/ResultadoPartida.java`
- [Placar Duplas](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/Dupla.java): `src/main/java/com/github/abdonia/domino/motor/Dupla.java`

### Jogadores

- [Contrato Jogador](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/Jogador.java): `src/main/java/com/github/abdonia/domino/Jogador.java`
- [IAs de Exemplo](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/exemplos/JogadorSimplorio.java): `src/main/java/com/github/abdonia/domino/exemplos/JogadorSimplorio.java`

### Eventos e Logging

- [Despachante Eventos](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/motor/DominoEventBroadcaster.java): `src/main/java/com/github/abdonia/domino/motor/DominoEventBroadcaster.java`
- [Contrato Eventos](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/eventos/DominoEventListener.java): `src/main/java/com/github/abdonia/domino/eventos/DominoEventListener.java`
- [Eventos Oniscientes](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/eventos/OmniscientDominoEventListener.java): `src/main/java/com/github/abdonia/domino/eventos/OmniscientDominoEventListener.java`
- [Logger de Eventos](https://github.com/brunoabdon/domino/blob/master/src/main/java/com/github/abdonia/domino/log/LoggerDominoEventListener.java): `src/main/java/com/github/abdonia/domino/log/LoggerDominoEventListener.java`

### Other components

- **Usuário Terminal**

## Connections

- Usuário Terminal → Aplicação Domino: inicia aplicação
- Aplicação Domino → Leitor YAML: carrega configuração
- Leitor YAML → Configuração Domino: produz configuração
- Aplicação Domino → Orquestrador Jogo: cria jogo
- Orquestrador Jogo → Mesa em Jogo: cria mesa
- Orquestrador Jogo → Motor Partida: executa partidas
- Orquestrador Jogo → Sorteio Aleatório: sorteia decisões
- Orquestrador Jogo → Placar Duplas: atualiza placar
- Motor Partida → Adaptador Jogador: consulta jogador
- Adaptador Jogador → Contrato Jogador: invoca jogador
- IAs de Exemplo → Contrato Mesa: lê estado
- IAs de Exemplo → Jogadas: cria jogada
- Motor Partida → Mesa em Jogo: valida jogada
- Motor Partida → Tipos Vitória: classifica batida
- Motor Partida → Resultado Partida: produz resultado
- Orquestrador Jogo → Resultado Partida: consome resultado
- Orquestrador Jogo → Despachante Eventos: emite eventos
- Motor Partida → Despachante Eventos: emite eventos
- Despachante Eventos → Contrato Eventos: despacha eventos
- Despachante Eventos → Eventos Oniscientes: despacha detalhes
- Logger de Eventos → Eventos Oniscientes: implementa contrato
- Despachante Eventos → Logger de Eventos: notifica logger
- Configuração Domino → Orquestrador Jogo: configura jogo
