Jump to content

Random Ficheiro.bin


rrm1

Recommended Posts

Ola, estou a fazer um projeto para a escola, o projeto e o jogo "Quem quer ser milionario" mas estou com uns problemas

Tenho um record para guardar grupos de Pergunta+4respostas+resposta certa dentro do ficheiro.bin

ate ai tudo bem, o meu problema e escolher esses grupos aleatoriamente, pois se eu puser um numero fixe no Randomize se eu inserir mais um grupo de perguntas+resposta ja nao vai dar bem, e mesmo que nao insira mais grupos, com o randomize vai haver probabilidade de repetir as mesmas perguntas

como posso resolver isto?

repeat
randomize;
valor := random(4);

seek(ficheiro,valor);
read(ficheiro, p);

writeln('Pergunta:');
writeln(p.pergunta);
writeln('Opcoes');
writeln('A: ',p.resp1,' B: ',p.resp2);
writeln('C: ',p.resp3,' D: ',p.resp4);

writeln('Pretende usar o bonus? (S/N)');
ajuda:=readkey;

if (ajuda = 's') and (cont = 3) then
begin
writeln('Todos os bonus usados !');
readkey;
end
else
begin
if (ajuda = 's') and (cont <> 3) then
begin
for i:=3 to 3 do
begin
//ajudas[i]:=ajuda;
cont:=cont+1;
writeln(cont,' de 3 bonus usados');
readkey;
end;
end;
end;

if ajuda <> 's' then
begin
writeln('Ajuda nao usada');
readkey;
end;


writeln('Responda a pergunta');
resposta:=readkey;
if resposta = p.respcerta then
begin
writeln('A Resposta esta....');
delay(900);
writeln('....CORRRETA!!''');
delay(500);

contapatamar:=contapatamar+1;
if contapatamar = 1+1 then
begin
contapatamar:=PAT1;
end;
if contapatamar = PAT1+1 then
begin
contapatamar:=PAT2;
end;
if contapatamar = PAT2+1 then
begin
contapatamar:=PAT3;
end;
if contapatamar = PAT3+1 then
begin
contapatamar:=PAT4;
end;
if contapatamar = PAT4+1 then
begin
contapatamar:=PAT5;
end;
if contapatamar = PAT5+1 then
begin
contapatamar:=PAT6;
end;
if contapatamar = PAT6+1 then
begin
contapatamar:=PAT7;
end;
if contapatamar = PAT7+1 then
begin
contapatamar:=PAT8;
end;
if contapatamar = PAT8+1 then
begin
contapatamar:=PATFINAl;
end;

writeln('Parabens, voce passou ao seguinte patamar (',contapatamar,')');

end
else
begin
writeln('A Resposta esta....');
delay(500);
writeln('....errada');
delay(500);
writeln('Voce perdeu o jogo');
close(ficheiro);
Fim:=1;
end;
until fim = 1;
readkey;
Edited by thoga31
GeSHi
Link to comment
Share on other sites

Olá, @rrm1. Antes de mais, bem-vindo ao P@P 😉

Como não estamos perante um programa que dependa de rapidez de execução, podes recorrer aos conjuntos.

var perguntas_nao_sairam : set of byte;

Se tiveres 10 perguntas, inicias o conjunto desta forma:

const Num_Perguntas = 10;
// ...
perguntas_nao_sairam = [1 .. Num_Perguntas];

Quando sair uma dada pergunta, subtrais o conjunto:

perguntas_nao_sairam := perguntas_nao_sairam - [pergunta_escolhida];

Mas, para evitar que saiam as mesmas perguntas, metes um ciclo com essa condição:

repeat
  // processo aleatório de seleccção
until pergunta_escolhida in perguntas_nao_sairam;

Esta solução pode ser optimizada, mas talvez seja a mais simples de implementar. 😉

Cumprimentos.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Antes de mais, o Randomize não pode estar dentro do ciclo. Tem de ficar fora. Dentro do ciclo, fica apenas o Random.

Sobre a questão:

A ideia do Set of Byte é boa.

Outra seria um array de Booleans.

Num ou noutro caso, será preciso inicializar a variável de perguntas saidas para que não falhe nada.

No caso do set of byte seria assim:

perguntas_nao_sairam:=[0..255];

À parte disto, podes optimizar o programa alterando o teu record, tipo isto:

type
  TPerguntas = Record
    Pergunta: String;
    Resposta: Array['A'..'D'] of String;
    Correcta: ['A'..'D'];
  end;

Com o record estruturado assim, podes aceder à pergunta directamente pela sua letra correspondente.

Isto facilitará imenso o trabalho, e deixa o codigo mais limpinho e facil de compreender. Tipo:

repeat
  valor := random(Filesize(ficheiro)-1);  // Assim, ele irá achar um nº atendendo ao numero de perguntas guardadas no ficheiro
until valor in perguntas_nao_sairam; // arranja um numereo de pergunta até que esse numero não tenha saido

Perguntas_nao_sairam:=perguntas_nao_sairam-[valor];  // Marca a pergunta escolhida como já tendo saido

seek(ficheiro,valor);  // Procura a pergunta no ficheiro
read(ficheiro, p);     // Lê a pergunta do ficheiro

Writeln('Pergunta: ',P.Pergunta);  // Escreve a pergunta

for ch='A' to 'D' do
  Writeln(ch,': ',p.Resposta[ch]); // Escreve as 4 respostas

Write('Qual a resposta certa [A a D]? ');  // Pergunta qual é a resposta correcta

repeat
 ch:=UpCase(readkey);
until ch in ['A'..'D'];  // Lê a resposta numa só tecla (não é preciso dar enter) até que este esteja entre A e D

if ch=p.Correcta
  then Writeln('A resposta está correcta!')
  else Writeln('Resposta errada. A resposta correcta seria: ',p.Respostas[ch]);  // Mostra a resposta correcta
Edited by nunopicado
Correcção de gralha na linha 7 do 3º bloco de código

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.