Ir ao conteúdo
  • Cadastre-se

C++ <Code> Impressão inesperada de caracter


Posts recomendados

Bom dia, estou criando um jogo da forca em c++, e uma das funcionalidades que quero implementar é mostrar as letras digitadas erradas, eu consegui fazer isso, mas ocorreu um problema: a terceira letra errada, independente de qual ela seja , imprime um outro caractere (parece ser um coração), mas quando uma outra letra errada esta tudo certo, até o caractere anterior, que é impresso certo, e não faço ideia de qual é o problema, alguem saberia me dizer?

Jogo da forca codigo.txt

Link para o comentário
Compartilhar em outros sites

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <list>
#include <fstream>
#include <stdlib.h>
#include <ctime>
#include <locale>

using namespace std;
//Jogo da forca simples
void vencer_ou_perder(int f_acertos, int f_tam, string fpalavra, list <char> fletrastentadas);
void forca(string fpalavra, char fletra[1], string fsecret, int ftam,int fchances, int facertos, bool facertob);

int main()
{   //palavra ira armazenar a palavra a ser descoberta
    //letras as alternativas, secreta ira conter a palavra a
    // medida q ela vai sendo desvendada
    //tam tamanho, n de chances,
    //char palavra[30], letra[1],secreta[30];
    setlocale(LC_ALL,"Portuguese");
    string palavra, secreta; char letra[1];
    int tam,chances,acertos;
    bool acertob = false;//verifica se a letra esta na palavra ou n
    fstream arqpalavras;
    list <string> palavras_possiveis;
    string linhas;
    int p,tlista;
    list <string>::iterator it;
    int res;

    do{
    arqpalavras.open("C:\\Users\\Iara\\Desktop\\Diego Dreossi\\CURSO DIEGO\\Palavras do jogo da forca.txt",ios::in);
    if(arqpalavras.is_open()){
      while(getline(arqpalavras,linhas)){
        palavras_possiveis.push_front(linhas);
      }
    }
    tlista = palavras_possiveis.size();
    it = palavras_possiveis.begin();
    srand(time(NULL));//Usa a hora do pc como semente para a função numero aleatorio
    p = rand() % tlista;//Busca numero aleatorio até certo numero
    if(p == 0){p = 1;}
    advance(it,p-1);


    chances = 6; tam = 0; acertob = false; acertos = 0;

    palavra = *it;


    secreta = palavra;

    forca(palavra, letra, secreta, tam, chances, acertos, acertob);


    cout<<"\n\nJogar de novo? 1 - S/ 2 - N:  ";
    cin >> res;
    cin.ignore();
    system("cls");
    }while(res != 2);


    return 0;
}

void vencer_ou_perder(int f_acertos, int f_tam,string fpalavra, list<char>fletrastentadas){

     if(f_acertos == f_tam){
        cout << "voce ACERTOU!\n";
        cout << "Palavra: " << fpalavra << "\n\n";
        while(!fletrastentadas.empty()){
            cout << fletrastentadas.front() << " ";
            fletrastentadas.pop_front();

        }

        cout<<endl;
    }else{
        cout << "voce PERDEU!\n";
        cout << "Palavra: " << fpalavra << "\n\n";
        while(!fletrastentadas.empty()){
            cout << fletrastentadas.front() << " ";
            fletrastentadas.pop_front();

        }
        cout<<endl;
    }

    system("pause");

}


