-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
207 lines (176 loc) · 6.28 KB
/
main.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
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
// defines
#define KICKS 10 // número máximo de tentativas
#define MAXIMUM_ERRORS 6 // máximo de erros permitidos
#define SECRET_WORD_SIZE 6 // largura máxima de palavra secreta +1 para '\0'
// procedimentos
void clear_screen();
void welcome_message(); // mensagem de boas-vindas
void word_initializer(char *string_secret); // inicializa a palavra secreta
void letter_mask(char *wordSecret); // substitui caracteres das letras por '-'
void unmasking_word(int index, char *mask, char *str); // desmascara a letra correta
void initializing_letter_mask(char *mask, char *wordSecret); // inicializa a máscara
void show_hud(int errors, int attempts, char *maskString); // mostra o HUD do jogo
void winner_msg(char *string_secret); // mensagem de vitória
void loser_msg(char *string_secret); // mensagem de derrota
void loser_msg_maxAttempts(char *string_secret); // mensagem de derrota por máximo de tentativas
// funções
char* word_secret(); // retorna uma palavra secreta aleatória
void existence_check(char *str, char letter_input, int *indices, int *found_count); // verifica a existência de letras
int main() {
#ifdef _WIN32
system("chcp 65001");
system("cls");
#endif
char stringSecret[SECRET_WORD_SIZE];
char maskString[SECRET_WORD_SIZE];
int attempts = 0, errors = 0, hits = 0;
char inputLetter;
char triedLetters[KICKS] = {0}; // Array para armazenar letras tentadas
int triedCount = 0;
welcome_message();
putchar('\n');
printf("\tPor favor, pressione a tecla ENTER para iniciar o jogo: ");
while (getchar() != '\n');
word_initializer(stringSecret);
initializing_letter_mask(maskString, stringSecret);
do {
clear_screen();
show_hud(errors, attempts, maskString);
// captura da entrada do usuário com validação
printf("Entre com uma letra: => ");
scanf(" %c", &inputLetter);
// Verifica se a entrada é um número
if (isdigit(inputLetter)) {
printf("Erro: Tipo de entrada inválido\n");
return 1;
}
inputLetter = tolower(inputLetter);
// Verificar se a letra já foi tentada
int alreadyTried = 0;
for (int i = 0; i < triedCount; i++) {
if (triedLetters[i] == inputLetter) {
alreadyTried = 1;
printf("Você já tentou a letra '%c'. Tente outra.\n", inputLetter);
break;
}
}
if (alreadyTried) continue;
// Armazena a letra tentada
triedLetters[triedCount++] = inputLetter;
// verifica a letra em todas as ocorrências
int indices[SECRET_WORD_SIZE] = {0}, found_count = 0;
existence_check(stringSecret, inputLetter, indices, &found_count);
if (found_count > 0) {
hits += found_count;
for (int j = 0; j < found_count; j++) {
unmasking_word(indices[j], maskString, stringSecret);
}
if (hits == strlen(stringSecret)) {
clear_screen();
winner_msg(stringSecret);
return 0;
}
} else {
errors++;
if (errors == MAXIMUM_ERRORS) {
clear_screen();
loser_msg(stringSecret);
return 1;
}
}
attempts++;
} while (attempts < KICKS);
clear_screen();
loser_msg_maxAttempts(stringSecret);
return 0;
}
// Funções
void existence_check(char *str, char letter_input, int *indices, int *found_count) {
*found_count = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (tolower(str[i]) == letter_input) {
indices[*found_count] = i;
(*found_count)++;
}
}
}
char* word_secret() {
char * SecretWordList[] = {
"amor", "casa", "paz", "flor", "ceu", "mar", "luz", "vida", "bem", "livro"
};
srand(time(NULL));
return SecretWordList[rand() % (sizeof(SecretWordList) / sizeof(SecretWordList[0]))];
}
void word_initializer(char *string_secret) {
strncpy(string_secret, word_secret(), SECRET_WORD_SIZE);
}
void initializing_letter_mask(char *mask, char *wordSecret) {
int len = strlen(wordSecret);
for (int i = 0; i < len; i++) {
mask[i] = '-';
}
mask[len] = '\0';
}
void show_hud(int errors, int attempts, char *maskString) {
puts("\t ____________");
puts("\t |\t |");
puts("\t |\t |");
printf("\t |\t %c \t Número de tentativas restantes: %d\n", errors >= 1 ? 'O' : ' ', KICKS - attempts);
printf("\t |\t %c%c%c \t Palavra secreta: %s\n", errors >= 3 ? '/' : ' ', errors >= 2 ? '|': ' ', errors >= 4 ? '\\' : ' ', maskString);
printf("\t |\t %c %c \n", errors >= 5 ? '/' : ' ', errors >= 6 ? '\\': ' ');
puts("\t |");
puts("\t |");
puts("\t |");
}
void unmasking_word(int index, char *mask, char *str) {
mask[index] = str[index];
}
void clear_screen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
void welcome_message() {
puts("\t ____________");
puts("\t |\t |");
puts("\t |\t |");
puts("\t |\t O \t Bem Vindo ao Jogo da Forca!");
puts("\t |\t /|\\ \t Tente adivinhar a palavra secreta!");
puts("\t |\t / \\ ");
puts("\t | \t Número de Tentativas: 10\t Tamanho da Palavra: 5 letras!");
puts("\t |");
}
void winner_msg(char *string_secret) {
puts("\t ____________");
puts("\t |\t |");
puts("\t |\t |");
puts("\t |\t O \t PARABÉNS! VOCÊ GANHOU O JOGO!");
printf("\t |\t /|\\ \t Palavra secreta: %s\n", string_secret);
puts("\t |\t / \\ ");
puts("\t |");
}
void loser_msg(char *string_secret) {
puts("\t ____________");
puts("\t |\t |");
puts("\t |\t |");
puts("\t |\t O \t QUE PENA... VOCÊ PERDEU O JOGO!");
printf("\t |\t /|\\ \t Palavra secreta: %s\n", string_secret);
puts("\t |\t / \\ ");
puts("\t |");
}
void loser_msg_maxAttempts(char *string_secret) {
puts("\t ____________");
puts("\t |\t |");
puts("\t |\t |");
puts("\t |\t O \t VOCÊ PERDEU O JOGO POR EXCEDER O LIMITE DE TENTATIVAS!");
printf("\t |\t /|\\ \t Palavra secreta: %s\n", string_secret);
puts("\t |\t / \\ ");
puts("\t |");
}