Fecha y hora actual: Sábado 24 Ago 2019 04:12
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder al Tema Ir a página Anterior1234567Siguiente

Índice del Foro > Programación en general > Programando desde 0: 13- Un proyecto dificil: Master Mind.

Autor Mensaje
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Martes 27 Dic 2011 19:23

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Tu pregunta no es algo trivial, sino que es parte de un análisis del problema que se te plantea y de cuál es la mejor manera de solucionarlo.

El generar números al azar lleva varias cuentas matemáticas complejas, sin embargo, hoy en día dichas cuentas no llevan mucho tiempo de ejecución. La forma correcta de obtener un código al azar de la forma que tú planteas es, dado un nuevo caracter, compararlo con TODOS los anteriores del arreglo uno a uno y verificar que siempre sea distinto. Si para alguno no lo es entonces se invoca a RANDOM nuevamente.

Esta solución es válida para este caso porque estamos trabajando con un arreglo pequeño y pues, en su momento fue la que yo utilicé. Sin embargo, MASTER MIND se vuelve mucho más complejo si se admiten caracteres repetidos en el código. Esto soluciona el problema con RANDOM pero vuelve un dolor de cabeza el calcular los REGULARES.

Si estuviéramos trabajando con un arreglo muy extenso claramente no es para nada eficiente recorrer todo el arreglo cada vez que queremos obtener un nuevo caracter aleatorio. En ese caso, tal vez sería mejor ir guardando los rangos de caracteres que no han salido sorteados a modo de que cada vez que invocamos a RANDOM lo hagamos sobre un rango de caracteres válidos.

Por ejemplo, si nuestros caracteres posibles fueran

A B C D E F G H

y en el primer sorteo sale la D, para el próximo sorteo tenemos dos rangos válidos

A B C y E F G H

entonces nuestro próximo sorteo debería ser sobre uno de esos rangos.

Esto hace mucho más complejas las cosas, y cuando digo mucho es MUCHO. El código será más eficiente pero estará complicado.
Asimismo trae ciertas complicaciones como:

** Cada vez que sale un caracter tenemos nuevos rangos válidos disponibles.

** ¿En base a qué elijo el rango sobre el cual sortear? ¿Al azar?

** ¿Cómo distingo un rango de otro?

** ¿Cómo hago para sortear caracteres de un rango dado a partir de otro?

Y así otras tantas cosas. Eso, en sí, no forma parte del curso de Pascal, pero ustedes mismos ya van viendo los problemas que surgen al querer implementan una solución computacional para un problema dado.

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jordimor



Registrado: 23 Dic 2011
Mensajes: 8

Mensaje Publicado: Miércoles 04 Ene 2012 03:14

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

lo acabe, profesor, y despues de testearlo bastante y corregir fallos creo que esta todo bien, pero si usted encuentra algo ilogico o que este mal, digamelo por favor

se me olvido subir el que inicialmente pedia, asi que aqui le pongo el ultimo que hice

Código:
PROGRAM MasterMind;

USES crt;

Const
  MAXIMO_INTENTOS= 10;
  LARGO_CODIGO= 5;
  PRIMERA_LETRA= 'A';
  ULTIMA_LETRA= 'H';

Type
  validos=PRIMERA_LETRA..ULTIMA_LETRA;
  arr= array[1..LARGO_CODIGO] of validos;
  arr1= array[1..LARGO_CODIGO] of char;
  tabla= array[1..MAXIMO_INTENTOS,1..LARGO_CODIGO] of validos;
  arr2= array[1..MAXIMO_INTENTOS] of integer;
Var
  pensador: arr;
  adivinador: arr1;
  bien, regular: integer;
  i, j: integer;
  error, acierto: boolean;
  intentos: integer;
  todosintentos: tabla;
  arrbien, arrregular: arr2;
  final: char;
  empezar: boolean;
  opcion: char;