void forca(string fpalavra, char fletra[1], string fsecreta, int ftam, int fchances, int facertos, bool facertob){

    list <char> letras_tentadas,letras_erradas;
    list <char> ::iterator it2,it3;
    int le;//letras erradas
    //int lt;//letras tentadas

    int findice = 0;
    while(fpalavra[findice] != '\0'){
        findice++;//contador
        ftam++;//descobre tamanho da palavra secreta

    }


    for(findice = 0; findice < ftam; findice++){

        if(fpalavra[findice] == ' '){
            fsecreta[findice] == ' ';
            facertos++;
        }else fsecreta[findice] = '-';//visual do jogo da forca
    }

    while((fchances > 0)&&(facertos < ftam)){

        cout << "****  JOGO DA FORCA *****" << endl<<endl<< endl;


        cout << "\n\nChances restantes: " << fchances << "\n\n";
        cout << "Letras erradas: ";
        le = letras_erradas.size();
        it2 = letras_erradas.begin();


        if(le>0){
        int y = 0;
        while(y < le){
            advance(it2,y);
            cout << *it2 << " ";
            y++;
        }
        }
        cout << "\n\nPalavra secreta: ";
        for(findice = 0;findice < ftam;findice++){
            cout << fsecreta[findice];
        }
        cout << "\n\nDigite uma letra: ";

        cin >> fletra[0];
        letras_tentadas.push_back(fletra[0]);

        cout << endl<<endl;
        /*lt = letras_tentadas.size();
        it3 = letras_tentadas.begin();*/

        for(findice = 0;findice < ftam; findice++){
            if(fpalavra[findice] ==  fletra[0]){
                facertob = true;
                fsecreta[findice] = fpalavra[findice];
                facertos++;
            }
        }
        if(!facertob){
            letras_erradas.push_back(fletra[0]);
            fchances--;

        }

        facertob = false;
        system("cls");

    }

       vencer_ou_perder(facertos,ftam,fpalavra,letras_tentadas);

}
 

Link para o comentário
Compartilhar em outros sites

Olá!

 

Seu programa parece muito complicado...

 

  • Use o botão code para formatar seu código porque se não faz isso ao copiar para outra máquina alguém que qeuria ajudar pode copiar um monte de outras coisas devido à formatação do site.
     
  • Se vai usar um arquivo poste também umas linhas do arquivo que está usando, assim se pode testar com os mesmos dados que você usa: poste umas linhas do dicionário, por exemplo
     
  • evite sempre usar void(). É um desperdício.
     
  • Sobre 
     
        void forca(
          string fpalavra,
          char fletra[1], 
          string fsecret, 
          int ftam,
          int fchances, 
          int facertos, 
          bool facertob
        );

     em geral isso não combina com essa linguagem. Provavelmente o que você queria era escrever o simples, muito mais simples, que seria a classe ou struct Forca.
     

  • que pretende com char fletra[1], que é a mesma coisa que char fletra?
     

  • Você declarou um iterador para ir dinamicamente para o elemento "sorteado" da lista. E isso é muito, mas muito estranho. No geral quando se usa uma lista a última coisa que se quer é ir a um elemento pela posição dele. Se precisa disso os vetores são muito, mas muito mais rápidos e já vem com a operação...
     

        tlista = palavras_possiveis.size();
        it = palavras_possiveis.begin();
        srand(time(NULL));//Usa a hora do pc como semente para a função numero aleatorio
        p = rand() % tlista;//Busca numero aleatorio até certo numero
        if(p == 0){p = 1;}
        advance(it,p-1);
        palavra = *it;
        secreta = palavra;


    podia ser só
     

        secreta = palavra = vlista[ rand()%vlista.size() ];


    se tivesse criado um vetor com as palavras do arquivo...
     

  •     arqpalavras.open("\
    C:\\Users\\Iara\\Desktop\\Diego Dreossi\\CURSO DIEGO\\Palavras do jogo da forca.txt",ios::in);


    Não precisa usar dois backslashes. Pode usar apenas uma barra porque o compilador entende, tanto em Windows quanto em Unix e derivados. 
    Mais ainda, nunca use o caminho completo. Isso só dá problema. Deixe o arquivo no diretório onde roda o programa ou use variáveis de ambiente.
     

  • não use system(). É proibido em toda parte, empresas e escolas. Só dá problema. É um problema de segurança e não estará fazendo nada: apenas chamando o shell do sistema e passando uma string. system("lancar satelite") não coloca um satélite em orbita: apenas manda uma mensagem.

 

 

Link para o comentário
Compartilhar em outros sites

