elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Mastermind
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mastermind  (Leído 5,393 veces)
N0body

Desconectado Desconectado

Mensajes: 95


Ver Perfil
Mastermind
« en: 30 Abril 2010, 05:31 am »

Bueno, luego de un gran descanso empezaré a postear nuevamente mis cosillas.

Aquí un jueguito que muchos quizás lo tengan en su casa con el nombre de "Mastermind"

El juego se base en adivinar un número de n dígitos elegido aleatoriamente por la máquina (el número de dígitos n es ingreso).

Pero se cuentan con una serie de pistas, lo que no indica que en el juego no influya la suerte obvio, pero lo hace un juego más para pensar que para "tirar números al azar".

Estas pistas consiste en dar al usuario el número de cifras en las que ha acertado. Y el número de cambios o conmutaciones que podrían hacer para hacer que una ficha que está incorrecta, lo esté.
Un ejemplo vale más que mil palabras:

Imaginemos que n vale 4 (osea, estamos operando con 4 dígitos)

El número elegido por la pc es: 3345

Nosotros ingresamos el: 5542

Cantidad de aciertos (o blancas): 1 (el 4 en la tercera posición)
Cantidad de rojas: 1 (ya que si bien tengo dos 5, osea, dos incorrectas, en la incógnita tengo sólo un 5. Así que el otro está de más)


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LIMPIAR_PANTALLA system("cls");
  5.  
  6.  
  7.  
  8.  
  9. int esnumero (const char usuario[], int cant)
  10.    {
  11.        while (cant)
  12.            if ( usuario[--cant]<'0' || usuario[cant]>'9' )
  13.                return 1;
  14.        return 0;
  15.    }
  16.  
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.  FILE *historial;
  21.  char *incognita, *usuario, h;
  22.  int cant, i, j, blancas, rojas;
  23.  srand (time(NULL));
  24.  
  25.  do {
  26.        printf ("Ingrese la cantidad de caracteres para jugar: ");
  27.        scanf ("%i", &cant);
  28.    } while (cant<1);
  29.  
  30.  do {
  31.      printf ("\n\nDesea guardar el historial de la partida (ingrese 1 por si y 0 por no): ");
  32.      scanf ("%i", &h);
  33.    } while (h!=0&&h!=1);
  34.  
  35.  if (h)
  36.    if (! (  historial = fopen ("historial.txt", "w")  )  )
  37.        {
  38.            do {
  39.                printf ("\n\n\nHa surgido un error al crear el historial. Que desea hacer:\n1-Cerrar el programa\n2-Continuar sin guardar el historial\n\n\tOpcion: ");
  40.                scanf ("%i", &h);
  41.                } while (h!=0&&h!=1);
  42.            if (h)
  43.                return 0;
  44.            else
  45.                h=0;
  46.        }
  47.  
  48.  usuario = (char *) malloc (cant);
  49.  incognita = (char *) malloc (cant);
  50.  
  51.  for (i=0 ; i<cant ; i++)
  52.    incognita[i] = rand ()%10+'0';
  53.  incognita[cant] = '\0';
  54.  
  55.  if (h)
  56.    fprintf (historial, "%s\n\n\n", incognita);
  57.  
  58.  for (i=0,j=0 ; i<cant ; i++)
  59.    {
  60.    j *= 10;
  61.    j += 9;
  62.    }
  63.  // Programa propiamente dicho:
  64.  LIMPIAR_PANTALLA
  65.  printf ("A continuacion debe numeros entre 0 y %i hasta que adivine el numero\nLuego de cada numero le aparecera las pistas\n\nAprete una teclea para comenzar a jugar...", j);
  66.  system ("PAUSE>>nul");
  67.  LIMPIAR_PANTALLA
  68.  
  69.  do {
  70.        do
  71.            scanf ("%s", usuario);
  72.              while (strlen (usuario) != cant || esnumero (usuario, cant) );
  73.  
  74.        if (h)
  75.            fwrite (usuario, 1, cant, historial);
  76.  
  77.        blancas=0;
  78.        rojas=0;
  79.  
  80.        for (i=0;i<cant;i++)
  81.            if (incognita[i]==usuario[i])
  82.                {
  83.                    usuario[i] = 'b';
  84.                    blancas++;
  85.                }
  86.  
  87.        for (i=0;i<cant;i++)
  88.            if (usuario[i]!='b')
  89.                for (j=0;j<cant;j++)
  90.                    if (usuario[j]!='b'&&usuario[j]!='r'&&incognita[i]==usuario[j])
  91.                        {
  92.                        usuario[j] = 'r';
  93.                        rojas++;
  94.                        break;
  95.                        }
  96.  
  97.        if (h)
  98.            fprintf (historial, "\nBlancas: %i Rojas: %i\n\n", blancas, rojas);
  99.  
  100.        printf ("Blancas: %i Rojas: %i\n\n", blancas, rojas);
  101.  
  102.    } while (blancas!=cant);
  103.  
  104.    LIMPIAR_PANTALLA
  105.  
  106.    printf ("\n\tFELICITACIONES!\n\n\nUsted ha adivinado el numero (%s)\n\n", incognita);
  107.  
  108.  free (usuario);
  109.  free (incognita);
  110.  system("PAUSE");
  111.  return 0;
  112. }

