Skip to content

Commit 83d5a54

Browse files
Mais exercicios do curso de Java
1 parent 754539f commit 83d5a54

18 files changed

+627
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
bin
1+
bin
2+
.DS_Store

campo-minado-swing/.classpath

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<classpath>
3+
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-12">
4+
<attributes>
5+
<attribute name="module" value="true"/>
6+
</attributes>
7+
</classpathentry>
8+
<classpathentry kind="src" path="src"/>
9+
<classpathentry kind="output" path="bin"/>
10+
</classpath>

campo-minado-swing/.project

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<projectDescription>
3+
<name>campo-minado-swing</name>
4+
<comment></comment>
5+
<projects>
6+
</projects>
7+
<buildSpec>
8+
<buildCommand>
9+
<name>org.eclipse.jdt.core.javabuilder</name>
10+
<arguments>
11+
</arguments>
12+
</buildCommand>
13+
</buildSpec>
14+
<natures>
15+
<nature>org.eclipse.jdt.core.javanature</nature>
16+
</natures>
17+
</projectDescription>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
eclipse.preferences.version=1
2+
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3+
org.eclipse.jdt.core.compiler.codegen.targetPlatform=12
4+
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
5+
org.eclipse.jdt.core.compiler.compliance=12
6+
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
7+
org.eclipse.jdt.core.compiler.debug.localVariable=generate
8+
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
9+
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
10+
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
11+
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
12+
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
13+
org.eclipse.jdt.core.compiler.release=enabled
14+
org.eclipse.jdt.core.compiler.source=12
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package br.com.cod3r.cm.modelo;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class Campo {
7+
8+
private final int linha;
9+
private final int coluna;
10+
11+
private boolean aberto = false;
12+
private boolean minado = false;
13+
private boolean marcado = false;
14+
15+
private List<Campo> vizinhos = new ArrayList<>();
16+
private List<CampoObservador> observadores = new ArrayList<>();
17+
18+
Campo(int linha, int coluna) {
19+
this.linha = linha;
20+
this.coluna = coluna;
21+
}
22+
23+
public void registrarObservador(CampoObservador observador) {
24+
observadores.add(observador);
25+
}
26+
27+
private void notificarObservadores(CampoEvento evento) {
28+
observadores.stream()
29+
.forEach(o -> o.eventoOcorreu(this, evento));
30+
}
31+
32+
boolean adicionarVizinho(Campo vizinho) {
33+
boolean linhaDiferente = linha != vizinho.linha;
34+
boolean colunaDiferente = coluna != vizinho.coluna;
35+
boolean diagonal = linhaDiferente && colunaDiferente;
36+
37+
int deltaLinha = Math.abs(linha - vizinho.linha);
38+
int deltaColuna = Math.abs(coluna - vizinho.coluna);
39+
int detalGeral = deltaColuna + deltaLinha;
40+
41+
if(detalGeral == 1 && !diagonal) {
42+
vizinhos.add(vizinho);
43+
return true;
44+
} else if(detalGeral == 2 && diagonal) {
45+
vizinhos.add(vizinho);
46+
return true;
47+
} else {
48+
return false;
49+
}
50+
}
51+
52+
public void alternarMarcacao() {
53+
if(!aberto) {
54+
marcado = !marcado;
55+
56+
if(marcado) {
57+
notificarObservadores(CampoEvento.MARCAR);
58+
} else {
59+
notificarObservadores(CampoEvento.DESMARCAR);
60+
}
61+
}
62+
}
63+
64+
public boolean abrir() {
65+
66+
if(!aberto && !marcado) {
67+
if(minado) {
68+
notificarObservadores(CampoEvento.EXPLODIR);
69+
return true;
70+
}
71+
72+
setAberto(true);
73+
74+
if(vizinhancaSegura()) {
75+
vizinhos.forEach(v -> v.abrir());
76+
}
77+
78+
return true;
79+
} else {
80+
return false;
81+
}
82+
}
83+
84+
public boolean vizinhancaSegura() {
85+
return vizinhos.stream().noneMatch(v -> v.minado);
86+
}
87+
88+
void minar() {
89+
minado = true;
90+
}
91+
92+
public boolean isMinado() {
93+
return minado;
94+
}
95+
96+
public boolean isMarcado() {
97+
return marcado;
98+
}
99+
100+
void setAberto(boolean aberto) {
101+
this.aberto = aberto;
102+
103+
if(aberto) {
104+
notificarObservadores(CampoEvento.ABRIR);
105+
}
106+
}
107+
108+
public boolean isAberto() {
109+
return aberto;
110+
}
111+
112+
public boolean isFechado() {
113+
return !isAberto();
114+
}
115+
116+
public int getLinha() {
117+
return linha;
118+
}
119+
120+
public int getColuna() {
121+
return coluna;
122+
}
123+
124+
boolean objetivoAlcancado() {
125+
boolean desvendado = !minado && aberto;
126+
boolean protegido = minado && marcado;
127+
return desvendado || protegido;
128+
}
129+
130+
public int minasNaVizinhanca() {
131+
return (int) vizinhos.stream().filter(v -> v.minado).count();
132+
}
133+
134+
void reiniciar() {
135+
aberto = false;
136+
minado = false;
137+
marcado = false;
138+
notificarObservadores(CampoEvento.REINICIAR);
139+
}
140+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package br.com.cod3r.cm.modelo;
2+
3+
public enum CampoEvento {
4+
5+
ABRIR, MARCAR, DESMARCAR, EXPLODIR, REINICIAR
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package br.com.cod3r.cm.modelo;
2+
3+
@FunctionalInterface
4+
public interface CampoObservador {
5+
6+
public void eventoOcorreu(Campo campo, CampoEvento evento);
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package br.com.cod3r.cm.modelo;
2+
3+
public class ResultadoEvento {
4+
5+
private final boolean ganhou;
6+
7+
public ResultadoEvento(boolean ganhou) {
8+
this.ganhou = ganhou;
9+
}
10+
11+
public boolean isGanhou() {
12+
return ganhou;
13+
}
14+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package br.com.cod3r.cm.modelo;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.function.Consumer;
6+
import java.util.function.Predicate;
7+
8+
public class Tabuleiro implements CampoObservador {
9+
10+
private final int linhas;
11+
private final int colunas;
12+
private final int minas;
13+
14+
private final List<Campo> campos = new ArrayList<>();
15+
private final List<Consumer<ResultadoEvento>> observadores = new ArrayList<>();
16+
17+
public Tabuleiro(int linhas, int colunas, int minas) {
18+
this.linhas = linhas;
19+
this.colunas = colunas;
20+
this.minas = minas;
21+
22+
gerarCampos();
23+
associarVizinhos();
24+
sortearMinas();
25+
}
26+
27+
public void paraCadaCampo(Consumer<Campo> funcao) {
28+
campos.forEach(funcao);
29+
}
30+
31+
public void registrarObservador(Consumer<ResultadoEvento> observador) {
32+
observadores.add(observador);
33+
}
34+
35+
private void notificarObservadores(boolean resultado) {
36+
observadores.stream().forEach(o -> o.accept(new ResultadoEvento(resultado)));
37+
}
38+
39+
public void abrir(int linha, int coluna) {
40+
campos.parallelStream().filter(c -> c.getLinha() == linha && c.getColuna() == coluna).findFirst()
41+
.ifPresent(c -> c.abrir());
42+
}
43+
44+
public void alternarMarcacao(int linha, int coluna) {
45+
campos.parallelStream().filter(c -> c.getLinha() == linha && c.getColuna() == coluna).findFirst()
46+
.ifPresent(c -> c.alternarMarcacao());
47+
}
48+
49+
private void gerarCampos() {
50+
for (int linha = 0; linha < linhas; linha++) {
51+
for (int coluna = 0; coluna < colunas; coluna++) {
52+
Campo campo = new Campo(linha, coluna);
53+
campo.registrarObservador(this);
54+
campos.add(campo);
55+
}
56+
}
57+
}
58+
59+
private void associarVizinhos() {
60+
for (Campo c1 : campos) {
61+
for (Campo c2 : campos) {
62+
c1.adicionarVizinho(c2);
63+
}
64+
}
65+
}
66+
67+
private void sortearMinas() {
68+
long minasArmadas = 0;
69+
Predicate<Campo> minado = c -> c.isMinado();
70+
71+
do {
72+
int aleatorio = (int) (Math.random() * campos.size());
73+
campos.get(aleatorio).minar();
74+
minasArmadas = campos.stream().filter(minado).count();
75+
} while (minasArmadas < minas);
76+
}
77+
78+
public boolean objetivoAlcancado() {
79+
return campos.stream().allMatch(c -> c.objetivoAlcancado());
80+
}
81+
82+
public void reiniciar() {
83+
campos.stream().forEach(c -> c.reiniciar());
84+
sortearMinas();
85+
}
86+
87+
public int getLinhas() {
88+
return linhas;
89+
}
90+
91+
public int getColunas() {
92+
return colunas;
93+
}
94+
95+
@Override
96+
public void eventoOcorreu(Campo campo, CampoEvento evento) {
97+
if (evento == CampoEvento.EXPLODIR) {
98+
mostrarMinas();
99+
notificarObservadores(false);
100+
} else if (objetivoAlcancado()) {
101+
notificarObservadores(true);
102+
}
103+
}
104+
105+
private void mostrarMinas() {
106+
campos.stream()
107+
.filter(c -> c.isMinado())
108+
.filter(c -> !c.isMarcado())
109+
.forEach(c -> c.setAberto(true));
110+
}
111+
}

0 commit comments

Comments
 (0)