rrm1 Posted June 24, 2012 at 04:37 PM Report Share #465228 Posted June 24, 2012 at 04:37 PM (edited) 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 June 24, 2012 at 04:53 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
thoga31 Posted June 24, 2012 at 04:57 PM Report Share #465232 Posted June 24, 2012 at 04:57 PM (edited) 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 June 24, 2012 at 04:58 PM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted June 24, 2012 at 06:04 PM Report Share #465241 Posted June 24, 2012 at 06:04 PM (edited) 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 July 1, 2012 at 05:05 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now