Master Mind

Ricky2007

Power Member
precisava que me arranjassem um programa em c
  • O programa deve sortear 4 digitos e armazena-los num vector. Esses digitos nao podem ser repetidos e devm ser sorteados do intervalo 0 - 9;
  • O jogador deve adivinhar quais os digitos sorteados e as posições correctas destes, inserido em cada tentativa um conjunto de 4 digitos (tambem pode ser lido como um vector, por exemplo);
  • A cada jogada o programa deve informar quantos digitos estavam correctos e na posição correcta e quantos digitos estavam correctos na posição incorrecta. podem-do utilizar cores, numeros e caracteres.
  • O programa também deve informar os jogadores de quantas tentativas este ainda tem (no maximo 10) para tentar adivinhar
  • Se o jogador nao advinhar em 10 tentativas, o programa deve dar uma mensagem apropriada e informar qual a combinação que se procurava. Se o jogador advinhar antes, deve dar uma mensagem de parabens. Em ambos os casos o jogo termina.
O programa deve começar por ler a informação relativa ao jogador e à data de realização do jogo e só depois passar ao jogo propriamente dito.
Depois de terminado o jogo, devem ser armazenadas num ficheiro todas as informações principais do jogo (Informação do jogador, data de realização do jogo e resultado final obtido por este, victoria ou derrota);
Após a conclusao do jogo deve ser possivel continuar a jogar ou terminar o programa.


NOTA:

-Use estruturas para guardar a informação de cada jogador e à data de realização do jogo;-Para sortear os digitos, deve ser utilizada a função random(n) do turbo C, que retorna o numero aleatorio entre 0 e n-1. Deve ser chamada tambem a função randomize(), para inicializar o gerador de numeros aleatorios. Para a utiçização das funçoes de sorteio, deve-se incluir as bibliotecas: #include<stdlib.h> e #include <time.h>.
-pra exibir texto colorido deve ser utilizada a função cprintf(..) e nao printf (...).
- Nao se esqueça de proteger o programa contra entradas indevidas.
- Use e abuse de comentarios e funçoes.

Este é o inunciado que me foi dado.

Ajudem-me a fazer este programa.
 
Última edição:
precisava que me arranjassem um programa em c

Ninguém te vai fazer o trabalho por ti. Pelo menos aqui.

Ajudem-me a fazer este programa.

Agora falamos melhor, onde tens dúvidas? Começa a fazer o trabalho, e vai apresentando nesta thread as tuas dúvidas concretas, o pessoal ajuda-te e explica-te consoante as capacidades e disponibilidades de cada um, mas fazer trabalhos é que não...

Boa sorte nisso ;)

abraços, HecKel
 
Tendo em conta que não se pode repetir dígitos em cada sequência de 4, essa parte torna-se simples.

Tens os 2 vectores como dizes, o correcto e a jogada. Para contar quantos estão na posição certa, é só ver quantos dígitos são iguais para cada posição igual dos vectores (jogada == correcto, para o mesmo i). Para contar quantos estão na posição errada, é fazer o mesmo mas do seguinte modo: jogada == correcto[j], para todos os j diferentes de i. É possível fazeres tudo isto simultaneamente.
 
Vê se isto te ajuda:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void clrscr(void)
{
int i;

for(i=0;i<=80;i++) puts("");
}

void randomize(void)
{
time_t tt;
char buf[64], hundreds[3];

tt = time(NULL);
strcpy(buf, ctime(&tt));
hundreds[0]=tolower(buf[17]);
hundreds[1]=tolower(buf[18]);
hundreds[2]='\0';
srandom(atoi(hundreds));
}

