Programación General > ASM (Ensamblador)

 Tablero 4x4 Letras Desordenadas

(1/1)

xernovil:
Hola! necesito ayuda, tengo varios programas que hacer y no me va a dar tiempo de acabarlos a tiempo, este creo que es el más sencillo, almenos desde mi punto de vista, pero necesitaría bastante rato para solucionarlo y tengo otros mucho mas complicados. A ver si me podéis echar una mano...

El enunciado está en catalán, pero creo que se entiende bastante bien.

Resumiendo lo que tengo que hacer es lo siguiente (el código es para Intel x86):

Tengo un tablero de 4 x 4, con letras en mayúsculas desordenadas, y una de las 16 posiciones es un espacio en blanco, para hacer correr las letras a través de ese espacio y ordenarlo alfabéticamente. Hay un número limitado de movimientos, y también tiempo limitado. El cursor de selección de letra no debe salir de lo que es la matriz, la letra debe desplazarse pulsando la tecla espacio a la posición que haya vacía y pulsando la tecla "q" debemos salir del programa.

Al pulsar la tecla espacio no se debe mover la ficha a no ser que el espacio vacío esté a su lado (arriba, abajo, izquierda, derecha), al mover la letra debe decrementarse en 1 el número de movimientos posible.

Si el tablero inicial contiene más de una o ninguna posicion vacía no se empezará a "jugar" y se indicará que hay demasiadas o ninguna casilla vacía y entonces acabará el programa, esta verificación se hará una sola vez al empezar el programa.

Si el número de movimientos se ha acabado se indicará que se ha perdido el juego y se acabará, del mismo modo, si las letras están ordenadas de la manera correcta, se indicará que has ganado y se acabará.


--- Código: Text --- ;AETC Pràctica: Quinze-Puzle;Cognoms i Nom: ;;Lliurar el fitxer amb el nom: cognom1_cognom2_nom.asm;Data de lliurament: ---------- .model small.stack 1024 DOSSERVICE  EQU 21H &#59; serveis DOSBIOSSERVICE EQU 10H &#59; serveis BIOSTicksSegon  EQU 18  &#59; Ticks per segonVECT_R      EQU 08h &#59; vector de rellotge .data Tauler db 'Tauler de Joc'&#59;Tauler de joc que es mostra a l'inici del programa        db '   0 1 2 3   '        db '  ÚÄÂÄÂÄÂÄ¿  '        db ' 0³ ³ ³ ³ ³  '        db '  ÃÄÅÄÅÄÅÄ´  '        db ' 1³ ³ ³ ³ ³  '        db '  ÃÄÅÄÅÄÅÄ´  '        db ' 2³ ³ ³ ³ ³  '        db '  ÃÄÅÄÅÄÅÄ´  '        db ' 3³ ³ ³ ³ ³  '        db '  ÀÄÁÄÁÄÁÄÙ  '        db '00  Moviments'        db '00  Segons   '    &#59;Quan lliureu la pràctica deixeu la matriu inicialitzada amb aquests valors.  Fitxa  db 'ABCD'&#59;Matriu 4x4 on tenim les fitxes     db 'FGHI'     db 'JK Z'          db 'OPNM'      Estat  db 1    &#59; 0: Hem pitjat la tecla 'q' per sortir, sortir del programa.                 &#59; 1: Continuem jugant.                 &#59; 2: Guanyat, Totes les lletres estan ordenades, indicar-ho i acabar.      &#59; 3: Temps exhaurit, indicar-ho i acabar.                 &#59; 4: Nombre de moviments exhaurits, indicar-ho i acabar           &#59; 5: Masses caselles en blanc, indicar-ho i acabar.  &#59;FilCur i ColCur indicaran la posició del cursor en tot moment.  FilCur   db ?  &#59; '0': Fila 0, '3': Fila 3   ColCur   db ?  &#59; '0': Columna 0, '3': Columna 3   Moviments db 99&#59; Moviments que podem realitzar.     Ticks     db 0 &#59;variable que indica els Ticks de rellotge transcorreguts  Segons    dw 0 &#59;variable per comptar els segons       RAI_R_Seg dw ? &#59; adreça de segment de la RAI de rellotge original  RAI_R_Dir dw ? &#59; desplaçament dins del segment de la RAI de rellotge original    MsgPerdut5 db  'Tauler incorrecte, masses caselles en blanc.','$'  MsgPerdut4 db  'Has perdut! Moviments exhaurits','$'  MsgPerdut3 db  'Has perdut! Temps exhaurit     ','$'  MsgGuanya  db  'Ho has aconseguit, tot ordenat!','$'  MsgSortir  db  'Has premut (q) per sortir      ','$'  .code ;*******************************************************************************; Esborra la pantalla completament escrivint espais en blanc; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************EsborraPantalla:   push AX  push BX  push CX  push DX  &#59;Inicialització per posicionar el cursor  mov bh,00h       &#59;pagina    mov dh,00h       &#59;fila inicial  mov dl,00h       &#59;columna inicial  mov ah,02h       &#59;servei per posicionar el cursor  int BIOSSERVICE   mov bh,00h       &#59;pagina  mov bl,07h       &#59;atribut  mov cx,2000      &#59;80*25nombre de caracters a escriure  mov al,' '       &#59;caracter  mov ah,09h       &#59;servei per escriure caracter.  int BIOSSERVICE   pop DX  pop CX  pop BX  pop AX Ret ;*******************************************************************************; Mostra el Tauler de joc sense Dades, és a dir, mostra la matriu Tauler; ; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************MostraTauler:   push AX  push BX  push CX  push DX  push SI  &#59;Inicialitzar registres  mov bh,00h       &#59;pagina    mov dh,06        &#59;fila inicial  mov dl,33        &#59;columna inicial   mov bl,07h       &#59;atribut  mov cx,1         &#59;escriurem 1 caracters cada cop    mov si,0         &#59;index per accedir al tauler  bucleMT:  mov ah,02h       &#59;servei per posicionar el cursor  int BIOSSERVICE   mov al,Tauler[SI]&#59;caracter   mov ah,09h       &#59;servei per escriure caracter.  int BIOSSERVICE   inc si           &#59;incrementem l'índex per accedir a les dades       &#59;Actualitzem posició del cursor (fila i columna)  inc dl           &#59;columna   cmp dl, 46       &#59;Quan arribem a la columna 46 ens posem a l'inici  jl bucleMT     &#59;de la següent fila.  mov dl, 33  inc dh           &#59;fila  cmp dh, 19     &#59;Quan arribem a la fila 19 vol dir que hem acabat  jl bucleMT     &#59;de dibuixar el tauler.   pop SI  pop DX  pop CX  pop BX  pop AX   ret ;*******************************************************************************; Buscar posició Inicial per començar a jugar. ; Buscar on hi ha l'espai en blanc i verifica que només hi hagi un espai en ; blanc a la matriu Fitxa. Si només hi ha un espai en blac posiciona el cursor; en aquella casella. Si hi ha més d'un o cap espai en blanc posem Estat=5 per acabar.; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************PosIni:    ret ;*******************************************************************************; Actualitza el contingut del Tauler de Joc amb les dades de la matriu Fitxa ; i mostra els moviments que podem realitzar a pantalla cridant a la subrutina ; MostraDigits. El cursor ha de quedar en el mateix lloc que estava. ; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;******************************************************************************* ActualitzaTauler:    ret ;*******************************************************************************; Converteix un valor decimal (entre 0 i 99) en dos caràcters ASCII. ; S’ha de dividir el valor entre 10, el quocient representarà les desenes i ; el residu les unitats, després s’han de convertir a ASCII.; Mostra els 2 digits ASCII a la posició de pantalla indicada a través de la pila.; El valor i la posició es passen per la pila. ; Paràmetres d'entrada: valor [bp+6] i posició (fila,columna) [bp+4]; Paràmetres de sortida: cap;******************************************************************************* MostraDigits:    ret ;*******************************************************************************; Llegim una tecla utilitzant el servei 08h de les crides al DOS. ; Segons la tecla llegida cridarem al procediment corresponent.;    [‘i’,’j’,’k’ o ’l’] cridar al procediment MouCursor;    ‘<espai>’ cridar al procediment MouFitxa;    ‘q’ posa Estat=0.; (per la lectura de teclar utilitzar només crides als serceis del DOS).; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************LlegirTecla:    ret ;*******************************************************************************; Mou el cursor segons la direcció indicada per AL i actualitza FilCur i ColCur ; segons la direcció que s’haig seleccionat ; Paràmetres d'entrada: AL indica la direcció del moviment ('i', 'j', 'k' o 'l'); Paràmetres de sortida: Cap;*******************************************************************************MouCursor:     ret ;*******************************************************************************; Mira si hi ha una casella buida al costat (dalt, baix, esquerra o dreta) de ; la casella actual del cursor, si és així fem el moviment de la fitxa i ; decrementa en un el número de moviments, si estem a la casella buida o si ; la casella buida no està al costat de la casella on estem, no moure cap fitxa ; ni descomptar moviments.; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************MouFitxa:     ret ;*******************************************************************************; Verifica si el tauler està ordenat, és a dir, les fitxes estan ordenades ; d’esquerra a dreta i de dalt a baix, quedant la casella buida a la última ; posició (baix-dreta), si és així canviar l’estat a 2 (Guanya).; Verifica si s'han esgotat els moviments disponibles, si és així posa estat a 4 ; (moviments exhaurits); Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;******************************************************************************* VerificaFi:     ret ;*******************************************************************************; Mostra el missatge indicat per SI. ; Paràmetres d'entrada: SI: adreça del missatge que volem mostrar; Paràmetres de sortida: Cap;*******************************************************************************MostraMissatge:    ret  ;*******************************************************************************; Instal·lació de la rutina d'atenció d'interrupció de rellotge; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************InstalRAI:     ret ;*******************************************************************************; Desinstal·lació de la rutina d'atenció d'interrupció de rellotge ; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************DesInstalRAI:    ret  ;*******************************************************************************; Rutina d'atenció de l'interrupció del rellotge; Paràmetres d'entrada: Cap; Paràmetres de sortida: Cap;*******************************************************************************RAIrellotge :      push ax  push dx  push ds   mov ax,@DATA  mov ds,ax &#59;codi de la RAI  FiRAIrel:  mov al,20h  out 20h,al   pop  ds  pop  dx  pop  ax         iret   ;*******************************************************************************; Programa Principal;*******************************************************************************inici:  STARTUPCODE   Call EsborraPantalla     Call MostraTauler  &#59;El vostre codi        EXITCODE 0 end inici  

Eternal Idol:
Si ese codigo es tuyo se ve, por la extension ya que ni lo lei realmente, estas trabajando pero aca nadie le hace la tarea a nadie, si tenes alguna duda puntual la podes plantear.

xernovil:
ok, borra este post y ya haré lo que pueda, sino haré alguna consulta cuando la necesite, lo puse por que realmente voy mal de tiempo y quizás alguien ha hecho un programa similar alguna vez y tiene la idea clara.
Gracias de todas formas.

Eternal Idol:
Es irrelevante que no tengas tiempo o que alguien ya lo haya hecho antes, si tenes problemas concretos trataremos de ayudarte a resolverlos.

Navegación

[0] Índice de Mensajes

Ir a la versión completa