Vistas de página en total

martes, 16 de julio de 2013

AHORCADO (1/5)

     Como ya voy haciendo en el blog, voy a subir el nivel un poco más. Para ello  colocaré el código de otro de los juegos más programados como ejemplo, el "AHORCADO".
     Como este juego resulta más complejo que el anterior, lo realizaré en 5 entradas.
      En la primera que es la de hoy explicaré el planteamiento del programa. Es decir haré un análisis de las necesidades para poder estructurar el programa. No colocaré ordinogramas ni pseudocódigos, ya que resultan más complejos de hacer que el propio programa.
     Aunque no sirvan en muchos casos los pseudocódigos, si suelen servir los ordinogramas. Lo que sucede es, que al ser tan simple el lenguaje ensamblador, resulta igual de claro hacer un ordinograma que representar el código en una forma de borrador.
   
     Las 4 entradas del blog las estructuraré de la siguiente manera:
                   1- (La de hoy) Plantearé el problema y organizaré los datos. El segmento Code.
                   2- Primera rutina auxiliar
                   3- segunda rutina auxiliar
                   4- secuencia principal, y por lo tanto programa completo.


     PLANTEAMIENTO

     Como hemos dicho antes, vamos a comenzar por definir el juego, para saber lo que necesitamos construir y en que nos vamos a apoyar.


    Esta será la pantalla durante el juego. Faltan los mensajes finales en caso de perder o acertar.
    Por lo tanto necesitamos ser capaces de dibujar al muñeco y la horca. Cosa facil en principio, para ello usaremos las funciones puts y putchar.+

   ESTRUCTURA
   Necesitamos elegir una palabra de forma aleatoria. En este caso no es un número y por lo tanto parece más difícil, pero en realidad es igual de simple. Generaremos un número que nos permita elegir la palabra. Para ello crearemos una función nw_pal en la que usaremos random, con una lista de punteros a una lista de palabras.
   Necesitamos pedir una letra. Para ello usamos getch. Pero como la letra pueden ponerla en mayúsculas o en minúsculas, para no tener todas las combinaciones de palabras
    Necesitamos buscar la letra dentro de la palabra y definir si la hemos encontrado y si están todas las letras encontradas. Para ello deberemos crear una función buscar.
   Necesitamos dibujar el muñeco, según los errores que se vayan cometiendo. para ello crearemos una función muneco.
    
   Con todo esto ya tenemos analizada la situación del juego. Crearemos tres funciones, muneco (dibuja el muñeco según los errores), nw_pal (selecciona de forma aleatoria una palabra y buscar (busca la letra en la palabra seleccionada).
   Básicamente el código principal entonces queda como el del mastermind, ya que nw_pal equivale a random, muñeco a printf, y buscar a cmp.

     DATOS

   El segmento de datos lo expongo debajo de esta explicación.
   Primero definimos la lista de palabras. Como es un juego ejemplo, no pondré muchas, 16 en concreto para que sean seleccionables con un nibble.
   Quiero que las palabras sean libres, es decir que no estén sujetas a una longitud fija. Esto me plantea el problema de su indexación. Sin su longitud no es fija, no puedo localizarlas con la formula pos=x*longitud.
Pero en  cambio el juego ganará potencia si su longitud es variable.
    Para resolver este dilema, lo que haremos es crear 16 variables db, en las que escribiremos las palabras en formato string. Es decir, colocamos un byte con su longitud y luego una cadena de caracteres terminada en 0. Así podrá ser identificada y manejada de forma fácil.
   Como queremos usar la formula pos=x*longitud para poder seleccionar la palabra a través de un número random, y las palabras no tienen  longitud fija, debemos usar un truco. Este consiste en realizar una tabla de punteros (2 bytes= 1dw), con las direcciones de cada palabra. Así podremos desplazarnos por la tabla con la formula pos=x*2, y seleccionar cualquier palabra a partir del número x generado a través de random.

    La tabla es fácil de crear como una variable dw cuyos valores son los offset de cada palabra.
   Una vez elegida la palabra debemos usarla como el número a buscar. Por ello se pasará su dirección a una variable fija a_buscar. Esta es la misión de la rutina nw_pal. Deberá generar un número aleatorio, indexar con el en la tabla, recoger la dirección de la palabra elegida y guardarla en a_buscar
   Esta era la parte dificil. El resto no hace falta explicarlo. Necesitamos una variable para llevar la cuenta de fallos (fallos), y una variable para ir representando la palabra con las letras encontradas (mascara).
   El dibujo de horca está hecho mediante una lista de números, para evitar que el notepad, guarde mal los códigos ascii especiales. Si usais un editor de dos como ED no hará falta y podréis representar la barra como un texto.

_data
;palabras
p1 db 9,"BARCELONA",0
P2 DB 4,"CASA",0
P3 DB 4,"CAMA",0
P4 DB 5,"ARBOL",0
P5 DB 7,"ARMARIO",0
P6 DB 5,"COJIN",0
P7 DB 5,"SUELO",0
P8 DB 4,"FLOR",0
P9 DB 3,"PAN",0
P10 DB 11,"ENCRUCIJADA",0
P11 DB 4,"HOJA",0
P12 DB 8,"CUADERNO",0
P13 DB 11,"ENSAMBLADOR",0
P14 DB 8,"PROGRAMA",0
P15 DB 7,"COLEGIO",0
P16 DB 6,"CAMARA",0
; tabla de indexación
TABLA DW OFFSET P1
      DW OFFSET P2
      DW OFFSET P3
      DW OFFSET P4
      DW OFFSET P5
      DW OFFSET P6
      DW OFFSET P7
      DW OFFSET P8
      DW OFFSET P9
      DW OFFSET P10
      DW OFFSET P11
      DW OFFSET P12
      DW OFFSET P13
      DW OFFSET P14
      DW OFFSET P16

PAL_SEL DW 0
mascara DB "__________________________",0

a_buscar dw 0
letra db 0
fallos db 0
titulo db "AHORCADO",0
pregunta db "INDICA UNA LETRA",0
acierto db "!Enhorabuena! Acertaste",0
perdio db "!Lo siento! Has periddo",0
NW_intento db "Quieres intentarlo de nuevo? S/N",0
limpia db "    ",0
HORCA DB 218,196,196,196,0   ;"┌───┐"
ends

2 comentarios:

  1. podria ponerme un ejemplo sencillo de un juego que mejore la abilidad de tecleado, por ejemplo que balla mostrando palabras al asar y que cuando uno las teclee todas salga la cantidad de beces que te has equivocado y la cantidad de tiempo que demoraste en hacerlo, yo lo e estado intentando de hacer como un ejercicio para mejorar mis abilidades en ensamblador ya que soy un novato pero siempre hay algo que me de error, podrias ayudarme, mi correo es aemiranda@estudiantes.uci.cu y soy de Cuba, agradecere si me ayudas con eso porque ya lo e intentado muchas veces y no tengo a nadie que me ayude

    ResponderEliminar
    Respuestas
    1. Ante todo gracias por leer mi blog. Es difícil ayudarte en un programa complejo, sin darte el código ya hecho. Yo no tengo tiempo para generarte un código a medida, y eso además no te enseñaría nada.
      El programa que quieres es parecido al ahorcado, pero en vez de comparar las letras simplemente comparas todas y si no coinciden subes el contador. Pero cambia el algoritmo mucho.
      Para mejorar tus problemas al compilar debes de estar seguro del compilador que usas y que funciones incorpora. Así mismo debes de saber las librerías que usas y dónde están. Muy complejo, para hacerlo por correo.
      En mi blog, si lo lees desde el principio, voy desarrollando macros y librerías propias para poder llegar hasta este programa con tus propios medios y con un compilador muy básico, sin librerías externas.
      A su vez,hay una entrada en la que explico, con un ejemplo, como traducir literalmente un programa "C" a mi estructura.
      Por lo que yo te recomiendo, si no conoces ensamblador, hacer el algoritmo y probarlo en ANSI "C". Luego si lees la entrada y usas mis librerías, compatibles con la estructura C. Es muy fácil traducir el programa de C a ensamblador

      Eliminar

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.