jogo21 project

This commit is contained in:
Gabriel Franco 2026-08-31 10:02:20 -03:00
parent 3a67dd5e6a
commit dde5d48c40
17 changed files with 387 additions and 7 deletions

View file

@ -49,7 +49,7 @@ public class ContaCorrenteComExtrato {
if (valor <= 0) { if (valor <= 0) {
throw new IllegalArgumentException("Valor do depósito deve ser positivo."); 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++; extratoIdx++;
saldo += valor; saldo += valor;
} }
@ -64,7 +64,7 @@ public class ContaCorrenteComExtrato {
if (valor >= saldo) { if (valor >= saldo) {
throw new IllegalArgumentException("Saldo insuficiente."); throw new IllegalArgumentException("Saldo insuficiente.");
} }
extrato[extratoIdx] = new Operacao(LocalDate.now(), "RETIRADA", valor); extrato[extratoIdx] = new Operacao(LocalDate.now(), TipoOperacao.RETIRADA, valor);
extratoIdx++; extratoIdx++;
saldo -= valor; saldo -= valor;
} }
@ -85,7 +85,7 @@ public class ContaCorrenteComExtrato {
if (!contaDestino.isAtiva()) { if (!contaDestino.isAtiva()) {
throw new IllegalStateException("Conta destino inativa"); throw new IllegalStateException("Conta destino inativa");
} }
extrato[extratoIdx] = new Operacao(LocalDate.now(), "RETIRADA", valor); extrato[extratoIdx] = new Operacao(LocalDate.now(), TipoOperacao.RETIRADA, valor);
extratoIdx++; extratoIdx++;
// Faz a transferencia // Faz a transferencia
saldo -= valor; saldo -= valor;
@ -124,7 +124,8 @@ public class ContaCorrenteComExtrato {
Operacao op = extrato[i]; Operacao op = extrato[i];
if (op != null && op.getData().getYear() == ano && op.getData().getMonthValue() == mes) { if (op != null && op.getData().getYear() == ano && op.getData().getMonthValue() == mes) {
String dataFormatada = op.getData().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")); 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"; + "\n";
} }

View file

@ -4,12 +4,15 @@ import java.time.LocalDate;
public class Operacao { public class Operacao {
private LocalDate data; private LocalDate data;
private String tipo; private TipoOperacao tipo;
private double valor; private double valor;
public Operacao(LocalDate data, String tipo, double valor) { public Operacao(LocalDate data, TipoOperacao tipo, double valor) {
this.data = data; this.data = data;
this.tipo = tipo; this.tipo = tipo;
if (valor < 0) {
throw new IllegalArgumentException("Valor de operação não pode ser negativo");
}
this.valor = valor; this.valor = valor;
} }
@ -17,7 +20,7 @@ public class Operacao {
return data; return data;
} }
public String getTipo() { public TipoOperacao getTipo() {
return tipo; return tipo;
} }

View file

@ -0,0 +1,5 @@
package com.gabeefranco;
public enum TipoOperacao {
DEPOSITO, RETIRADA
}

1
jogo21/.tool-versions Normal file
View file

@ -0,0 +1 @@
java openjdk-25

BIN
jogo21/Jogo21.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

33
jogo21/README.md Normal file
View file

@ -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
```

59
jogo21/estrutura.puml Normal file
View file

@ -0,0 +1,59 @@
@startuml Jogo21
enum Naipe {
OUROS
PAUS
COPAS
ESPADAS
}
class Carta {
-naipe:Naipe
-numero:int
-valor:int
}
class Baralho {
-cartas:List<Carta>
+embaralhar()void
+distribuir(destino: Mao)Carta
}
class Mao {
-cartas:List<Carta>
+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<Jogador>
-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

58
jogo21/pom.xml Normal file
View file

@ -0,0 +1,58 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gabeefranco</groupId>
<artifactId>jogo21</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.release>25</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JUnit Jupiter para testes unitários -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Compilação com Java 25 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>25</release>
</configuration>
</plugin>
<!-- Execução dos testes JUnit -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<useModulePath>false</useModulePath>
</configuration>
</plugin>
<!-- Execução da classe principal -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
</project>

1
jogo21/run.sh Executable file
View file

@ -0,0 +1 @@
mvn exec:java -Dexec.mainClass="com.gabeefranco.jogo21.App"

View file

@ -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();
}
}
}

View file

@ -0,0 +1,20 @@
package com.gabeefranco.jogo21;
import java.util.*;
public class Baralho {
private final List<Carta> 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);
}
}

View file

@ -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;
}
}

View file

@ -0,0 +1,54 @@
package com.gabeefranco.jogo21;
import java.util.*;
public class Jogador {
private final String nome;
private final List<Carta> 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 + ")";
}
}

View file

@ -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);
}
}
}

View file

@ -0,0 +1,5 @@
package com.gabeefranco.jogo21;
public enum Naipe {
OUROS, PAUS, COPAS, ESPADAS
}

View file

@ -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;
}
}

View file

@ -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.");
}
}