Bueno, es un juego muy popular también en mi escuela.

PD: También posee la opción de guardar el historial del juego


« Última modificación: 30 Abril 2010, 05:35 am por N0body » En línea

N0body

Desconectado Desconectado

Mensajes: 95


Ver Perfil
Re: Mastermind
« Respuesta #1 en: 1 Mayo 2010, 04:01 am »

Bueno, ante la falta de comentarios creo que no entendieron de que va el juego.
Como no quiero privarlos de tal placer intelectual (sarcasmo).
Y quiero que comenten (verdadera intención).
He aquí un historial mío con los pensamientos deductivos que hice para adivinar el número a partir de las pistas. Vaya que tuve suerte, y me tocó un número fácil.
Capaz que tengo algún error de lógica porque mientras iba jugando una partida del juego anotaba mis deducciones y así como me quedo lo intercalé con el historial y lo pongo aquí.


Código:
---------------------------------------------------------
1233
Blancas: 0 Rojas: 0

...entonces no hay ni 1, ni 2 ni 3...


--------------------------------------------------------
4566
Blancas: 0 Rojas: 2

Hay un para rojo, puede ser:
4/5 5/6
4/6 6/6


------------------------------------------------------
6612
Blancas: 1 Rojas: 0

Con esto averigué que había un sólo 6 y que estaba en las posiciones 1 o 2
Por lo tanto el otro incorrecto debía ser un 4 o un 5 que podría ir en las posiciones 3 o 4 (para ambos) o 1 para el 5, o 2 para
el 4



------------------------------------------------------
6155
Blancas: 1 Rojas: 1

Esto puede significar que:
A) El 6 esté bien posicionado y que el 5 no va ni en 3, ni en 4, osea va en 2
B) O que el 6 vaya en 2 y el 5 esté bien en alguna de esas dos posiciones

Pero de cualquier modo nos asegura que el 5 está y por lo tanto el 4 queda descartado. Y que no hay más de un 5

***IMPORTANTE(vease abajo)

------------------------------------------------------
1651
Blancas: 2 Rojas: 0

Ahi me doy cuenta de que de las opciones A y B, la B es la correcta y además que el 5 va en la posicion 3.
Posibles (para las cifras sin adivinar): 7890



------------------------------------------------------
7891
Blancas: 1 Rojas: 0

Ahi sé que está bien el 7 y que ni el 8 ni el 9 están en el número, por lo que el dígito incógnita de la posición 4 es 0.



------------------------------------------------------
7650
Blancas: 4 Rojas: 0

Gané, me muestra el cartel que dice felicitaciones, que ustedes no verán nunca si no juegan! xD


***IMPORTANTE: no quiero hacer lío, pero soy un boludo importante. Cometí un error (igual gané, pero con un movimiento
 inecesario). La opción A es inválida: ya que si el 6 está bien en la pos 1, el 5 tiene que estar en la 2. Pero como vimos
antes el 5 no puede estar en 2! Por lo que logicamente el incorrecto es el 6... :P


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Juego Mastermind
Programación C/C++
adeur 3 5,134 Último mensaje 5 Julio 2012, 15:08 pm
por maxim_o
Ayuda juego Mastermind en C++
Programación C/C++
TheXiiscoZ 4 5,239 Último mensaje 11 Diciembre 2017, 03:56 am
por Serapis
Juego mastermind
Programación C/C++
Raskera 1 2,094 Último mensaje 26 Abril 2019, 20:05 pm
por Tachikomaia
IA para Mastermind. « 1 2 »
Programación General
Tachikomaia 13 8,494 Último mensaje 2 Marzo 2021, 18:32 pm
por assw1208
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines