-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathturno.c
278 lines (245 loc) · 11.9 KB
/
turno.c
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
278
// Inclui todas as funcionalidades dos Turnos
#include "turno.h"
// Iniciar o jogo | Contem a Tela de Derrota e Vitoria
int iniciarJogo(Fase** faseAtual, Carta** cartas)
{
clearScreen();
while(fimDeJogo == 0 && hpJogador > 0) // Loop principal do jogo
{
jogarTurno(faseAtual, cartas);
}
if(hpJogador <= 0) // Verificar se o jogador morreu
{
printf("Voce morreu!\n");
telaDerrota();
}
if(fimDeJogo == 1) // Verificar se o jogador venceu
{
telaVitoria();
}
// Registrar o highscore do jogador
registrarHighScore(nomeJogador, dificuldade, (*faseAtual)->nivelFase, numTurno, hpJogador);
printf("Deseja jogar novamente? [1]SIM ou [2]NAO: ");
int escolha;
scanf("%d", &escolha);
return escolha;
}
// Jogar o turno (Loop principal do jogo)
void jogarTurno(Fase** faseAtual, Carta** cartas)
{
while(turnoFinalizado == 0)
{
verificarMonstroVivo(*faseAtual); // Verificar se algum monstro morreu
ordenarMonstrosPorHP(&((*faseAtual)->monstros)); // Ordenar os monstros por HP
definirIntencoesMonstros((*faseAtual)->monstros); // Definir as intenções dos monstros
printf("\033[4mFase Atual: %d\033[0m\n", (*faseAtual)->nivelFase); // Mostrar a fase atual
mostrarInformacoesTurnoJogador(cartas); // Mostrar as informações do jogador
mostrarInformacoesTurnoMonstros(*faseAtual); // Mostrar as informações dos monstros
escolherEJogarCarta(*faseAtual, cartas); // Escolher e jogar uma carta
if((*faseAtual)->monstros == NULL)
{
if((*faseAtual)->nivelFase == 3)
{
fimDeJogo = 1; // Marcar como fim de jogo se todos os monstros da ultima fase foram derrotados
break; // Sair do loop do turno
}
else
{
*faseAtual = (*faseAtual)->proxima; // Avançar para a proxima fase se todos os monstros morreram
resetarDefesaMonstros((*faseAtual)->monstros); // Resetar a defesa dos monstros para a proxima fase
}
}
}
finalizarTurno((*faseAtual)->monstros); // Finalizar o turno
resetarEstadoCartas(cartas, numCartasBaralho); // Resetar o estado das cartas para o proximo turno
if((*faseAtual)->nivelFase == 3 && (*faseAtual)->monstros == NULL)
{
fimDeJogo = 1;
}
}
// Finaliza o turno e aplica as açoes dos monstros
void finalizarTurno(Monstro* listaMonstros)
{
Monstro* monstroAtual = listaMonstros;
while (monstroAtual != NULL)
{
monstroAtual->defesa = 0; // Resetar a defesa do monstro para o proximo turno
if(monstroAtual->acao == ATAQUEMONSTRO) // Se o monstro escolheu atacar
{
if (defesaJogador > 0) // Verificar se o jogador tem escudo para se defender
{
int danoAplicado = min(defesaJogador, monstroAtual->danoAtaqueMonstro); // Verificar se a defesa do jogador e maior que o dano do monstro
defesaJogador -= danoAplicado; // Reduzir a defesa do jogador
if (monstroAtual->danoAtaqueMonstro > danoAplicado) // Verificar se o dano do monstro e maior que a defesa do jogador
{
hpJogador -= (monstroAtual->danoAtaqueMonstro - danoAplicado); // Aplicar o dano restante ao HP
}
}
else
{
hpJogador -= monstroAtual->danoAtaqueMonstro; // Aplicar o dano direto ao HP do jogador se ele nao tiver escudo
}
}
else if(monstroAtual->acao == DEFESAMONSTRO)
{
monstroAtual->defesa = monstroAtual->defesaParaAdicionarMonstro; // Adicionar a defesa do monstro
}
monstroAtual->intencaoDefinida = 0; // Resetar a variavel de controle para o proximo turno
monstroAtual->acao = DEFAULTMONSTRO; // Resetar a açao do monstro para o proximo turno
monstroAtual = monstroAtual->proximo; // Avançar para o proximo monstro
}
energiaJogador = 3; // Restaurar a energia do jogador ao finalizar o turno
defesaJogador = 0; // Zerar a defesa do jogador para o proximo turno
numTurno++; // Incrementar o numero do turno
turnoFinalizado = 0; // Resetar a variavel de controle para o proximo turno
clearScreen(); // Limpar a tela
}
// Mostra as informações do jogador no turno atual
void mostrarInformacoesTurnoJogador(Carta** cartas)
{
printf("\033[4mTurno Atual: %d\033[0m\n", numTurno); // Mostrar o turno atual
printf("\033[1;42mHP do Jogador: %d\033[0m\n", hpJogador); // Mostrar o HP do jogador
printf("\033[1;44mEnergia: %d\033[0m\n", energiaJogador); // Mostrar a energia do jogador
printf("\033[1;43mEscudos: %d\033[0m\n", defesaJogador); // Mostrar a defesa do jogador
printf("================================== / / / / ==================================\n\n");
printf("\033[1;7;44mSuas Cartas:\033[0m\n");
for (int i = 0; i < 6; i++)
{
// Mostrar as cartas do jogador com cores diferentes para cada ação e com uma cor diferente se a carta ja foi jogada no turno atual
printf("[%d] %s \033[1;46mEnergia: %d\033[0m Desc.: %s",
i+1,
cartas[i]->nome,
cartas[i]->energia,
cartas[i]->descricao);
if (cartas[i]->jaJogada) // Mostrar uma mensagem se a carta ja foi jogada no turno atual
{
printf(" - \033[1;41m(Carta Jogada)\033[0m");
}
printf("\n");
}
printf("\n================================== / / / / ==================================\n");
}
// Mostra as informações dos monstros no turno atual
void mostrarInformacoesTurnoMonstros(Fase* faseAtual)
{
printf("\033[1;45m| Monstros: |\033[0m\n\n");
Monstro* monstroAtual = faseAtual->monstros;
while (monstroAtual != NULL)
{
printf("\033[1;45m%s\033[0m \033[1;7;41m|HP: %d|\033[0m \033[1;7;43m|Escudos: %d|\033[0m\n", monstroAtual->nome, monstroAtual->hp, monstroAtual->defesa);
// Mostrar a açao do monstro com cores diferentes para cada ação
if(monstroAtual->acao == 1)
{
printf("%s, vai atacar com \033[1;41m%d de dano!\033[0m\n\n", monstroAtual->nome, monstroAtual->danoAtaqueMonstro);
}
else
{
printf("%s, vai defender com \033[1;44m%d de defesa!\033[0m\n\n", monstroAtual->nome, monstroAtual->defesaParaAdicionarMonstro);
}
monstroAtual = monstroAtual->proximo;
}
}
// Recebe o input do jogador e joga a carta escolhida
void escolherEJogarCarta(Fase* faseAtual, Carta** cartas)
{
int escolha;
printf("Escolha uma carta para jogar (1-6) OU [7] Para encerrar o turno: ");
scanf("%d", &escolha);
if (escolha < 1 || escolha > 7) // Verificar se a escolha e valida
{
clearScreen();
printf("\033[1;41mEscolha invalida! Tente novamente.\033[0m\n");
return;
}
if(escolha == 7) // Encerra o turno
{
turnoFinalizado = 1;
return;
}
if(faseAtual->monstros == NULL) // Passa o turno mesmo o player apertando outro numero que nao seja 7 apos todos os monstros morrerem
{
turnoFinalizado = 1;
return;
}
Carta* cartaEscolhida = cartas[escolha - 1];
jogarCarta(cartaEscolhida, faseAtual->monstros, faseAtual); // Jogar a carta escolhida e aplicar suas consequencias
printf("\033[1;43m================================== FIM das Consequencias das suas acoes ==================================\033[0m\n");
}
// Jogar uma carta e aplciar suas consequencias
void jogarCarta(Carta* carta, Monstro* monstro, Fase* faseAtual)
{
if(carta->jaJogada == 1) // Verificar se a carta ja foi jogada
{
clearScreen();
printf("\033[1;43m================================== Consequencias das suas acoes ==================================\033[0m\n");
printf("Voce ja jogou esta carta!\n");
return;
}
clearScreen();
printf("\033[1;43m================================== Consequencias das suas acoes ==================================\033[0m\n");
Monstro* monstroAtual = faseAtual->monstros;
if (energiaJogador >= carta->energia)
{
energiaJogador -= carta->energia;
printf("Voce jogou a carta %s!\n", carta->nome); // Mostrar o nome da carta jogada
switch (carta->acao) // Aplicar as consequencias da carta jogada
{
case ATAQUESING: // Ataque de alvo unico
if (monstro->defesa > 0) // Verificar se o monstro tem escudo para se defender antes de aplicar o dano
{
int danoRestante = carta->quantidadeAcao - monstro->defesa; // Verificar se a defesa do monstro e maior que o dano da carta
monstro->defesa = max(0, monstro->defesa - carta->quantidadeAcao); // Reduzir a defesa do monstro
monstro->hp = max(monstro->hp, monstro->hp - danoRestante); // Verificar se o dano da carta e maior que a defesa do monstro
if (danoRestante > 0)
{
monstro->hp = max(0, monstro->hp - danoRestante); // Aplicar o dano restante ao HP do monstro
}
}
else
{
monstro->hp = max(0, monstro->hp - carta->quantidadeAcao); // Aplicar o dano direto ao HP do monstro se ele nao tiver escudo
}
printf("\033[4;41mVoce causou %d de dano ao monstro %s!\033[0m\n", carta->quantidadeAcao, monstro->nome);
break;
case ATAQUEMULT: // Ataque com multiplos alvos
while (monstroAtual != NULL)
{
if (monstroAtual->defesa > 0) // Verificar se o monstro tem escudo para se defender antes de aplicar o dano
{
int danoRestante = carta->quantidadeAcao - monstroAtual->defesa; // Verificar se a defesa do monstro e maior que o dano da carta
monstroAtual->defesa = max(0, monstroAtual->defesa - carta->quantidadeAcao); // Reduzir a defesa do monstro
if (danoRestante > 0)
{
monstroAtual->hp = max(0, monstroAtual->hp - danoRestante); // Aplicar o dano restante ao HP do monstro
printf("Voce causou %d de dano ao monstro %s!\n", danoRestante, monstroAtual->nome); // Mostrar o nome do monstro que foi atacado
}
else
{
printf("Voce atingiu a defesa do monstro %s!\n", monstroAtual->nome); // Mostrar o nome do monstro que foi atacado
}
}
else
{
monstroAtual->hp = max(0, monstroAtual->hp - carta->quantidadeAcao); // Aplicar o dano direto ao HP do monstro se ele nao tiver escudo
printf("Voce causou %d de dano ao monstro %s!\n", carta->quantidadeAcao, monstroAtual->nome); // Mostrar o nome do monstro que foi atacado
}
monstroAtual = monstroAtual->proximo;
}
break;
case DEFESA: // Gera escudo para o jogador
defesaJogador += carta->quantidadeAcao;
break;
case CURA: // Cura o jogador
hpJogador += carta->quantidadeAcao;
break;
default: // Acao desconhecida
printf("Acao desconhecida!\n");
break;
}
}
else
{
printf("Energia insuficiente para jogar esta carta!\n");
}
carta->jaJogada = 1;
}