#include <iostream>
#include <stdlib.h>
#include <string>
#include <list>
#include <fstream>
#include <stdlib.h>
#include <ctime>
#include <locale>
#include <conio.h>

using namespace std;

void vencer_ou_perder(int f_acertos, int f_tam, string fpalavra, list <char> fletrastentadas);
void forca(string fpalavra, char fletra, string fsecret, int ftam,int fchances, int facertos, bool facertob);
bool Repetida(list<char>fletras_tentadas, char frletra);
void Letras_erradasF(list<char>fletraserradas);

int main()
{   //palavra ira armazenar a palavra a ser descoberta
    //letras as alternativas, secreta ira conter a palavra a
    // medida q ela vai sendo desvendada
    //tam tamanho, n de chances,
    //char palavra[30], letra[1],secreta[30];
    setlocale(LC_ALL,"Portuguese");
    string palavra, secreta,linhas; char letra;
    int tam,chances,acertos,p,tlista;//res;
    bool acertob = false;//verifica se a letra esta na palavra ou n
    fstream arqpalavras;
    list <string> palavras_possiveis;
    list <string>::iterator it;


    arqpalavras.open("Palavras do jogo da forca.txt",ios::in);
    if(arqpalavras.is_open()){
      while(getline(arqpalavras,linhas)){
        palavras_possiveis.push_front(linhas);
      }
    }
    tlista = palavras_possiveis.size();
    it = palavras_possiveis.begin();
    srand(time(NULL));//Usa a hora do pc como semente para a função numero aleatorio
    p = rand() % tlista;//Busca numero aleatorio até certo numero
    if(p == 0){p = 1;}
    advance(it,p-1);
    chances = 6; tam = 0; acertob = false; acertos = 0;
    palavra = *it;
    secreta = palavra;// = tlista[rand()% tlista.size()];
    //Se esquecer como estava no comentario aparece:
    //error: request for member 'size' in tlista, which is of non-class type 'int'
    forca(palavra, letra, secreta, tam, chances, acertos, acertob);


    
    system("cls");



    return 0;
}

void vencer_ou_perder(int f_acertos, int f_tam,string fpalavra, list<char>fletrastentadas){

     if(f_acertos == f_tam){
        cout << "voce ACERTOU!\n";
        cout << "Palavra: " << fpalavra << "\n\n";
        while(!fletrastentadas.empty()){
            cout << fletrastentadas.front() << " ";
            fletrastentadas.pop_front();

        }

        cout<<endl;
    }else{
        cout << "voce PERDEU!\n";
        cout << "Palavra: " << fpalavra << "\n\n";
        while(!fletrastentadas.empty()){
            cout << fletrastentadas.front() << " ";
            fletrastentadas.pop_front();

        }
        cout<<endl;
    }

    system("pause");

}

void Letras_erradasF(list<char>fletraserradas){
     while(!fletraserradas.empty()){
            cout << fletraserradas.front() << " ";
            fletraserradas.pop_front();

        }
}
bool Repetida(list<char>fletras_tentadas, char frletra){
         bool rep;
        if(!fletras_tentadas.empty()){

        while(!fletras_tentadas.empty()){
            fletras_tentadas.front();
            if(frletra == fletras_tentadas.front()){

                rep = true;


            }else rep = false;

            if(rep){
             return true;
             fletras_tentadas.clear();
            }else{
            fletras_tentadas.pop_front();
            }

        }
       }else return false;

       return rep;
}

