Vamos começar a segunda parte do nosso curso de C?!
Dessa vez vamos desenvolver um Jogo de Forca, ainda mais desafiador que o Jogo de Adivinhação em que trabalhamos na primeira parte do curso.
Para isso, aprenderemos a manipular arrays, criar funções, além de escrever e ler arquivos, aprofundando os conhecimentos sobre entrada e saída.
E, claro, aprenderemos a deixar o jogo bonito no final!
Esse é o desafio! Vamos começar?
Para se começar um jogo de forca, de maneira análoga ao nosso jogo de adivinhação, é guardar a palavra secreta. Até agora, já conhecemos diversos tipos de variáveis, como int
, double
, float
, long
, mas ainda não vimos o tipo usado para se guardar um texto.
Em C, para guardarmos uma única letra, usamos o tipo char
. E o declaramos da mesma forma que os outros. Mas, para se passar a letra a ser armazenada, usamos aspas simples. Para imprimir, usamos a máscara "c" no printf
. Veja o código abaixo:
#include <stdio.h>
int main() {
char letra1 = 'M';
char letra2 = 'F';
char letra3 = 'A';
printf("%c %c %c", letra1, letra2, letra3);
}
Ele nos imprime as letras "M", "F" e "A". Mas e para guardar uma palavra? Será que precisamos armazenar letra a letra? A resposta é sim. Precisamos guardar uma a uma, mas para isso não teremos uma variável diferente para cada letra. Aliás, se tivéssemos, ficaríamos malucos. Imagina para guardar um texto inteiro? Quantas variáveis teríamos?
E o pior, não conseguiríamos fazer códigos dinâmicos para imprimir palavras de tamanhos diferentes. Não conseguimos escrever um for
, por exemplo, para imprimir as várias letras:
// imagine uma palavra com 10 letras
for(int i = 1; i <= 10; i++) {
// não temos uma maneira de "gerar dinamicamente"
// o nome da variável a ser impressa.
// Ou seja, não conseguimos imprimir "letra1",
// depois "letra2", e assim por diante.
printf("%c", letra(i));
}
O que usaremos para isso é o que chamamos de array. Arrays são uma maneira de guardarmos "vários" de um só tipo. Esses elementos ficam armazenadas na memória, um ao lado do outro. Por exemplo, um array de inteiros guarda um monte de números inteiros. Um array de char guarda um monte de caracteres. E assim por diante. E a vantagem do array é que, no momento da declaração, dizemos o tamanho dele. E aí acessamos cada um desses elementos por meio de um índice.
Veja, por exemplo, uma declaração de um array de inteiros, com 5 posições. Veja que a declaração é idêntica, com exceção do uso dos colchetes:
int notas[5];
Agora, para usar esse array, guardando e lendo inteiros dele, basta usarmos os colchetes para definirmos a posição que queremos acessar. Afinal, temos 5. O único detalhe importante é que, se nosso array tem 5 posições, elas vão de 0 a 4. A primeira posição de um array é o 0 (e não o 1, como muitos confundem):
// guardando na primeira posição do array
notas[0] = 10;
// guardando na segunda posição
notas[1] = 5;
// imprimindo a primeira posicao
printf("%d", notas[0]);
Para então guardarmos nossa palavra secreta, vamos declarar um array de char. Vamos definir seu tamanho como 20:
char palavrasecreta[20];
Podemos guardar nossa palavra dentro dele, da mesma forma que estávamos fazendo antes. A diferença é que o número que passamos entre colchetes, pode vir de uma variável:
char palavrasecreta[20];
palavrasecreta[0] = 'M';
palavrasecreta[1] = 'E';
palavrasecreta[2] = 'L';
int numero = 3;
palavrasecreta[numero] = 'A';
palavrasecreta[4] = 'N';
palavrasecreta[5] = 'C';
palavrasecreta[6] = 'I';
palavrasecreta[7] = 'A';
Um trabalhão. Para imprimir a palavra, fica um pouco mais fácil. Afinal, como podemos usar variáveis ali no índice, conseguimos fazer um loop com o tamanho da palavra:
for(int i = 0; i < 8; i++) {
printf("%c", palavrasecreta[i]);
}
Entretanto, um array de char é um array especial. Como nós o usamos para guardar textos, temos funções especializadas para facilitar nossa vida na hora de colocar dados dentro dele. Essas funções também vão nos ajudar a escrever loops mais flexíveis (o 8 ali está fixo, mas queremos que ele se adapte ao tamanho da palavra).
A função sprintf()
é muito parecida com a printf()
. Enquanto o printf
imprime na tela, a sprintf
imprime em um array de chars (o s** é justamente de **string). Então, se quisermos guardar a palavra secreta no array, fazemos:
sprintf(palavrasecreta, "MELANCIA");
Para imprimirmos na tela, usamos o printf
com a máscara "s". Ela faz com que todo o array seja impresso. Veja:
printf("%s", palavrasecreta);
Mas, veja que interessante. Nosso array tem 20 posições e a palavra "melancia" tem apenas 8 caracteres. Como que ele soube que deveria parar no último "a"? Por que ele não imprimiu 20 caracteres? Strings em C tem um pequeno detalhe: sempre que guardamos uma palavra lá, como melancia, que ocupa 8 posições, guardamos um caractere especial na 9a posição. Esse caractere nos diz que a string acaba ali, e que o resto é "lixo". Esse caractere é representado pelo símbolo \0
(barra zero). Apesar de serem dois caracteres, lembre-se que o barra é especial. Esse \0 é armazenado em uma única posíção.
Ou seja, quando fizemos o sprintf()
, ele escreveu na verdade o texto "MELANCIA\0". A função printf()
, sabendo disso, foi lendo o array de chars até encontrar o \0
. Encontrou, parou.
Se estivéssemos declarando as letras dessa palavra uma a uma, igual fizemos acima, bastaria adicionar o \0 ao final, que o printf("%s")
funcionaria normalmente:
char palavrasecreta[20];
palavrasecreta[0] = 'M';
palavrasecreta[1] = 'E';
palavrasecreta[2] = 'L';
palavrasecreta[3] = 'A';
palavrasecreta[4] = 'N';
palavrasecreta[5] = 'C';
palavrasecreta[6] = 'I';
palavrasecreta[7] = 'A';
// colocando o \0 para indicar que a string acabou
palavrasecreta[8] = '\0';
O curso C: avançando na linguagem possui 185 minutos de vídeos, em um total de 66 atividades. Gostou? Conheça nossos outros cursos de C e C++ em Programação, ou leia nossos artigos de Programação.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.