{"id":15035756,"url":"https://github.com/foqsz/xadrez-de-console","last_synced_at":"2025-04-09T23:15:13.128Z","repository":{"id":226422327,"uuid":"768618390","full_name":"Foqsz/xadrez-de-console","owner":"Foqsz","description":"Apresento a vocês um jogo Xadrez desenvolvido utilizando a linguagem de programação C#. Nele foi criado um tabuleiro no terminal esperando inputs dos usuários para realizar jogas de Xadrez, até o fim da partida.","archived":false,"fork":false,"pushed_at":"2024-09-06T14:57:06.000Z","size":81,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T23:15:06.574Z","etag":null,"topics":["chess","chessgame","console","console-applications","console-game","csharp","csharp-code","xadrez"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Foqsz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-07T12:22:38.000Z","updated_at":"2024-09-06T14:57:09.000Z","dependencies_parsed_at":"2024-09-06T17:20:55.251Z","dependency_job_id":null,"html_url":"https://github.com/Foqsz/xadrez-de-console","commit_stats":null,"previous_names":["foqsz/xadrez-de-console"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foqsz%2Fxadrez-de-console","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foqsz%2Fxadrez-de-console/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foqsz%2Fxadrez-de-console/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foqsz%2Fxadrez-de-console/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Foqsz","download_url":"https://codeload.github.com/Foqsz/xadrez-de-console/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248125591,"owners_count":21051770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chess","chessgame","console","console-applications","console-game","csharp","csharp-code","xadrez"],"created_at":"2024-09-24T20:29:24.699Z","updated_at":"2025-04-09T23:15:13.107Z","avatar_url":"https://github.com/Foqsz.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Xadrez de Console\n![image](https://github.com/Foqsz/xadrez-de-console/assets/96602671/20a935c2-7412-40e7-be7c-9c18a6386ada)\n\n## Índice\n1. [Sobre o projeto](#sobre-o-projeto)\n2. [Sobre o tabuleiro](#sobre-o-tabuleiro)\n3. [Impressão do tabuleiro no console](#impressão-do-tabuleiro-no-console)\n4. [A exceção tabuleiroException](#a-exceção-tabuleiroexception)\n5. [Sobre as peças](#sobre-as-peças)\n6. [Peças presentes no tabuleiro](#peças-presentes-no-tabuleiro)\n7. [Método para colocar as peças no tabuleiro](#método-para-colocar-as-peças-no-tabuleiro)\n8. [Como foi criada a restrição de movimento para cada peça](#como-foi-criada-a-restrição-de-movimento-para-cada-peça)\n9. [Validar posição de origem](#validar-posição-de-origem)\n10. [Validar posição de destino](#validar-posição-de-destino)\n11. [Jogadas especiais](#jogadas-especiais) \n12. [Contato](#contato)\n\n## Sobre o projeto\nEste projeto foi feito durante o curso de C# ministrado por Nélio Alves. O objetivo central é empregar os conhecimentos adquiridos na linguagem C# para desenvolver um jogo de Xadrez funcional que possa ser executado via console. Embora possa parecer uma tarefa simples à primeira vista, a complexidade subjacente a este projeto é significativa.\n\n## Sobre o tabuleiro\n### Impressão do tabuleiro no console\nA impressão do tabuleiro foi uma parte simples, porém essencial, do projeto. Utilizou-se um loop for para criar uma representação visual do tabuleiro no console, composta por um padrão de \"-\" com espaços entre eles, formando um tabuleiro de oito por oito casas, totalizando sessenta e quatro espaços, conforme o tamanho padrão de um tabuleiro de Xadrez.\n\n```csharp\n        public static void imprimirTabuleiro(Tabuleiro tab, bool[,] posicoesPossiveis)\n        {\n\n            ConsoleColor fundoOriginal = Console.BackgroundColor;\n            ConsoleColor fundoAlterado = ConsoleColor.DarkGray;\n\n            for (int i = 0; i \u003c tab.linhas; i++)\n            {\n                Console.Write(8 - i + \" \");\n                for (int j = 0; j \u003c tab.colunas; j++)\n                {\n                    if (posicoesPossiveis[i, j])\n                    {\n                        Console.BackgroundColor = fundoAlterado;\n                    }\n                    else\n                    {\n                        Console.BackgroundColor = fundoOriginal;\n                    }\n                    imprimirPeca(tab.peca(i, j));\n                    Console.BackgroundColor = fundoOriginal;\n                }\n                Console.WriteLine();\n            }\n            Console.WriteLine(\"  a b c d e f g h\");\n            Console.BackgroundColor = fundoOriginal;\n        }\n```\nCom o resultado final: \n\n![image](https://github.com/Foqsz/xadrez-de-console/assets/96602671/03b08c17-fce7-434d-8007-a4d62facde16)\n\n\u003c!-- Pular linha --\u003e\n---\n\n### A exceção `TabuleiroException`\n\nDurante o desenvolvimento do jogo, foi essencial criar uma exceção específica para lidar com situações em que uma casa inválida é selecionada pelo jogador. Essa exceção é chamada `TabuleiroException`.\n\n#### Exemplos de uso:\n\n- Quando não existe uma peça na posição de origem selecionada:\n```csharp\nthrow new TabuleiroException(\"Não existe peça na posição de origem escolhida!\");\n```\n\n- Quando a peça selecionada não pertence ao jogador atual:\n```csharp\nthrow new TabuleiroException(\"A peça de origem escolhida não é sua!\");      \n```\n\n- Quando não há movimentos possíveis para a peça selecionada:\n```csharp\nthrow new TabuleiroException(\"Atencao: Não há movimentos possíveis para a peça de origem escolhida!\");     \n```\n\n- Quando a posição de destino escolhida é inválida:\n```csharp\nthrow new TabuleiroException(\"Posição de destino inválida!\");\n```\n\n---\n\nEssa exceção é fundamental para manter a integridade e a lógica do jogo, garantindo que o jogador receba feedback adequado caso tente realizar movimentos inválidos.\n\n### Sobre as peças\n\nNo tabuleiro de Xadrez, existem diferentes tipos de peças, cada uma com suas próprias características e movimentos específicos. Abaixo estão as peças presentes no jogo, indicando a quantidade de peças de cada tipo e como são representadas:\n\n- **Rei:** Uma única peça de cada cor (branca e preta), representada pela letra R.\n- **Dama:** Uma única peça de cada cor (branca e preta), representada pela letra D.\n- **Bispo:** Duas peças de cada cor (branca e preta), representadas pela letra B.\n- **Cavalo:** Uma única peça de cada cor (branca e preta), representada pela letra C.\n- **Torre:** Uma única peça de cada cor (branca e preta), representada pela letra T.\n- **Peão:** Oito peças de cada cor (branca e preta), representadas pela letra P.\n\nEssas peças compõem o conjunto básico do Xadrez e cada uma desempenha um papel fundamental na estratégia e na dinâmica do jogo.\n\nImagem do tabuleiro com as peças:\n\n![image](https://github.com/Foqsz/xadrez-de-console/assets/96602671/83be9562-f898-4e11-a456-2d9829a9ae6d)\n\u003c!-- Pular linha --\u003e\n\n### Método para colocar as peças no tabuleiro\n\nDurante o desenvolvimento do jogo de Xadrez em C#, foi implementado um método para colocar novas peças em posições específicas do tabuleiro. Esse método é essencial para configurar o tabuleiro com as peças necessárias para iniciar uma partida.\n\nAqui está o método `colocarNovaPeca`:\n\n```csharp\npublic void colocarNovaPeca(char coluna, int linha, Peca peca)\n{\n    tab.colocarPeca(peca, new PosicaoXadrez(coluna, linha).toPosicao());\n    pecas.Add(peca);\n}\n```\n\nEste método recebe três parâmetros:\n- `coluna`: A coluna onde a peça será colocada, representada por um caractere.\n- `linha`: A linha onde a peça será colocada, representada por um número.\n- `peca`: A peça que será colocada no tabuleiro.\n\nInternamente, o método converte a posição da peça (`coluna` e `linha`) em uma posição de matriz utilizando a classe `PosicaoXadrez` e, em seguida, utiliza o método `colocarPeca` do tabuleiro para colocar a peça na posição desejada. Além disso, a peça é adicionada à lista de peças (`pecas`) para acompanhamento e controle durante a partida.\n\nEsse método é crucial para configurar o tabuleiro com as peças necessárias para iniciar o jogo de Xadrez, permitindo que as partidas sejam inicializadas com qualquer disposição desejada das peças.\n\n#### Funcionamento:\n1. Converte a posição informada (coluna e linha) em uma posição válida do tabuleiro, utilizando a classe `PosicaoXadrez` e seu método `toPosicao()`.\n2. Coloca a peça na posição calculada no passo anterior, utilizando o método `colocarPeca` do objeto `tabuleiro`.\n3. Adiciona a peça à lista de peças (`pecas`).\n\nEste método é essencial para configurar o tabuleiro com as peças corretas antes do início de uma partida de Xadrez.\n\n### Como foi criada a restrição de movimento para cada peça\n\nDurante o desenvolvimento do jogo de Xadrez em C#, foram criados métodos específicos na classe `PartidaXadrez` para validar as posições de origem e destino das peças, aplicando as restrições de movimento adequadas para cada tipo de peça.\n\n#### Método `validarPosicaoDeOrigem`\n\nEste método é responsável por verificar se a posição de origem selecionada pelo jogador é válida para movimentar uma peça. Ele realiza as seguintes verificações:\n\n1. **Posição nula:** Verifica se não há uma peça na posição de origem escolhida.\n\n```csharp\nif (tab.peca(pos) == null)\n{\n    throw new TabuleiroException(\"Não existe peça na posição de origem escolhida!\");\n}\n```\n\n2. **Cor da peça:** Verifica se a peça selecionada pertence ao jogador atual, garantindo que o jogador só possa mover suas próprias peças.\n\n```csharp\nif (jogadorAtual != tab.peca(pos).cor)\n{\n    throw new TabuleiroException(\"A peça na posição de origem escolhida não é sua!\");\n}\n```\n\n3. **Movimentos possíveis:** Verifica se a peça selecionada possui movimentos possíveis. Se não houver movimentos disponíveis para a peça selecionada, uma exceção é lançada.\n\n```csharp\nif (!tab.peca(pos).existeMovimentosPossiveis())\n{\n    throw new TabuleiroException(\"Atencao: Não há movimentos possíveis para a peça de origem escolhida!\");\n}\n```\n\n#### Método `validarPosicaoDeDestino`\n\nEste método é responsável por validar se a posição de destino escolhida pelo jogador é válida para mover a peça selecionada. Ele realiza a seguinte verificação:\n\n1. **Movimento válido:** Verifica se a peça selecionada pode se mover para a posição de destino especificada. Se a peça não puder se mover para a posição de destino, uma exceção é lançada.\n\n```csharp\nif (!tab.peca(origem).movimentoPossivel(destino))\n{\n  throw new TabuleiroException(\"Posição de destino inválida!\");\n}\n```\n\nEsses métodos garantem que as peças só possam ser movidas de acordo com as regras do jogo de Xadrez, mantendo a integridade e a lógica do jogo durante as partidas.\n\n### Jogadas especiais\n\nNeste tópico, serão detalhadas as jogadas especiais implementadas no jogo de Xadrez em C#.\n\n1. **Roque Pequeno:** O roque pequeno ocorre quando o rei e uma torre ainda não se moveram na partida, e entre eles existem duas casas vazias. O código para esta jogada especial é o seguinte:\n\n    ```csharp\n            // #jogadaespecial roque pequeno\n            if (p is Rei \u0026\u0026 destino.coluna == origem.coluna + 2)\n            {\n                Posicao origemT = new Posicao(origem.linha, origem.coluna + 3);\n                Posicao destinoT = new Posicao(origem.linha, origem.coluna + 1);\n                Peca T = tab.retirarPeca(origemT);\n                T.incrementarQteMovimentos();\n                tab.colocarPeca(T, destinoT);\n            }\n    ```\n\n2. **Roque Grande:** O roque grande ocorre quando o rei e uma torre ainda não se moveram na partida, e entre eles existem quatro casas vazias. O código para esta jogada especial é o seguinte:\n\n    ```csharp\n            // #jogadaespecial roque grande\n            if (p is Rei \u0026\u0026 destino.coluna == origem.coluna - 2)\n            {\n                Posicao origemT = new Posicao(origem.linha, origem.coluna - 4);\n                Posicao destinoT = new Posicao(origem.linha, origem.coluna - 1);\n                Peca T = tab.retirarPeca(origemT);\n                T.incrementarQteMovimentos();\n                tab.colocarPeca(T, destinoT);\n            }\n    ```\n\n3. **En Passant:** O En Passant ocorre quando um peão adversário avança duas casas em seu primeiro movimento para evitar um confronto com um peão avançado. Um peão pode realizar a captura do peão adversário da mesma forma. O código para esta jogada especial é o seguinte:\n\n    ```csharp\n            //#jogadaespecial en passant\n\n            if (p is Peao)\n            {\n                if (origem.coluna != destino.coluna \u0026\u0026 pecaCapturada == null)\n                {\n                    Posicao posP;\n                    if (p.cor == Cor.Branca)\n                    {\n                        posP = new Posicao(destino.linha + 1, destino.coluna);\n                    }\n                    else\n                    {\n                        posP = new Posicao(destino.linha - 1, destino.coluna);\n                    }\n                    pecaCapturada = tab.retirarPeca(posP);\n                    capturadas.Add(pecaCapturada);\n                }\n            } \n    ```\n\n4. **Promoção:** A jogada de promoção ocorre quando um peão alcança a última fileira do tabuleiro adversário. Neste caso, virará uma Dama.\n\n    ```csharp\n            // #jogadaespecial promocao\n            if (p is Peao)\n            {\n                if ((p.cor == Cor.Branca \u0026\u0026 destino.linha == 0) || (p.cor == Cor.Preta \u0026\u0026 destino.linha == 7))\n                {\n                    p = tab.retirarPeca(destino);\n                    pecas.Remove(p);\n                    Peca dama = new Dama(tab, p.cor);\n                    tab.colocarPeca(dama, destino);\n                    pecas.Add(dama);\n                }\n            }\n    ```\n\n## Contato:\n- Email: contatovictorvinicius05@gmail.com\n- LinkedIn: [Victor Vinicius](https://www.linkedin.com/in/victor-vinicius-2a9166255/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoqsz%2Fxadrez-de-console","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoqsz%2Fxadrez-de-console","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoqsz%2Fxadrez-de-console/lists"}