void forca(string fpalavra, char fletra, string fsecreta, int ftam, int fchances, int facertos, bool facertob){

    list <char> letras_tentadas,letras_erradas2;

    int LR;//letras repetidas


    int findice = 0;
    while(fpalavra[findice] != '\0'){
        findice++;//contador
        ftam++;//descobre tamanho da palavra secreta

    }


    for(findice = 0; findice < ftam; findice++){

        if(fpalavra[findice] == ' '){
            fsecreta[findice] == ' ';
            facertos++;
        }else fsecreta[findice] = '-';//visual do jogo da forca
    }



    while((fchances > 0)&&(facertos < ftam)){

        cout << "****  JOGO DA FORCA *****" << endl<<endl<< endl;
        cout << "\n\nChances restantes: " << fchances << "\n\n";
        cout << "Letras: ";

        Letras_erradasF(letras_erradas2);



        cout << "\n\nPalavra secreta: ";
        for(findice = 0;findice < ftam;findice++){
            cout << fsecreta[findice];
        }
        cout << "\n\nDigite uma letra: ";

        cin >> fletra;
        letras_tentadas.push_back(fletra);


        cout << endl<<endl;

        LR = Repetida(letras_tentadas,fletra);
        if(LR){
            fchances--;
            facertob = false;
            system("cls");
        } else{


        for(findice = 0;findice < ftam; findice++){
            if(fpalavra[findice] ==  fletra){
                facertob = true;
                fsecreta[findice] = fpalavra[findice];
                facertos++;
            }
        }
        if(!facertob){
            letras_erradas2.push_back(fletra);
            fchances--;

        }

        facertob = false;
        //Nao funciona clrscr();
        system("cls");

    }
    }
       vencer_ou_perder(facertos,ftam,fpalavra,letras_tentadas);



}

Boa tarde, sobre a definição da palavra eu tentei a sua sugestão e deu erro. Eu coloquei o arquivo no diretorio do codigo, eu vou deixar o system p n achei alternativa para limpar a tela, mas eu ouvi essa sugestão e o do void, por enquanto vou deixar porque esta funcionando e ainda sou novato , é um programa para estudo, e quanto a ele, só faltava uma queira das funcionalidades que queria: se o usuario digitar outra letra já digitada, perde-se uma chance, mas não estou conseguindo fazer essa, é algum problema na função Repetida, porque se eu tirar ela e tudo ligado a ela o programa funciona,mas se ela continua eu digito as letras, seja qual for e o programa só diminue as chances,  você sabe o que pode estar acontecendo?  

heroi
computador
revista
tigre
tartaruga
hamburguer
mae
pai
informaçao
verde
vilao
princesa
lesbica
filme
video
pizza
vampiro
inglaterra
casa
vida
gay
concerto
filosofia
monitoramento
morcego
processador
peninsula
mar
visao
ferradura
divindade
cristianismo
serie
sim
nao
assexual
vidro
microfone
transsexual
paternidade
exame
colmeia
urso
irmão
irma
veiculo
bicicleta
luz
prova
meio ambiente
ambiente
metade
maça
maca
massa
chuva
chuveiro
sexo
fofura
fofo
sensacional
maravilhoso
potencial
potente
poder
montanha russa
montanha
relevo
geografia
analise
desenvolvimento
sistema
plural
singular
versao
tigre branco
cao
cachorro
cachorro quente
seriado
filmografia
bebado
alcool
cerveja
bonito
talentoso
ornitorinco
rico
pobre
politica
pandemia
burrice
milhao
numero
um
jogo
forca
força
regua
mouse
inglês
portugues
codigo
programa
linguagem
programaçao
traiçao
merecer
terminar
ver
morrer
viver
desaparecer
jogar
forçar
cantar
dançar
homenagem
masturbaçao
celular
telefone
corretagem
foto
fotografia
camera
fotografar
papear
papo
falar
trote
escola
faculdade
universidade
propaganda
ligar
deslgar
esperar
pagar
propagandear
caucasiano
negro
comunidade
pardo
indigena
asiatico
pais
consulado
canada
brasil
estados unidos
escocia
eu
mim
baixo
alto
carregar
baixar
mensagem
palavra
india
paquistao
emirados arabes unidos
china
japao
digital
criptografia
cripto moeda
moeda
dinheiro
ouro
prata
bronze
diamante
dia
noite
tarde
madrugada
verdade
contar
mentira
feiçao
roubar
loucura
falencia
pirar
atuar
soneto
escrever
livro
revista
historia em quadrinho
maravilha
mulher
homem
garota
garoto
menino
menina
superior
inferior
diversidade
curso
site
hard drive
entrada
saida
casamento
namoro
morar
alma
morte
vida
fa
idolo
viajar
lanterna
flash
agua
oceano
marte
fogo
ar
raio
relampago
trovao
clima
diretor
roteirista
desenhista
streaming
claridade
definir
incluir
excluir
familia
pequeno
grande
invençao
branco
azul
azul marinho
verde claro
vermelho
laranja
fruta
geladeira
comida
chamada
inicializaçao
ano
tempo
tempestade
ciclope
texugo
xicara
pantera
incrivel
fonte
marremoto
moto
veiculo
exclamaçao
vencer
perder
final
fim
começo
começar
queer
remanescer
renascimento
historia
conto
cançao
poema
sal
tempero
temperatura
moderação
veneno
arabe
pagina
sinal
medo
bravura
tormenta
tornado
capitao
capital
caneca
cone
candido
rodovia
rodo
nave
navegaçao
veridico
coluna
linha
arvore

