Ajuda com Joguinho em C (ja esta funcionando so uma duvida) [RESOLVIDO]

1. Ajuda com Joguinho em C (ja esta funcionando so uma duvida) [RESOLVIDO]

matheus luis parras
matheus.parras

(usa Ubuntu)

Enviado em 23/03/2011 - 14:23h

Ola Pessoal

é o seguinte, montei um programa que sorteia 5 numeros de 0 a 9, quando se acerta o numero e a posição do numero imprime um * se acertar o numero na posição errada imprime um # e se errar imprimi um X , são 5 tentativas para acertar ate ai tudo OK

minha duvida é a seguinte, na hora que digite meu palpite dos 5 numeros, eu tenho que dar Enter entre um numero e outro

for (it=0;it<5;it++)
scanf("%d",&teste[it]); //palpite do jogador
então eu digito 1 (enter)
2 (enter)
e assim vai, eu queria poder digitar os numeros seguidos
12345
e ele armazenar cada numero e uma posição do vetor, já tenti com getche() com 5%^\n, e muitras outras coisas, mas não consigo fazer isso......



e outra duvida (menos importante) é que não faz o sorteio dos numeros sempre sai o numero 17409
for (is=0;is<5;is++)
sorteio[is]=rand()%10; //sorteio dos numeros

se alguém poder me ajudar com qualquer coisa wink.gif

vlw!


aqui o codigo do jogo por completo>>>>>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{ int sorteio[5],is,teste[5],it,tent,cont;
char pos[5];

for (is=0;is<5;is++)
sorteio[is]=rand()%10; //sorteio dos numeros

for (is=0;is<5;is++)
printf(" . %d",sorteio[is]); //escreve os numeros sorteados (para teste)
printf("\n* = Resposta Certa \n# = numero certo no lugar errado\nX = Numero não existe\n"); //Legenda para o jogo
printf("\n");
printf(" Digite 5 numeros \n %c");

do{
tent++;//contador das tentativas
printf("\nTentativa %d de no maximo 5\n",tent); //numero de tentativas

for (it=0;it<5;it++)
scanf("%d",&teste[it]); //palpite do jogador

for (it=0;it<5;it++)
pos[it]='X'; //"zera" o vetor pos

for (is=0;is<5;is++){ //Teste do palpite do jogador
for (it=0;it<5;it++){
if ((sorteio[is]==teste[it]) && (is==it))
pos[it]='*';
if ((sorteio[is]==teste[it]) && (is!=it))
pos[it]='#';}}

for (it=0;it<5;it++) //acertos e/ou erros do jogador
printf("%c",pos[it]);

cont=0;
for (it=0;it<5;it++){ //verifica se o jogador concluiu o jogo
if (pos[it]=='*'){cont++;}}

if (cont==5) //se jogador acertar todos os numeros
printf("\nParabens acertou em %d Tentativas\n",tent),tent=5;

}
while(tent!=5);//esgotar tentativas ou acertas todos numeros
printf("\nFIM DE JOGO");

getch();
}


  


