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.