int main(void)
{
char c;
int m,n,i,j,p,t,hidden[4],guess[4];

while (1)
{
clrscr();
randomize();
puts("***********************");
puts("* M A S T E R M I N D *");
puts("***********************");
putchar('\n');
putchar('\n');
puts("You must guess 4 numbers out of 1 , 2 , 3 , 4 , 5 and 6 with possible repetitions.");
putchar('\n');
puts("The computer evaluates you try with:");
puts(" * = number guessed in right position");
puts(" + = number guessed in wrong position");
puts(" - = no number guessed");
putchar('\n');
puts("Wanna play (y/n) ?");

c=getchar();

if(c=='y')
{
again: clrscr();
printf("\n \t \t \t M A S T E R M I N D \n \n");
puts("To quit game press q.");
puts("To start a new game press n.");
putchar('\n');

for(i=0;i<4;i++)
hidden = random()%6+1;

n=0;
while(1)
{
n++;

if(n < 20)
printf("Guess no. %d : ",n);
else
printf("You can always try another time:");

for(i=0;i<4;i++)
{
c=getchar();

if(c=='q')
goto end;
if(c=='n')
goto again;
if(c=='1')
m=1;
if(c=='2')
m=2;
if(c=='3')
m=3;
if(c=='4')
m=4;
if(c=='5')
m=5;
if(c=='6')
m=6;
if(c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6')
if(c != 'q' && c != 'n')
{
i = i-1;
continue;
}
guess = m;
}

t=0;
p=0;
for(i=0;i<4;i++)
if (guess == hidden)
{
t++;
hidden = hidden - 8;
guess = guess - 16;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if (guess == hidden[j])
{
p++;
hidden[j] = hidden[j] - 8;
guess = guess - 16;
}

putchar(' ');

fflush(stdin);

if(t != 0)
for(i=0;i<t;i++)
{
putchar('*');
putchar(' ');
}
if(p != 0)
for(i=0;i<p;i++)
{
putchar('+');
putchar(' ');
}
if(t+p == 0)
putchar('-');

putchar('\n');

for(i=0;i<4;i++)
if (hidden < 0)
hidden = hidden + 8;

if(t == 4)
{
if(n <= 4)
printf("EXCELLENT!!! You needed only %d guesses\n",n);
if(n > 4 && n <= 7)
printf("Congratulations! You needed %d guesses\n",n);
if(n > 7 && n <= 10)
printf("Good! You needed %d guesses\n",n);
if(n > 10 && n <= 15)
printf("Poor! You needed %d guesses; you need to practice more!\n",n);
if(n > 15)
printf("CATASTROPHIC!!! You needed %d guesses...\n",n);

putchar('\n');
puts("Another game (y/n) ?");
c=getchar();
if(c=='y')
goto again;
else
goto end;
}
}
}
if(c=='n')
goto end;
if(c!='y' && c!='n')
{
continue;
}
}

end: clrscr();
}

 
Última edição pelo moderador:
Boas, desculpem estar a usar este tópico ''esquecido'', mas não achei necessário criar um novo.

Tenho de fazer o jogo ''Mastermind 2D'' em fluxograma e pseudo-código, mas tenho umas dúvidas em que preciso da vossa ajuda.

A chave a adivinhar é gerada pelo computador e o jogador humano é quem vai tentar descobrir. São 6 cores a poder usar e cada chave tem 4 cores. Por cada cor certa em casa certa, o computador coloca um pino preto, mas se a cor for correcta mas na casa errada, é colocado um pino branco. O jogador dispõe de 15 tentativas para acertar na chave. Agora as dúvidas:

- As sequências que o jogador humano insere devem ser guardas num só array? Tava a pensar em fazer do tipo: sequencia 1(0 a 3), sequencia 2(4 a 7), etc., em que os números entre parêntesis representam os índices do array. A outra forma que eu estava a pensar era fazer um array para cada sequência, mas penso que seria menos viável;

- Na atribuição de pinos pretos e brancos, estava a pensar fazer um sistema semelhante ao de cima, tendo em atenção que os pinos não são apresentados com qualquer relação à casa que representam.

Devo dizer que estas dúvidas são consequência de eu ter visto nos jogos do mastermind que tenho jogado, que o jogador tem sempre acesso a todas as jogadas anteriores, daí eu ter pensado em fazer um array para cada jogada...

Estou no 1º ano de engenharia mecânica(nota-se não é!?), de tal forma que esta não é bem a minha área.

cumprimentos...
 
Back
Topo