2. Re: Ajuda com Joguinho em C (ja esta funcionando so uma duvida) [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 23/03/2011 - 15:29h

O scanf permite você informar a quantidade máxima de caracteres que pode ser lida.
No seu caso é 1, pois cada palpite tem um caractere:

scanf("%1d%1d%1d%1d%1d", &teste[0], &teste[1], &teste[2], &teste[3], &teste[4]) ;

Como seu vetor só tem 5 posições então é viável ler todos os números em sequência (sem precisar de loop).

A entrada do usuário deve ser algo como: 12345, aí teremos: teste[0]=1, teste[1]=2, etc...


Já em sua segunda dúvida, você tem que mudar a semente usada para gerar os números (pseudo-)aleátorios. Esas mudança é feita pela função srand(semente). Se a semente é a mesma, então rand() irá gerar SEMPRE os mesmos números, e para contornar esse problema, temos que usar uma semente variável, como a quantidade de segundos, indicada por time(NULL).

Então antes do rand(), use:

srand(time(NULL)) ;

O seu trecho de código ficara +/- assim:
srand(time(NULL) ;
for (is=0;is<5;is++)
sorteio[is]=rand()%10; //sorteio dos numeros

Tente aí e diga se funcionou.

Abraços
t+


3. Thanks

matheus luis parras
matheus.parras

(usa Ubuntu)

Enviado em 23/03/2011 - 15:39h

Os 5 numeros juntos funcionou
ta otimno assim
maaas existe um jeito de digitar os 5 numeros e ele ja pular para o proximo comando??? tipo eu digito 12345 (tirar esse enter do final ele ja pular pro teste)


o srand tambem funcionou so que, se tiver numero repetido ele faz a checagem errada, por exemplo se sortear 11234 e eu digitar 11234, ele me diz que o 1 ta fora de lugar, e nao da a resposta como certa


4. iupi

Marcos Paulo Ferreira
daemonio

(usa Slackware)

Enviado em 23/03/2011 - 17:44h

Então Matheus, para não ter que digitar enter, você terá que usar a função getch()/getche(), mas isso só para windows, pois no linux essas funções não estão presentes (apesar que há um jeito de emular esse comportamento).

Creio que você tá programando pra windows porque você usa a função getch() em seu código. Se você tentou usar essa função para fazer a leitura e não funcionou, então acho que sei o que rolou de errado. A função getch() retorna o código ASCII do caractere. Se o cara digitar '1', então getch() retornará o número 49 e não o número 1 como você deve ter pensado.

Para ler 5 caracteres sem precisar apertar enter, tente isso:

for (it=0;it<5;it++) {
teste[i]=getch()-'0' ; // -'0' para transformar o caractere em numero
scanf("%d",&teste[it]); //palpite do jogador
}

Agora, por que o 11234 não funciona? Há dois loops para verificar os caracteres dos dois vetores, mas somente um loop é necessário. O problema ocorre quando (sorteio[is]==teste[it]) && (is!=it), sendo que is=0 e it=1, daí o caractere # é colocado na primeira posição do vetor.

Do jeito que testei aqui foi:

Troque
for (is=0;is<5;is++){ //Teste do palpite do jogador
for (it=0;it<5;it++){
if ((sorteio[is]==teste[it]) && (is==it))
pos[it]='*';
if ((sorteio[is]==teste[it]) && (is!=it))
pos[it]='#';}}

Por:
for (it=0;it<5;it++){ // um loop somente.
if ((sorteio[it]==teste[it]) ) { pos[it]='*'; }
else { pos[it]='#'; }
}

Fiz alguns testes e funcionou blz. Veja se é isso mesmo.

Abraços
t+


5. ok

matheus luis parras
matheus.parras

(usa Ubuntu)

Enviado em 24/03/2011 - 08:35h

deu certo cara, eu garanti nenhum numero repetido no sorteio

srand(time(NULL));
do{
for (is=0;is<5;is++)
sorteio[is]=rand()%10;}
while((sorteio[1]==sorteio[0]) || (sorteio[0]==sorteio[2]) || (sorteio[2]==sorteio[3]) || (sorteio[3]==sorteio[4]) ||
(sorteio[1]==sorteio[2]) || (sorteio[0]==sorteio[3]) || (sorteio[2]==sorteio[4]) ||
(sorteio[1]==sorteio[3]) || (sorteio[0]==sorteio[4]) ||
(sorteio[1]==sorteio[4]));

depois a entrada sem o scanf, e com getche, para ele escrever na tela os numeros digitados
for (it=0;it<5;it++) {
teste[it]=getche()-'0' ;}

e eu realmente havia me esquecido do -'0'

e os testes tem que ser dessa maneira

for (it=0;it<5;it++)
pos[it]='X'; //"zera" o vetor pos

for (is=0;is<5;is++){ //Teste do palpite do jogador
for (it=0;it<5;it++){
if ((sorteio[is]==teste[it]) && (is==it))
pos[it]='*';
if ((sorteio[is]==teste[it]) && (is!=it))
pos[it]='#';}}


pq primeiro ele carrega meu vetor com X como se ja estive todos errados, ai se ele encontrar alguma condição ali ele so substitui por * ou #
com um else ali, msm que não exista o numero, ele vai colocar um # e a ideia é
numeros certos no lugar certo *
numeros certo no lugar errado #
e se nao existir o numero X

ta tudo Ok! vlw msm em cara!

so mais um coisinha que eu queria (é a atoa so pra enfeitar) era coloca um delay na hora que ele escreve os acertos/erros
eu procurei por ai, e so vi coisas do tipo chamar biblioteca time, e depois so escrever delay(1000);
mas aqui nem roda não, sabe de algo sobre delay em C ?

vlw msm em cara!
Abraços
Até mais!


6. Re: Ajuda com Joguinho em C (ja esta funcionando so uma duvida) [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 07/04/2011 - 09:27h

Opa matheus.. muito tempo sem visitar o vol, creio que já encotrou a solução do delay...

Existe a função sleep que dorme em milissegundos no windows e em segundos no linux. Você também pode criar esse delay na unha, é só pegar um tempo inicial e deixar o programa parado por n unidade de tempo.

Se voce estiver no linux, mande:

$ man 2 time
$ man 3 sleep

que tem muitas informações...

t+


7. Re: Ajuda com Joguinho em C (ja esta funcionando so uma duvida) [RESOLVIDO]

matheus luis parras
matheus.parras

(usa Ubuntu)

Enviado em 07/04/2011 - 12:36h

hehe vlw em cara ta de boa
fiz com sleep

mas msm assim vlw em cara ;)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts