Anterior Subir Seguir
Anterior: Conectando habitaciones
Subir: Índice

Un (mini) juego completo

Como colofón de este cursillo, a continuación tienes el fichero completo que crea el mini-juego-puzzle propuesto en la sección anterior. Leelo con detenimiento (todo lo que se escribe detrás de un signo "!" es un comentario que Inform ignorará, pero que sirve para explicar el programa a sus posibles lectores). Siéntete libre de modificarlo y experimentar con él. Aún podrían mejorarse algunas cosas (por ejemplo, el mensaje cuando intenta atravesar la pared sólo debería aparecer la primera vez que se intenta, y las veces restantes mejor poner otra cosa como "No gracias, ya me he llevado un golpe". Los objetos tienen un atributo llamado general que puede ponerse y quitarse a modo de bandera genérica para este tipo de cosas), y falta por manejar asuntos como la puntuación (que siempre es cero en este juego) o el añadir nuevos verbos a los que ya vienen en la librería (por ejemplo, el verbo "HACER" no es comprendido y es posible que el jugador intente "HACER PUERTA EN PARED"). Además de esto, nuestro juego no tiene ningún personaje con el cual interactuar (salvo el guardia que aparece debido a la alarma, pero este ni siquiera existe en términos del juego). Todos estos temas serán objeto de un futuro cursillo.

!-------------------------------------------------
Constant Historia "Cursillo";
Constant Titular  " Un ejemplo práctico paso a paso.^";

Include "EParser";
Include "Acciones";
Include "Facilitar";

!-------EMPIEZA LA DESCRIPCION DEL MUNDO
!
! *** LA CELDA INICIAL Y LOS OBJETOS QUE CONTIENE ***
Habitacion Celda "Lugar extraño"
with descripcion "Estás en una especie de celda de paredes metálicas y
    lisas. Hacia el norte no hay pared y fuera puedes ver un paisaje
    soleado. Hacia el sur hay un pasadizo.",
    al_s Celda2,
 
    ! La salida norte es complicada. Debe examinar si el objeto 
    ! cristal está cortado o no antes de decidir si el jugador
    ! puede pasar. Además debe mirar si el objeto cúpula ha
    ! disparado la alarma para ver si el jugador ha ganado
    ! o todavía no puede salir
    al_n [;
        if (cristal.cortado) 
        {
            if (cupula.alarma_sonando>0)
                "No puedes salir con esa alarma sonando. Te cogerían
                enseguida. Y te cogerán de todos modos si no la haces
                callar pronto.";
            else 
            {
                banderafin=2;  ! Fin del juego. Ha ganado!
                "Cruzas la puerta que tú mismo has creado en el muro
                de cristal y sales al exterior triunfante.";
            }
        }
        else   ! Si el cristal no está cortado...
            "Ouch! ¿Qué es esto? Lo que habías tomado por ausencia de
            pared es en realidad un muro de cristal transparente. ¡No puedes
            salir!";
    ];

Objeto Cupula "cúpula de cristal" Celda
with nombre 'cupula' 'tapa',
     adjetivos 'cristal',
     alarma_sonando 0, 
     descripcion [;
        if (self has abierta) "Está abierta.";
        else "Examinando con detenimiento la cúpula descubres una
        especie de juntura. Parece una tapa que podría abrirse.";
     ],
     si_abierta "En el centro de la habitación hay una cúpula de
           cristal con la tapa abierta.",
     si_cerrada [;
        print "En el centro de la habitación hay una cúpula de
            cristal";
        if (Diamante in Cupula) print " en cuyo interior refulge un
            increíble diamante";
        ".";
     ],
     antes [;
       Atacar, Cortar: "No es necesaria una acción tan drástica. La
                  cúpula tiene una tapa.";
     ],
     despues [;
     DejarSalir:
        if (children(Cupula)==0) !Si la cupula queda vacía
        {
            ArrancarDaemon(Cupula);
            "Al sacar ", (el) uno, " de la cúpula una alarma empieza a
                sonar en algún lugar del exterior.";
        }
        else "Consigues sacar ", (el) uno, " sin disparar la alarma.";
        
     Recibir:
        if (self.alarma_sonando>0) 
        {
            PararDaemon(Cupula);
            self.alarma_sonando=0;
            "Ufff. La alarma ha parado. Creo que nadie la ha
            escuchado.";
        }
    ],
    daemon [;  !** Se ejuta cada turno, si está activado
        self.alarma_sonando=self.alarma_sonando+1;
        switch(self.alarma_sonando) 
        {
         2:"La alarma sigue sonando fuera. Acabará por atraer a alguien.";
         3:"Definitivamente, esa alarma te está poniendo muy
            nervioso. Mejor devolvías el diamante a su sitio.";
         4: banderafin=1;
            "Súbitamente un rayo de luz vertical aparece en la 
            estancia y se ensancha hasta convertirse en un cilindro. 
            Cuando el resplandor se apaga ves que en su lugar ha 
            aparecido un guardia con equipamiento anti-disturbios. 
            ~Hmm~ dice, ~Te crees muy listo ¿eh? Me has sacado de la 
            siesta con esa maldita alarma y eso es algo que no 
            perdono.~";
        }
    ],      
has femenino recipiente transparente abrible ~abierta estatica;

Objeto Diamante "diamante luminoso" Cupula
with nombre 'diamante',
    adjetivos 'luminoso' 'autentico' 'refulgente' 'cegador' 'brillante',
    descripcion  "Tiene un brillo casi cegador, que no parece 
                 explicable por las leyes de la óptica.",
    antes [;
     Atacar: "No podría, es muy duro.";
    ],
has masculino;


! Finalmente la pared de cristal (oculta, no se menciona 
! en la descripción de la habitación)
! Tiene una propiedad ``cortado'' que hemos inventado para este
! objeto en particular. Ya que la librería no conoce esta propiedad
! debemos programar nosotros cómo cambia con las acciones del jugador
! El valor inicial de ``cortado'' es false. Cambiará a True cuando
! el jugador haga la acción correcta.
Objeto Cristal "pared de cristal" Celda
with nombre 'pared' 'rectangulo' 'puerta',
     adjetivos 'cristal',
     cortado false,  ! Está cortado el cristal?
     descripcion "La pared norte es de un cristal tan transparente que
            en un primer momento pensaste que no había pared.",
     antes [;
      Cortar, Atacar: !Para permitir CORTA y ROMPE
        if (Diamante in Jugador) ! Solo funciona si el jugador tiene
                                 ! el diamante bueno
        {
            self.cortado=true;
            "Usando el diamante cortas limpiamente un rectángulo en
            forma de puerta.";
        }
        else if (DiamanteFalso in Jugador) ! El falso no corta
        {
            "Intentas cortar el cristal usando el diamante rayado,
            pero sólo logras rayarlo más. No creo que este diamante
            sea auténtico...";

        } ! Y si no hay diamante, tampoco se puede cortar
        else "El cristal de la pared es demasiado resistente y no
        tienes herramienta para cortarlo.";
      Meterse: <<Ir obj_n>>;  ! Esto genera la acción de ir al norte.
                              ! Está aqui por si el jugador pone
                              ! ENTRA EN RECTANGULO o ATRAVIESA CRISTAL...
                              ! PASA POR PUERTA...

    ],
has femenino oculto;

         
!*** LA SEGUNDA CELDA Y LOS OBJETOS QUE CONTIENE ****
Habitacion Celda2 "Cubículo"
with descripcion "Estás en un cubículo de techo bajo. La única salida
    está al norte, por donde has entrado",
    al_n Celda,
    no_puedes_ir "Te he dicho que no hay más salidas.";

Objeto Caja "caja" Celda2
with nombre 'caja',
has  femenino recipiente abrible ~abierta;

Objeto DiamanteFalso "diamante rayado" Caja
with nombre 'diamante',
    adjetivos 'rayado' 'falso' 'pacotilla',
    descripcion "No brilla mucho porque su superficie está rayada. Hum
    ¿Un diamante rayado?",
    antes [;
     Atacar: "Es falso. Seguro que podría romperlo, pero ¿qué ganaría
        con ello?";
    ],
has masculino;


!---- Ya estan todos los objetos descritos. Ahora empieza el juego
[ Inicializar;
    localizacion=Celda;   ! En qué habitación empieza el jugador?
    "Bienvenido al...^";
];

Include "Gramatica";
!-----------------------------------------------------FIN DE FICHERO

Observar que existen algunos objetos que podrían causar ambigüedad. Por ejemplo si ambos diamantes están juntos y el jugador pone "Coge diamante" ¿a cuál se refiere?. Y si el jugador pone "Rompe cristal" ¿se estará refiriendo a la cúpula o a la pared?

Juega al juego y descubre cómo resuelve inform estas ambigüedades. Observa que es necesario que demos diferentes adjetivos a cada diamante para que la ambigüedad pueda ser resuelta.


Zak McKraken - spinf@geocities.com

Anterior Subir Siguiente