BEGIN
  randomize;

  writeln('¡¡¡Bienvenido a Master Mind!!!');
  readln;
  writeln;
  writeln('En este juego usted tendrá que buscar un código al azar generado por el');
  writeln('programa.');
  writeln;
  writeln('Dicho código constará de ',LARGO_CODIGO,' elementos, los cuales serán letras MAYÚSCULAS entre');
  writeln('la ',PRIMERA_LETRA,' y la ',ULTIMA_LETRA,'.');
  writeln;
  writeln('Además, ningún elemento podrá repetirse o no estar entre los válidos. Si esto');
  writeln('sucede, se le mostará un mensaje de error y se les volverá a pedir el código.');
  writeln;
  writeln('Cada vez que efectúe un intento, el programa le mostrará primero cuántas letras');
  writeln('están colocadas correctamente y después cuantas aparecen en el código pero en');
  writeln('distinto orden.');
  writeln;
  writeln('En total, dispondrá de ',MAXIMO_INTENTOS,' intentos para acertar.');
  writeln;

  empezar:= TRUE;

  REPEAT
  write('<<PULSE INTRO PARA EMPEZAR>>');
  readln;
  clrscr;

  FOR i:=1 to LARGO_CODIGO do
    REPEAT
     error:=FALSE;
     pensador[i]:= chr(random(ord(ULTIMA_LETRA)-ord(PRIMERA_LETRA)+1)+ord(PRIMERA_LETRA));
      If i<>1 then
       FOR j:=1 to (i-1) do
         If pensador[i]=pensador[j] then
          error:=TRUE;
    UNTIL NOT error;


  FOR i:=1 to MAXIMO_INTENTOS do
    begin
    FOR j:=1 to LARGO_CODIGO do
      todosintentos[i,j]:='A';
    arrbien[i]:=0;
    arrregular[i]:=0;
    end;

  acierto:=FALSE;
  error:=FALSE;
  intentos:=0;
  i:=0;
  j:=0;

  REPEAT
   bien:=0;
   regular:=0;
   intentos:=intentos+1;
   writeln('Intentos restantes--> ',MAXIMO_INTENTOS-intentos+1);
   writeln;

   REPEAT
   write(intentos,') ');
   i:=0;
   bien:=0;
   regular:=0;
   error:= FALSE;

    REPEAT
     i:=i+1;
     read(adivinador[i]);
     error:=(ord(adivinador[i])<ord(PRIMERA_LETRA)) or (ord(adivinador[i])>ord(ULTIMA_LETRA));

     If NOT error then
     begin
     If i=LARGO_CODIGO then
      begin
       REPEAT
       read(final);
       If (ord(final)<>13) and (ord(final)<>32) then
       error:=TRUE;
       UNTIL error or (ord(final)=13);
      end;

     If i<>1 then
      For j:=1 to (i-1) do
       If adivinador[i]=adivinador[j] then
       error:=TRUE;

     For j:=1 to LARGO_CODIGO do
       begin
       If adivinador[i]=pensador[j] then
         begin
          If i=j then
            bien:=bien+1
          else
            regular:=regular+1;
         end;
       end;
     end;
    UNTIL error or (i=LARGO_CODIGO);

   If error then
      begin
      readln;
      writeln('ERROR. Código inválido.');
      writeln;
      end;

  UNTIL NOT error;

  acierto:=bien=LARGO_CODIGO;

  For i:=1 to LARGO_CODIGO do
    todosintentos[intentos,i]:=adivinador[i];

  arrbien[intentos]:=bien;
  arrregular[intentos]:=regular;

  write('Bien: ':9,bien);
  write(' | ');
  writeln('Regular: ',regular);

  If NOT acierto then
  begin
  readln;
  clrscr;

  For i:=1 to intentos do
   begin
    write(i,') ');
    For j:=1 to LARGO_CODIGO do
      write(todosintentos[i,j]);
    write(' -->');
    write('Bien: ':9,arrbien[i]);
    write(' | ');
    writeln('Regular: ',arrregular[i]);
   end;

  writeln;
  writeln;
  end;

  UNTIL acierto or (intentos=MAXIMO_INTENTOS);

  writeln;

  If acierto then
    writeln('¡¡CORRECTO!! Felicidades, has ganado.')
  else
    begin
    writeln('Lo siento, has alcanzado el número máximo de intentos.');
    write('El código era: ');

    For i:=1 to LARGO_CODIGO do
     write(pensador[i]);
    end;

  writeln;
  writeln('FIN DEL JUEGO');
  readln;
  readln;
  clrscr;
  writeln('¿Desea volver a jugar?');
  writeln('SI --> 1');
  writeln('NO --> 2');
  readln(opcion);

  While (opcion<>'1') and (opcion<>'2') do
   begin
   clrscr;
   writeln('No ha elegido una opción válida. Seleccione 1 ó 2:');
   writeln('SI --> 1');
   writeln('NO --> 2');
   readln(opcion);
   end;

   If opcion='1' then
     empezar:=TRUE
   else
     empezar:=FALSE;

  UNTIL (NOT empezar);

  writeln('PULSE INTRO PARA SALIR');
  readln;
END.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Miércoles 04 Ene 2012 17:00

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Al parecer funciona todo bien, al menos con las pruebas más comunes.

Excelente trabajo. Se ve que le has pillado el gustito a esto de la programación...

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Jueves 16 Feb 2012 21:18

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

profe, muy buen curso estoy, haciendo el MASTER MIND y esta dificil.
y le queria hacer una pregunta, generar el codigo del pensador lo hice pero como hizo 'sr floyd' para que el codigo no pasara de la 'a' y la 'j'??.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Viernes 17 Feb 2012 00:13

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

La idea es jugar con los ordinales de los caracteres, es decir que si tu quieres obtener letras en la A y la D, por ejemplo, sabes que el ordinal que obtengas debe ser menor que el de la D, es decir, menor que 68.

De este modo tienes varias opciones, es decir que, si obtienes un número mayor que 68 puedes volver a sortear otro número al azar. Hay otras maneras para jugar con rangos de números. Por ejemplo, cómo haces con RANDOM para obtener un número al azar entre 32 y 37???

Pues debes ver la cantidad de números posibles a obtener, en este caso 5 ya que 37-32=5.

Entonces sorteas números al azar entre 0 y 4 y al resultado le sumas 32. De este modo, si sale el 0 es como si saliera el 32, si sale el 1 es como si saliera el 33 y así.

Espero que eso te ayude. Sino te lo explicaré de otro modo.

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Viernes 17 Feb 2012 04:21

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

gracias si me ayudo, pero entonces eso no impide que salgan letras repetidas, porque ahi solo verifica que no se salga del rango, o sea [a,j].

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Viernes 17 Feb 2012 13:54

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Exacto. Eso tienes que resolverlo tú mismo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Viernes 17 Feb 2012 18:12

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

entonces para resolver eso podria hacer otro arreglo y llenarlo con las letras que voy a ocupar 'a', 'b', 'c'...'j', y despues escojo con un random las cuatro letras del codigo del pensador en el arreglo que acabo de hacer y cada vez que escojo una letra de ese arreglo lleno esa posicion con un '1' y despues verifico, si la posicion que escogio vale 1 entonces que escoja de nuevo, entiende??

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Sábado 18 Feb 2012 00:15

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Podría ser. La lógica que apliques depende de tí. Piénsala, impleméntala y verifica si funciona.

Luego me muestras como te quedó. Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Sábado 18 Feb 2012 01:08

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

oiga profe una pregunta, cuando uno llama a la funcion random lo hace asi:

Código:

chr(random(x));


ese CHR quiere decir caracter, mi pregunta es : ¿se puede poner otra cosa, o sea, si es que hay por ejemplo que el random sea solo numerico o tengo que indicarle con + y un numero.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Sábado 18 Feb 2012 01:39

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

jaja creo que me respondi solo, con respecto a mi pregunta probando se me ocurrio poner integer y me lo acepto ahora me tira random de numeros enteros.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Miércoles 22 Feb 2012 17:57

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

si funciona profe la probe como 10 veces y todas letras diferentes entre la I y la J. ahora puedo seguir.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Miércoles 22 Feb 2012 19:03

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Perfecto. Justamente la idea es que tú mismo probando aprendas, ya te habrás dado cuenta de lo mucho que vas arraigando conocimientos al romperte las neuronas cada vez que algo te tranca.

Sigue así. Esperaré tus preguntas y comentarios. Buen trabajo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
AndresTJ96
Usuario Iniciado


Registrado: 08 Dic 2011
Mensajes: 40

Mensaje Publicado: Domingo 04 Mar 2012 04:15

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Profe ya termine el 'Master Mind' aki va:

Código:


program mastermind;

uses crt;

const
        largo_codigo=4;

type

        limite= 1..8;
        arreglo=array[1..largo_codigo] of char;
        arreglo2=array[1..8] of char;

VAR
        i, j, l, x, z, oportu, contoportu, buenas, regulares:integer;
        CP, CA:arreglo;
        rango:arreglo2;
        boleano, adivino, perdio, error, repetido: boolean;

