-
Notifications
You must be signed in to change notification settings - Fork 0
/
Torneio.java
277 lines (224 loc) · 12.6 KB
/
Torneio.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
import java.util.Scanner;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class Torneio {
private Jogador[] jogadores; //vetor de jogadores
private int numJogadores; //quantidade de jogadores
private static final int capacidadeMax = 10;
public Torneio() { //inicializa o torneio com 0 jogadores e capacidade 10
this.jogadores = new Jogador[capacidadeMax];
this.numJogadores = 0;
}
public void adicionarJogador(Jogador jogador) {
if (numJogadores < jogadores.length) { //verifica se nao excede 10 jogadores
jogadores[numJogadores++] = jogador; //incrementa o indice
System.out.println("Jogador " + jogador.getId() + " adicionado.");
} else {
System.out.println("Não é possível adicionar mais jogadores.");
}
}
public void removerJogador(String id) {
for (int i = 0; i< numJogadores; i++) { //percorre o vetor de jogadores
if (jogadores[i].getId().equals(id)) { //se achar o id
jogadores[i] = jogadores[numJogadores -1]; //passa o ultimo jogador para a posicao do jogador removido
jogadores[numJogadores -1] = null; //remove o jogador
numJogadores--; //diminiu o tamanho do vetor
System.out.println("Jogador " + id + " removido com sucesso.");
break;
}
else System.out.println("Jogador " + id + " não encontrado."); //se nao achar, mensagem de erro
}
}
public int getNumeroJogadores() { return numJogadores; }//retorna quantidade de jogadores
public void gravarArquivo() { //cria um arquivo
File arquivo = new File("Arquivo.dat");
try {
FileOutputStream fileOutputStream = new FileOutputStream(arquivo);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(jogadores);
objectOutputStream.flush();
objectOutputStream.close();
fileOutputStream.close();
System.out.println("Dados gravados com sucesso " + arquivo.getName());
} catch (Exception e) {
System.err.println("Erro ao gravar arquivo: " + e);
}
}
public void lerArquivo() { //le um arquivo
File arquivo = new File("Arquivo.dat");
try {
FileInputStream fileInputStream = new FileInputStream(arquivo);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
jogadores = (Jogador[]) objectInputStream.readObject();
numJogadores = jogadores.length; // Atualiza o número de jogadores
objectInputStream.close();
fileInputStream.close();
System.out.println("Dados lidos com sucesso " + arquivo.getName());
} catch (Exception e) {
System.err.println("Erro ao ler arquivo: " + e);
}
}
public void iniciarTorneio() {
int rodadas = 1;
for(int i = 0; i< numJogadores; i++) jogadores[i].setSaldo(100); //inicia o saldo para todos os jogadores em 100 creditos
boolean fimTorneio = false;
boolean temGanhador = false;
Scanner entrada = new Scanner(System.in);
System.out.println("Escolha um jogo");// menu interativo
System.out.println("1 - Jogo de Azar;");
System.out.println("2 - Jogo do Porquinho;");
int op = entrada.nextInt();
entrada.nextLine();
while(!fimTorneio){
System.out.println("Rodada " + rodadas++);
switch (op) {
case 1:
while(!temGanhador) {
int valor = 0;
int numGanhadores = 0; //ganhadores do craps
int[] ganhadores = new int[numJogadores]; //vetor de ganhadores, pode ter mais de um
int indexGanhadores = 0; // indice no vetor
pedirAposta(entrada); //funcao para pedir a aposta dos jogadores
for(int i = 0; i< numJogadores; i++){
if(jogadores[i].getSaldo()>0){ //verifica se tem saldo positivo
jogadores[i].setJogo(2); //adiciona dois dados no jogo
jogadores[i].rolarDados(); //rola os dados
if(jogadores[i].jogoCraps()==1){ //craps retorna 1 caso o jogador ganhe e -1 se ele perde
System.out.println(jogadores[i].getId() + " ganhou");
ganhadores[indexGanhadores++] = i; //adiciona a posicao do jogador ganhador em um vetor de ganhadores
numGanhadores++; //incrementa o numero de ganhadores
temGanhador = true;
} else {
System.out.println(jogadores[i].getId() + " perdeu");
System.out.println();
}
}
}
int maiorAposta = 0;
if(numGanhadores>0){
int numGanhadoresMaiorAposta=0;
for(int i=0; i<numGanhadores; i++) {
int jogadorIndex = ganhadores[i];
int aposta = jogadores[jogadorIndex].getAposta();
if(aposta>maiorAposta) {
maiorAposta = aposta;
numGanhadoresMaiorAposta = 1;
}else numGanhadoresMaiorAposta++;
}
valor = getValor(valor, numGanhadores, ganhadores, maiorAposta);
if(numGanhadoresMaiorAposta>0) {
int premio = valor / numGanhadoresMaiorAposta;
for (int i=0; i<numGanhadores; i++) {
int jogadorIndex = ganhadores[i];
if (jogadores[jogadorIndex].getAposta() == maiorAposta) jogadores[jogadorIndex].setSaldo(premio);
}
}
}else System.out.println("Todos os jogadores perderam :(");
System.out.println("Fim da Rodada");
for(int i = 0; i< numJogadores; i++) { //no final de rodada, imprime o jogador ganhador e o saldo de cada jogador
for (int k=0; k<numGanhadores; k++) {
if (ganhadores[k]==i && jogadores[i].getAposta()==maiorAposta) {
System.out.println("Saldo de " + jogadores[i].getId() + ": " + jogadores[i].getSaldo() + " (Ganhador da Rodada)");
break;
}
else System.out.println("Saldo de " + jogadores[i].getId() + ": " + jogadores[i].getSaldo());
}
}
break;
}
break;
case 2:
temGanhador = false;
while(!temGanhador) {
int valor = 0;
int[] tentativas = new int[numJogadores]; //vetor para guardar o numero de tentativas de cada jogador
pedirAposta(entrada); //pede a aposta de cada jogador humano
for(int i = 0; i< numJogadores; i++){ //jogadores rolam os dados
if(jogadores[i].getSaldo()>0){//verifica se o jogador tem saldo
jogadores[i].setJogo(2);
System.out.println("Jogador " + jogadores[i].getId() + " rolando os dados:");
tentativas[i] = jogadores[i].jogoDoble(); //guarda o numero de tentativas do jogador na posicao correspondente
System.out.println("Valor Atingido");
System.out.println();
}else
jogadores[i].setAposta(0);
}
int menor = Integer.MAX_VALUE;
for(int i = 0; i< numJogadores; i++) if(tentativas[i]<menor && tentativas[i]!=0) menor = tentativas[i]; //acha o menor numero de tentativas entre todos os jogadores
int numGanhadores = 0;
int[] ganhadores = new int[numJogadores];
for(int i = 0; i< numJogadores; i++) if(tentativas[i]==menor) ganhadores[numGanhadores++] = i; //conta quantos jogadores possuem o menor numero de tentativas e guarda a posicao dos ganhadores em um vetor
int maiorAposta = getMaiorAposta(numGanhadores, ganhadores);
valor = getValor(valor, numGanhadores, ganhadores, maiorAposta);
if(numGanhadores>0) {
int premio = valor/numGanhadores; //distribui o premio entre os ganhadores
for(int i=0; i<numGanhadores; i++) if(jogadores[ganhadores[i]].getAposta()==maiorAposta) jogadores[ganhadores[i]].setSaldo(premio);
}
temGanhador = true;
System.out.println("*Fim da Rodada*");
for (int i = 0; i< numJogadores; i++) { //cada fim de rodada, imprime o saldo e o numero de tentativas dos jogadores ativos
if(tentativas[i]!=0){
System.out.println("Total de tentativas de " + jogadores[i].getId() + ": " + tentativas[i]);
System.out.println("Saldo de " + jogadores[i].getId() + ": " + jogadores[i].getSaldo());
}
}
for (int i = 0; i< numJogadores; i++) for(int k=0; k<numGanhadores; k++) if(i==ganhadores[k] && jogadores[ganhadores[k]].getAposta()==maiorAposta) System.out.println("-->Ganhador da rodada: " + jogadores[i].getId());
break;
}
break;
}
int jogadoresAtivos = 0;
for(int i = 0; i< numJogadores; i++) if(jogadores[i].getSaldo()>0) jogadoresAtivos++; //verifica quantos jogadores ativos ainda restam no torneio
if(jogadoresAtivos==1){
fimTorneio = true; //fim do Torneio com apenas 1 jogador restante
rodadas = rodadas-1;
System.out.println("Resultado Final"); //resultado final do torneio
System.out.println("Rodadas jogadas: " + rodadas); //imprime a quantidade de rodadas totais
for (int i = 0; i < numJogadores; i++) System.out.println(jogadores[i].getSaldo() > 0 ? "Saldo de " + jogadores[i].getId() + ": " + jogadores[i].getSaldo() + "(Ganhador)" : "Saldo de " + jogadores[i].getId() + ": " + jogadores[i].getSaldo());
}
}
}
public void pedirAposta(Scanner sc) { // pede a aposta dos jogadores humanos
for(int i = 0; i< numJogadores; i++){
if(jogadores[i].getSaldo()>0) {
if (jogadores[i].getHumano()){
System.out.printf("valor da aposta de " + jogadores[i].getId() + ": ");
int aposta = sc.nextInt();
sc.nextLine();
jogadores[i].setAposta(aposta);
}
}
}
}
public int getValor(int valor, int numGanhadores, int[] ganhadores, int maiorAposta) {
for(int i = 0; i< numJogadores; i++) {
boolean isGanhador = false;
for(int k=0; k<numGanhadores; k++) {
if(ganhadores[k]==i && jogadores[i].getAposta()==maiorAposta) {
isGanhador = true;
break;
}
}
if(!isGanhador && jogadores[i].getSaldo()>0) {
jogadores[i].atualizaSaldo();
valor += jogadores[i].getAposta();
}
}
return valor;
}
private int getMaiorAposta(int numGanhadores, int[] ganhadores) {
int maiorAposta = 0;
for(int i = 0; i< numGanhadores; i++){
int jogadorIndex = ganhadores[i];
int aposta = jogadores[jogadorIndex].getAposta();
if(aposta>maiorAposta)
maiorAposta = aposta;
else
break;
}
return maiorAposta;
}
}