diff --git a/contacorrente/src/main/java/com/gabeefranco/ContaCorrenteComExtrato.java b/contacorrente/src/main/java/com/gabeefranco/ContaCorrenteComExtrato.java index 8058657..7552503 100644 --- a/contacorrente/src/main/java/com/gabeefranco/ContaCorrenteComExtrato.java +++ b/contacorrente/src/main/java/com/gabeefranco/ContaCorrenteComExtrato.java @@ -49,7 +49,7 @@ public class ContaCorrenteComExtrato { if (valor <= 0) { throw new IllegalArgumentException("Valor do depósito deve ser positivo."); } - extrato[extratoIdx] = new Operacao(LocalDate.now(), "DEPOSITO", valor); + extrato[extratoIdx] = new Operacao(LocalDate.now(), TipoOperacao.DEPOSITO, valor); extratoIdx++; saldo += valor; } @@ -64,7 +64,7 @@ public class ContaCorrenteComExtrato { if (valor >= saldo) { throw new IllegalArgumentException("Saldo insuficiente."); } - extrato[extratoIdx] = new Operacao(LocalDate.now(), "RETIRADA", valor); + extrato[extratoIdx] = new Operacao(LocalDate.now(), TipoOperacao.RETIRADA, valor); extratoIdx++; saldo -= valor; } @@ -85,7 +85,7 @@ public class ContaCorrenteComExtrato { if (!contaDestino.isAtiva()) { throw new IllegalStateException("Conta destino inativa"); } - extrato[extratoIdx] = new Operacao(LocalDate.now(), "RETIRADA", valor); + extrato[extratoIdx] = new Operacao(LocalDate.now(), TipoOperacao.RETIRADA, valor); extratoIdx++; // Faz a transferencia saldo -= valor; @@ -124,7 +124,8 @@ public class ContaCorrenteComExtrato { Operacao op = extrato[i]; if (op != null && op.getData().getYear() == ano && op.getData().getMonthValue() == mes) { String dataFormatada = op.getData().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")); - resultado += "OPERAÇÃO EM " + dataFormatada + ": TIPO=" + op.getTipo() + ", VALOR=" + op.getValor() + resultado += "OPERAÇÃO EM " + dataFormatada + ": TIPO=" + op.getTipo().toString() + ", VALOR=" + + op.getValor() + "\n"; } diff --git a/contacorrente/src/main/java/com/gabeefranco/Operacao.java b/contacorrente/src/main/java/com/gabeefranco/Operacao.java index 8901e53..ccdad2a 100644 --- a/contacorrente/src/main/java/com/gabeefranco/Operacao.java +++ b/contacorrente/src/main/java/com/gabeefranco/Operacao.java @@ -4,12 +4,15 @@ import java.time.LocalDate; public class Operacao { private LocalDate data; - private String tipo; + private TipoOperacao tipo; private double valor; - public Operacao(LocalDate data, String tipo, double valor) { + public Operacao(LocalDate data, TipoOperacao tipo, double valor) { this.data = data; this.tipo = tipo; + if (valor < 0) { + throw new IllegalArgumentException("Valor de operação não pode ser negativo"); + } this.valor = valor; } @@ -17,7 +20,7 @@ public class Operacao { return data; } - public String getTipo() { + public TipoOperacao getTipo() { return tipo; } diff --git a/contacorrente/src/main/java/com/gabeefranco/TipoOperacao.java b/contacorrente/src/main/java/com/gabeefranco/TipoOperacao.java new file mode 100644 index 0000000..a25cd5b --- /dev/null +++ b/contacorrente/src/main/java/com/gabeefranco/TipoOperacao.java @@ -0,0 +1,5 @@ +package com.gabeefranco; + +public enum TipoOperacao { + DEPOSITO, RETIRADA +} diff --git a/jogo21/.tool-versions b/jogo21/.tool-versions new file mode 100644 index 0000000..054715b --- /dev/null +++ b/jogo21/.tool-versions @@ -0,0 +1 @@ +java openjdk-25 diff --git a/jogo21/Jogo21.png b/jogo21/Jogo21.png new file mode 100644 index 0000000..7b5296e Binary files /dev/null and b/jogo21/Jogo21.png differ diff --git a/jogo21/README.md b/jogo21/README.md new file mode 100644 index 0000000..c3defbb --- /dev/null +++ b/jogo21/README.md @@ -0,0 +1,33 @@ +# jogo21 + +Projeto Maven criado automaticamente com Java 25 e JUnit 5. + +## Requisitos + +- Java 25 +- Maven + +## Como compilar + +```bash +mvn compile +``` + +## Como executar + +```bash +chmod +x run.sh +./run.sh +``` + +## Como executar os testes + +```bash +mvn test +``` + +## Como gerar o pacote + +```bash +mvn package +``` diff --git a/jogo21/estrutura.puml b/jogo21/estrutura.puml new file mode 100644 index 0000000..309b7e8 --- /dev/null +++ b/jogo21/estrutura.puml @@ -0,0 +1,59 @@ +@startuml Jogo21 + +enum Naipe { + OUROS + PAUS + COPAS + ESPADAS +} + +class Carta { + -naipe:Naipe + -numero:int + -valor:int +} + +class Baralho { + -cartas:List + +embaralhar()void + +distribuir(destino: Mao)Carta +} + +class Mao { + -cartas:List + +adicionar(entra: Carta)void + +calcularValor()int + +estaEstourada()boolean +} + +class Jogador { + -nome:String + -mao:Mao + +jogar()void +} + +class Dealer { + -mao:Mao + +jogar()void +} + +class Jogo { + -jogadores:List + -dealer:Dealer + -baralho:Baralho + +iniciar()void + +finalizar()void +} + +Carta --> Naipe +Baralho "1" *-- "*" Carta +Mao "1" *-- "*" Carta +Baralho ..> Mao +Jogo "1" *-- "*" Jogador +Jogo "1" *-- "1" Dealer +Jogo "1" *-- "1" Baralho +Jogador "1" *-- "1" Mao +Dealer "1" *-- "1" Mao + + +@enduml diff --git a/jogo21/pom.xml b/jogo21/pom.xml new file mode 100644 index 0000000..6466d93 --- /dev/null +++ b/jogo21/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.gabeefranco + jogo21 + 1.0-SNAPSHOT + + + 25 + UTF-8 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 25 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + false + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + + diff --git a/jogo21/run.sh b/jogo21/run.sh new file mode 100755 index 0000000..b9220b7 --- /dev/null +++ b/jogo21/run.sh @@ -0,0 +1 @@ +mvn exec:java -Dexec.mainClass="com.gabeefranco.jogo21.App" diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/App.java b/jogo21/src/main/java/com/gabeefranco/jogo21/App.java new file mode 100755 index 0000000..15c3dac --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/App.java @@ -0,0 +1,11 @@ +package com.gabeefranco.jogo21; + +public class App { + private static Mesa mesa = new Mesa(); + + public static void main(String[] args) { + while (true) { + mesa.iniciarRodada(); + } + } +} diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/Baralho.java b/jogo21/src/main/java/com/gabeefranco/jogo21/Baralho.java new file mode 100755 index 0000000..69cb873 --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/Baralho.java @@ -0,0 +1,20 @@ +package com.gabeefranco.jogo21; + +import java.util.*; + +public class Baralho { + private final List cartas = new ArrayList<>(); + + public Baralho() { + for (Naipe n : Naipe.values()) { + for (Valor v : Valor.values()) { + cartas.add(new Carta(n, v)); + } + } + Collections.shuffle(cartas); + } + + public Carta puxarCarta() { + return cartas.remove(0); + } +} diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/Carta.java b/jogo21/src/main/java/com/gabeefranco/jogo21/Carta.java new file mode 100755 index 0000000..b7cd71e --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/Carta.java @@ -0,0 +1,20 @@ +package com.gabeefranco.jogo21; + +public class Carta { + private final Naipe naipe; + private final Valor valor; + + public Carta(Naipe naipe, Valor valor) { + this.naipe = naipe; + this.valor = valor; + } + + public int getPontos() { + return valor.getPontos(); + } + + public String toString() { + return valor + " de " + naipe; + } + +} diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/Jogador.java b/jogo21/src/main/java/com/gabeefranco/jogo21/Jogador.java new file mode 100755 index 0000000..ca95bac --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/Jogador.java @@ -0,0 +1,54 @@ +package com.gabeefranco.jogo21; + +import java.util.*; + +public class Jogador { + private final String nome; + private final List mao = new ArrayList<>(); + private int dinheiro; + + public Jogador(String nome, int dinheiroInicial) { + this.nome = nome; + this.dinheiro = dinheiroInicial; + } + + public void receberCarta(Carta c) { + mao.add(c); + } + + public void limparMao() { + mao.clear(); + } + + public int calcularPontuacao() { + int total = 0; + int ases = 0; + for (Carta c : mao) { + total += c.getPontos(); + if (c.getPontos() == 11) + ases++; + } + while (total > 21 && ases > 0) { + total -= 10; + ases--; + } + return total; + } + + public int getDinheiro() { + return dinheiro; + } + + public void ganharDinheiro(int valor) { + dinheiro += valor; + } + + public void perderDinheiro(int valor) { + dinheiro -= valor; + } + + @Override + public String toString() { + return nome + " -> " + mao + " (Pontuação: " + calcularPontuacao() + ", Dinheiro: $" + dinheiro + ")"; + } +} diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/Mesa.java b/jogo21/src/main/java/com/gabeefranco/jogo21/Mesa.java new file mode 100755 index 0000000..7f8c6f3 --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/Mesa.java @@ -0,0 +1,80 @@ +package com.gabeefranco.jogo21; + +import java.util.Scanner; + +public class Mesa { + private final Baralho baralho; + private final Jogador jogador; + private final Jogador dealer; + private final Scanner sc; + + public Mesa() { + this.baralho = new Baralho(); + this.jogador = new Jogador("Jogador", 100); + this.dealer = new Jogador("Dealer", 0); + this.sc = new Scanner(System.in); + } + + public void iniciarRodada() { + + System.out.println("Você tem $" + jogador.getDinheiro()); + System.out.print("Digite o valor da aposta: "); + int aposta = sc.nextInt(); + sc.nextLine(); + + if (aposta > jogador.getDinheiro()) { + System.out.println("Você não tem dinheiro suficiente!"); + return; + } + + jogador.limparMao(); + dealer.limparMao(); + + // Distribuição inicial + jogador.receberCarta(baralho.puxarCarta()); + jogador.receberCarta(baralho.puxarCarta()); + dealer.receberCarta(baralho.puxarCarta()); + dealer.receberCarta(baralho.puxarCarta()); + + System.out.println(jogador); + System.out.println("Carta visível do dealer: " + dealer.toString().split(",")[0] + "]"); + + // Turno do jogador + while (true) { + System.out.print("Deseja 'h' para hit ou 's' para stand? "); + String acao = sc.nextLine(); + if (acao.equalsIgnoreCase("h")) { + jogador.receberCarta(baralho.puxarCarta()); + System.out.println(jogador); + if (jogador.calcularPontuacao() > 21) { + System.out.println("Você estourou! Dealer vence."); + jogador.perderDinheiro(aposta); + return; + } + } else { + break; + } + } + + // Turno do dealer + while (dealer.calcularPontuacao() < 17) { + dealer.receberCarta(baralho.puxarCarta()); + } + + System.out.println(dealer); + + // Resultado + int pontosJogador = jogador.calcularPontuacao(); + int pontosDealer = dealer.calcularPontuacao(); + + if (pontosDealer > 21 || pontosJogador > pontosDealer) { + System.out.println("Você venceu!"); + jogador.ganharDinheiro(aposta); + } else if (pontosJogador == pontosDealer) { + System.out.println("Empate! A aposta é devolvida."); + } else { + System.out.println("Dealer venceu!"); + jogador.perderDinheiro(aposta); + } + } +} diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/Naipe.java b/jogo21/src/main/java/com/gabeefranco/jogo21/Naipe.java new file mode 100644 index 0000000..40ccc0f --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/Naipe.java @@ -0,0 +1,5 @@ +package com.gabeefranco.jogo21; + +public enum Naipe { + OUROS, PAUS, COPAS, ESPADAS +} diff --git a/jogo21/src/main/java/com/gabeefranco/jogo21/Valor.java b/jogo21/src/main/java/com/gabeefranco/jogo21/Valor.java new file mode 100644 index 0000000..c510518 --- /dev/null +++ b/jogo21/src/main/java/com/gabeefranco/jogo21/Valor.java @@ -0,0 +1,16 @@ +package com.gabeefranco.jogo21; + +public enum Valor { + DOIS(2), TRES(3), QUATRO(4), CINCO(5), SEIS(6), SETE(7), OITO(8), NOVE(9), DEZ(10), + VALETE(10), DAMA(10), REI(10), AS(11); + + private final int pontos; + + private Valor(int pontos) { + this.pontos = pontos; + } + + public int getPontos() { + return pontos; + } +} diff --git a/jogo21/src/test/java/com/gabeefranco/AppTest.java b/jogo21/src/test/java/com/gabeefranco/AppTest.java new file mode 100644 index 0000000..21ff66f --- /dev/null +++ b/jogo21/src/test/java/com/gabeefranco/AppTest.java @@ -0,0 +1,13 @@ +package com.gabeefranco; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class AppTest { + + @Test + void testApp() { + assertTrue(true, "Teste básico de funcionamento."); + } +}