BEGIN
        randomize;
        clrscr;
        repetido:=false;
        error:=true;
        boleano:=false;
        oportu:=20;
        contoportu:=0;
        x:=97;

        //ASIGNACION DE VALORES A CP(codigo pensador)//
        for l:=1 to 8 do
        begin
        ord(rango[l]):=x;
        x:=x+1;
        end;
        repeat
        begin
        l:=1;
        for j:=1 to largo_codigo do
        begin
        error:=true;
        while (error=true) do
        begin

        while (error=true) do
        begin
        z:=integer(random(8));
        if (z<1) or (z>8) then
        error:=true
        else
        begin
        l:=z;
        error:=false;
        end;
        end;
        CP[j]:=rango[l];
        if (rango[l]='1') or (l>8) then
        error:=true
        else
        error:=false;
        end;
        rango[l]:='1';
        end;
        end;
        until (error=false);


        write('Bienvenido al juego "Master Mind" ');
        writeln;
        write('Presione "ENTER" para empezar...');
        readln;
        clrscr;

        //LECTURA CA(codigo adivinador)//
        repeat
        begin
        regulares:=0;
        buenas:=0;
        l:=1;
        j:=1;
        contoportu:= contoportu + 1;
        repeat
        begin
        write('Tiene ',oportu,' oportunidades.');
        writeln;
        write('Rango de posibilidades [a,h].');
        writeln;

        write('==) Codigo: ');
        for i:=1 to largo_codigo do
                read(CA[i]);

        readln;
        i:=1;
        repetido:=false;
        repeat
        begin
        l:=1;
                repeat
                begin
                if (l<=largo_codigo) then
                begin
                if (CA[i]=CA[l]) and (i<>l) then
                begin
                        repetido:=true;
                        writeln('ERROR. Hay caracteres repetidos.');
                end
                else
                        repetido:=false;
                end;
                l:=l+1;
                end;
                until  (l=largo_codigo+1) or (repetido=true);
        i:=i+1;
        end;
        until (i=largo_codigo+1) or (repetido=true);
        end;
        until (repetido=false);

        //resultados 'buenas' y 'regulares'.//
        i:=1;
        repeat
        begin
        l:=1;

                while (l<=largo_codigo) do
                begin


                if (CA[i]=CP[l]) and (i<>l) then
                        regulares:=regulares+1
                else
                if (CA[i]=CP[l]) and (i=l) then
                                buenas:=buenas+1;

                l:=l+1;
                end;

        i:=i+1;
        end;
        until (i=largo_codigo+1);

        write('buenas ',buenas);
        write('  regulares ',regulares);
        writeln;
        oportu:= oportu -1;
        j:=1;
        i:=1;
        if (contoportu=20) then
        perdio:=true;

        if (buenas=largo_codigo) then
        adivino:=true;
        end;
        until (adivino=true) OR (perdio=true);


        if (adivino=true) then
        write('Feliciades, ha acertado. ')
        else
        begin
                if (perdio=true) then
                write('Lo siento, no ha acertado. ');
        end;

        write('El codigo a adivinar era, ');
        for j:=1 to largo_codigo do
                write(CP[j]);

        readln;



END.


porfa pruebelo a ver que tal.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Domingo 04 Mar 2012 17:00

Título del mensaje: Re: Programando desde 0: 13- Un proyecto dificil: Master Min

Responder citando

Al parecer funciona bien. Estuve jugando un poco y ha funcionado. Tendría que hacerle algún test riguroso pero no ando con mucho tiempo.

Buen trabajo. Sigue adelante que vas por buen camino.

Saludos y gracias por realizar este proyecto.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página Anterior1234567Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Buenas desde el sur del sur =)

Maugarni Preséntate a la comunidad 1 Jueves 22 Ago 2019 14:09 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Hola desde bcn

Dav2k6 Preséntate a la comunidad 2 Miércoles 26 Jun 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Existen problemas al descargar musica desde you...

SusanaP Tu PC 2 Martes 26 Mar 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

hola!! los saludo desde argentina

mery Preséntate a la comunidad 2 Jueves 13 Dic 2018 17:28 Ver último mensaje
El tema está bloqueado: no pueden editarse ni agregar mensajes.

Solicito programadores para mi proyecto

alexpin Bolsa de trabajo 0 Miércoles 23 May 2018 22:53 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,