Palavras possiveis do programa

Link para o comentário
Compartilhar em outros sites

40 minutos atrás, Diego Dreossi disse:

secreta = palavra;// = tlista[rand()% tlista.size()]; //Se esquecer como estava no comentario aparece: //error: request for member 'size' in tlista, which is of non-class type 'int'

 

oh...

Acho que não me expliquei bem. 

 

Eu disse que não há razão para usar uma lista, muito pelo contrário. E você continua usando. Não basta colar o que eu escrevi. 

Lista não é o container certo aqui.

 

Quanto ao dicionário bastam umas poucas palavras. Só isso. 

 

Entendeu o resto do que eu disse? Está muito complicado do modo como escreveu. Em C++ é mais simples. Está como seria em C praticamente.

 

Bem melhor o formato agora! :)

 

 

 

conio.h em 2021? em C++? Isso é dos anos 80, derivado do Turbo C da Borland, que vinha em dois diskettes de 1.44mb e era inspirado em algo que vinha no Apple II antes. 

 

Tire isso daí. Não é possível que precise disso em 2021 programando em C++...

1 hora atrás, Diego Dreossi disse:

Repetida()

 

Repetida retorna bool mas você atribui a um int. Porque? 

Ainda está, como eu disse, bem complicado.

 

Se o cara digitar uma letra que já tinha digitado vai descontar do limite de erros?

O limite vai estar na tela?
 

void forca(
    string fpalavra, char fletra, string fsecreta,
    int ftam, int fchances, int facertos, bool facertob)
{

    list <char> letras_tentadas,letras_erradas2;

    int LR;//letras repetidas

 

coisas assim é que ficam bem complicadas sem razão.

 

Está usando duas listas de <char>, mas sabe que string é precisamente isso e muito mais conveniente? string é uma lista de char e é por definição iterável e tem também acesso direto via índice. Não deve complicar se está aprendendo, eu acho. C++ é uma linguagem sensacional, mas é enorme e complicada por si só.

 

Esse LR é o que vai receber o resultado de Repetida() e pode ser declarado lá mesmo.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Diego Dreossi disse:

Repetida()

 

Repetida retorna bool mas você atribui a um int. Porque? 

Ainda está, como eu disse, bem complicado.

 

Se o cara digitar uma letra que já tinha digitado vai descontar do limite de erros?

O limite vai estar na tela?
 

void forca(
    string fpalavra, char fletra, string fsecreta,
    int ftam, int fchances, int facertos, bool facertob)
{

    list <char> letras_tentadas,letras_erradas2;

    int LR;//letras repetidas

 

coisas assim é que ficam bem complicadas sem razão.

 

Está usando duas listas de <char>, mas sabe que string é precisamente isso e muito mais conveniente? string é uma lista de char e é por definição iterável e tem também acesso direto via índice. Não deve complicar se está aprendendo, eu acho. C++ é uma linguagem sensacional, mas é enorme e complicada por si só.

 

Esse LR é o que vai receber o resultado de Repetida() e pode ser declarado lá mesmo....

 

Vai mesmo tratar espaços como letras no jogo? 

Melhor avisar na tela porque não é comum

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...