Jump to content

[Snippet] Mastermind


thoga31
 Share

Recommended Posts

Há já algum tempo que não coloco aqui umas curiosidades em forma de código pascaliano 😄

Que tal um Mastermind? Este é um pouco mais "requintado" do que aquele que já existe actualmente: aceita números de 0 a 9, e mostra um "mapa" dos números certos, em posição incorrecta e errados.

Faltam alguns pormenores, como a capacidade de analisar correctamente tentativas com menos de 4 caracteres. Mas, no geral, funciona impecavelmente.

Enjoy 🙂

program mastermind2;  (* MASTERMIND P@P v2.0 *)

const MaxTent = 10;               // Número máximo de tentativas
     NDigs = 4;                  // Número de dígitos da sequência a adivinhar
     StrEmpty : string = '';
     ExisteEPosCorrecta = #219;
     ExisteEPosIncorrecta = #177;
     NaoExiste = #32;

type StrTent = string[NDigs];

var sequencia : StrTent;    // Sequência gerada aleatoriamente
   tentativa : StrTent;    // Tentativa do utilizador
   correccao : StrTent;    // Indicação dos dígitos correctos
   t : byte = 1;               // Nº tentativa
   certo : boolean;        // Sequência está 100% correcta?

function Int2Str(i : integer) : string;
(* Converte Integer para String *)
begin
   Str(i, Int2Str);
end;

function Ordena(s : StrTent) : StrTent;
(* Ordena uma string que contém os caracteres da correcção *)
var j, l : integer;  // contadores gerais
   aux : char;      // auxiliar para efectuar a troca
begin
   for j := 1 to NDigs do
       for l := j to NDigs do
           if ((s[j] in [ExisteEPosIncorrecta, NaoExiste]) and (s[l] = ExisteEPosCorrecta))
             or ((s[j] = NaoExiste) and (s[l] = ExisteEPosIncorrecta))
           then begin
               aux := s[j];
               s[j] := s[l];
               s[l] := aux;
               continue;
           end;
   Ordena := s;
end;

procedure CriarSequencia(var seq : StrTent);
(* Gera sequência de forma aleatória *)
var j : byte;
begin
   randomize;
   for j := 1 to NDigs do
       seq := seq + Int2Str(random(10));
end;

procedure Correcto(const seq, tent : StrTent; var transmissor : boolean; var corr : StrTent);
(* Compara "tent" com "seq", indica se é igual com "transmissor" e indica correcção por "corr" *)
var j : byte;

   function Contem(const dig : char; const seq : StrTent) : boolean;
   (* "seq" contém o caracter "dig"? *)
   var j : byte;
   begin
       Contem := false;
       for j := 1 to NDigs do
           if seq[j] = dig then begin
               Contem := true;
               break;
           end;
   end;

begin
   transmissor := true;
   corr := StrEmpty;
   for j := 1 to NDigs do
       if seq[j] = tent[j] then  // número está na posição correcta
           corr := corr + ExisteEPosCorrecta
       else begin
           if seq[j] <> tent[j] then begin
               transmissor := false;
               if Contem(tent[j], seq) then  // número existe mas está noutra posição
                   corr := corr + ExisteEPosIncorrecta
               else corr := corr + NaoExiste;  // número não existe
           end;
       end;
end;

begin (* BLOCO PRINCIPAL *)
   CriarSequencia(sequencia);
   correccao := StrEmpty;

   repeat
       write('Tentativa ', t, ': ');
       readln(tentativa);
       Correcto(sequencia, tentativa, certo, correccao);
       writeln('Resultado: ', #179, Ordena(correccao), #179);
       inc(t);
   until (t >= MaxTent) or certo;

   if certo then writeln('Acertou!')
            else writeln('Passou as ', MaxTent, ' tentativas...');

   readln; // pausa
end.

Knowledge is free!

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
 Share

×
×
  • 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.