Catalog · How the catalog works
pascal-chess
Estudo de caso de um jogo de xadrez em Object Pascal (Delphi/Lazarus), explorando Design Patterns e arquitetura MVC.
- ★ 1 on GitHub
Anyone may press Interesting, signed in or not. It helps others find this project.
README

Delphi Pascal Chess
Visão Geral
Pascal Chess é um estudo de caso de desenvolvimento de um jogo de xadrez em Object Pascal. O projeto une uma aplicação desktop (Delphi/Lazarus) a um pequeno servidor HTTP escrito em Node.js, permitindo partidas online e armazenamento do estado do jogo.
Criado para praticar e ensinar o uso de Design Patterns, o projeto demonstra diferentes padrões de projeto aplicados no contexto de um jogo de xadrez. Por ser um estudo e evitar dependências de pacotes de terceiros, a comunicação com o servidor é feita apenas via HTTP simples, sem uso de WebSockets.
Estrutura do Projeto
pascal-chess/
├── src/
│ ├── Board/ # Modelo: estado do tabuleiro e regras
│ ├── Controllers/ # Lógica de controle e comunicação
│ ├── Pieces/ # Implementação das peças e estratégias
│ ├── Views/ # Telas (VCL) da aplicação
│ ├── Server/ # Serviço HTTP e fachada Indy
│ └── Utils/ # Utilidades diversas
├── package.json # Script para iniciar o servidor Node
└── README.mdPadrões de Projeto Utilizados
Arquitetura MVC
O código está organizado em camadas de Model, View e Controller. As classes de tabuleiro e peças ficam em src/Board e src/Pieces (Model), as telas VCL em src/Views (View) e a coordenação entre elas em src/Controllers (Controller).
flowchart LR
View[Views] --> Controller[Controllers]
Controller --> Model[Board & Pieces]
Controller --> ServerBuilder – Construção do Tabuleiro
O tabuleiro gráfico é montado passo a passo através do builder TBoardBuilder e auxiliares (TRowBuilder, TSquareBuilder).
classDiagram
class IBoardBuilder
class TBoardBuilder
class TRowBuilder
class TSquareBuilder
IBoardBuilder <|.. TBoardBuilder
TBoardBuilder o--> TRowBuilder
TBoardBuilder o--> TSquareBuilderFactory – Criação de Peças
A criação das peças é centralizada em TPieceFactory, que decide qual classe instanciar de acordo com o tipo solicitado.
classDiagram
class TPieceFactory
class IPiece
class TPawn
class TRook
IPiece <|.. TPawn
IPiece <|.. TRook
TPieceFactory ..> IPiece : new()Strategy – Movimentos das Peças
Cada peça utiliza uma estratégia diferente para calcular movimentos válidos. A classe TPieceBase delega o cálculo para objetos que implementam IStrategy (ex.: TPawnStrategy).
classDiagram
class IPiece
class IStrategy
class TPieceBase
class TPawnStrategy
IPiece <|.. TPieceBase
IStrategy <|.. TPawnStrategy
TPieceBase o--> IStrategyObserver – Atualização de Estado
A sala de jogo (TRoom) notifica observadores sempre que seu estado é alterado, permitindo que as views atualizem a interface em tempo real.
sequenceDiagram
participant Service as TServerService
participant Room as TRoom
participant View as TBoardView
Service->>Room: carrega estado
Room->>View: NotifyAll()Facade – Cliente HTTP Indy
A unidade PC.Indy.Facade encapsula o uso da biblioteca Indy, expondo uma interface simples IHttpClient para o restante da aplicação.
Singleton – Controlador de Sala
TRoomController mantém uma única instância da sala e do jogador atual por meio de variáveis de classe, funcionando como um singleton para acesso global.
Como Usar
-
Servidor HTTP
npm startO comando acima executa
src/Server/server.js, responsável por persistir e recuperar o estado das salas. -
Aplicação Pascal
- Abra o projeto
src/PascalChess.dprem Delphi ou Lazarus. - Compile e execute. A aplicação irá consumir o servidor acima para listar salas, criar partidas e jogar.
- Para rodar localmente, altere a constante
SERVER_ENDPOINTno arquivosrc/Controllers/PC.Room.Controller.pasparahttp://localhost:3000.
- Abra o projeto
Diagramas Extras
Diagrama simplificado do fluxo principal de uma partida:
sequenceDiagram
Player->>Controller: cria ou entra na sala
Controller->>Server: POST /rooms
Controller->>Room: atualiza estado
Room->>View: notifica alterações
Player->>View: interage (movimentos)
View->>Controller: solicita validação
Controller->>Room: atualiza estado e sincronizaTODOs
- Implementar promoção de peões ao atingir a última fileira, permitindo ao jogador escolher a nova peça.
- Adicionar captura en passant.
- Permitir desfazer e refazer movimentos com um histórico de jogadas usando o padrão Command.
- Corrigir a tela exibida quando o tempo do adversário expira, evitando tratá-la como xeque-mate.
- Mostrar na interface as peças capturadas por cada jogador durante a partida.
- Remover dependência recursiva entre estados usando o padrão Prototype para clonagem e validação.
Licença
Distribuído sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.
As imagens e ícones utilizados pertencem a seus respectivos autores e possuem direitos autorais; não são de minha autoria.

