• Viernes 8 de Noviembre de 2024, 21:47

Autor Tema:  Tablero 4x4 Letras Desordenadas  (Leído 2072 veces)

xernovil

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Tablero 4x4 Letras Desordenadas
« en: Viernes 11 de Mayo de 2007, 10:44 »
0
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
  1.  
  2. ;AETC Pràctica: Quinze-Puzle
  3. ;Cognoms i Nom:
  4. ;
  5. ;Lliurar el fitxer amb el nom: cognom1_cognom2_nom.asm
  6. ;Data de lliurament: ----------
  7.  
  8. .model small
  9. .stack 1024
  10.  
  11. DOSSERVICE  EQU 21H &#59; serveis DOS
  12. BIOSSERVICE EQU 10H &#59; serveis BIOS
  13. TicksSegon  EQU 18  &#59; Ticks per segon
  14. VECT_R      EQU 08h &#59; vector de rellotge
  15.  
  16. .data
  17.  Tauler db 'Tauler de Joc'&#59;Tauler de joc que es mostra a l'inici del programa
  18.         db '   0 1 2 3   '
  19.         db '  ÚÄÂÄÂÄÂÄ¿  '
  20.         db ' 0³ ³ ³ ³ ³  '
  21.         db '  ÃÄÅÄÅÄÅÄ´  '
  22.         db ' 1³ ³ ³ ³ ³  '
  23.         db '  ÃÄÅÄÅÄÅÄ´  '
  24.         db ' 2³ ³ ³ ³ ³  '
  25.         db '  ÃÄÅÄÅÄÅÄ´  '
  26.         db ' 3³ ³ ³ ³ ³  '
  27.         db '  ÀÄÁÄÁÄÁÄÙ  '
  28.         db '00  Moviments'
  29.         db '00  Segons   '  
  30.  
  31.  &#59;Quan lliureu la pràctica deixeu la matriu inicialitzada amb aquests valors.
  32.   Fitxa  db 'ABCD'&#59;Matriu 4x4 on tenim les fitxes
  33.      db 'FGHI'
  34.      db 'JK Z'
  35.          db 'OPNM'
  36.  
  37.  
  38.  
  39.   Estat  db 1    &#59; 0: Hem pitjat la tecla 'q' per sortir, sortir del programa.
  40.                  &#59; 1: Continuem jugant.
  41.                  &#59; 2: Guanyat, Totes les lletres estan ordenades, indicar-ho i acabar.
  42.      &#59; 3: Temps exhaurit, indicar-ho i acabar.
  43.                  &#59; 4: Nombre de moviments exhaurits, indicar-ho i acabar
  44.            &#59; 5: Masses caselles en blanc, indicar-ho i acabar.
  45.  
  46.  &#59;FilCur i ColCur indicaran la posició del cursor en tot moment.
  47.   FilCur   db ?  &#59; '0': Fila 0, '3': Fila 3
  48.   ColCur   db ?  &#59; '0': Columna 0, '3': Columna 3
  49.  
  50.   Moviments db 99&#59; Moviments que podem realitzar.
  51.    
  52.   Ticks     db 0 &#59;variable que indica els Ticks de rellotge transcorreguts
  53.   Segons    dw 0 &#59;variable per comptar els segons    
  54.  
  55.   RAI_R_Seg dw ? &#59; adreça de segment de la RAI de rellotge original
  56.   RAI_R_Dir dw ? &#59; desplaçament dins del segment de la RAI de rellotge original
  57.  
  58.  
  59.   MsgPerdut5 db  'Tauler incorrecte, masses caselles en blanc.','$'
  60.   MsgPerdut4 db  'Has perdut! Moviments exhaurits','$'
  61.   MsgPerdut3 db  'Has perdut! Temps exhaurit     ','$'
  62.   MsgGuanya  db  'Ho has aconseguit, tot ordenat!','$'
  63.   MsgSortir  db  'Has premut (q) per sortir      ','$'
  64.  
  65.  
  66. .code
  67.  
  68. ;*******************************************************************************
  69. ; Esborra la pantalla completament escrivint espais en blanc
  70. ; Paràmetres d'entrada: Cap
  71. ; Paràmetres de sortida: Cap
  72. ;*******************************************************************************
  73. EsborraPantalla:
  74.  
  75.   push AX
  76.   push BX
  77.   push CX
  78.   push DX
  79.  
  80.  &#59;Inicialització per posicionar el cursor
  81.   mov bh,00h       &#59;pagina  
  82.   mov dh,00h       &#59;fila inicial
  83.   mov dl,00h       &#59;columna inicial
  84.   mov ah,02h       &#59;servei per posicionar el cursor
  85.   int BIOSSERVICE
  86.  
  87.   mov bh,00h       &#59;pagina
  88.   mov bl,07h       &#59;atribut
  89.   mov cx,2000      &#59;80*25nombre de caracters a escriure
  90.   mov al,' '       &#59;caracter
  91.   mov ah,09h       &#59;servei per escriure caracter.
  92.   int BIOSSERVICE
  93.  
  94.   pop DX
  95.   pop CX
  96.   pop BX
  97.   pop AX
  98.  
  99. Ret
  100.  
  101. ;*******************************************************************************
  102. ; Mostra el Tauler de joc sense Dades, és a dir, mostra la matriu Tauler
  103. ;
  104. ; Paràmetres d'entrada: Cap
  105. ; Paràmetres de sortida: Cap
  106. ;*******************************************************************************
  107. MostraTauler:
  108.  
  109.   push AX
  110.   push BX
  111.   push CX
  112.   push DX
  113.   push SI
  114.  
  115.  &#59;Inicialitzar registres
  116.   mov bh,00h       &#59;pagina  
  117.   mov dh,06        &#59;fila inicial
  118.   mov dl,33        &#59;columna inicial
  119.  
  120.   mov bl,07h       &#59;atribut
  121.   mov cx,1         &#59;escriurem 1 caracters cada cop
  122.  
  123.   mov si,0         &#59;index per accedir al tauler
  124.  
  125. bucleMT:
  126.   mov ah,02h       &#59;servei per posicionar el cursor
  127.   int BIOSSERVICE
  128.  
  129.   mov al,Tauler[SI]&#59;caracter
  130.  
  131.   mov ah,09h       &#59;servei per escriure caracter.
  132.   int BIOSSERVICE
  133.  
  134.   inc si           &#59;incrementem l'índex per accedir a les dades
  135.        &#59;Actualitzem posició del cursor (fila i columna)
  136.   inc dl           &#59;columna
  137.   cmp dl, 46       &#59;Quan arribem a la columna 46 ens posem a l'inici
  138.   jl bucleMT     &#59;de la següent fila.
  139.   mov dl, 33
  140.   inc dh           &#59;fila
  141.   cmp dh, 19     &#59;Quan arribem a la fila 19 vol dir que hem acabat
  142.   jl bucleMT     &#59;de dibuixar el tauler.
  143.  
  144.   pop SI
  145.   pop DX
  146.   pop CX
  147.   pop BX
  148.   pop AX
  149.  
  150.   ret
  151.  
  152. ;*******************************************************************************
  153. ; Buscar posició Inicial per començar a jugar.
  154. ; Buscar on hi ha l'espai en blanc i verifica que només hi hagi un espai en
  155. ; blanc a la matriu Fitxa. Si només hi ha un espai en blac posiciona el cursor
  156. ; en aquella casella. Si hi ha més d'un o cap espai en blanc posem Estat=5 per acabar.
  157. ; Paràmetres d'entrada: Cap
  158. ; Paràmetres de sortida: Cap
  159. ;*******************************************************************************
  160. PosIni:
  161.  
  162.  
  163.   ret
  164.  
  165. ;*******************************************************************************
  166. ; Actualitza el contingut del Tauler de Joc amb les dades de la matriu Fitxa
  167. ; i mostra els moviments que podem realitzar a pantalla cridant a la subrutina
  168. ; MostraDigits. El cursor ha de quedar en el mateix lloc que estava.
  169. ; Paràmetres d'entrada: Cap
  170. ; Paràmetres de sortida: Cap
  171. ;*******************************************************************************
  172.  
  173. ActualitzaTauler:
  174.  
  175.  
  176.   ret
  177.  
  178. ;*******************************************************************************
  179. ; Converteix un valor decimal (entre 0 i 99) en dos caràcters ASCII.
  180. ; S’ha de dividir el valor entre 10, el quocient representarà les desenes i
  181. ; el residu les unitats, després s’han de convertir a ASCII.
  182. ; Mostra els 2 digits ASCII a la posició de pantalla indicada a través de la pila.
  183. ; El valor i la posició es passen per la pila.
  184. ; Paràmetres d'entrada: valor [bp+6] i posició (fila,columna) [bp+4]
  185. ; Paràmetres de sortida: cap
  186. ;*******************************************************************************
  187.  
  188. MostraDigits:
  189.  
  190.  
  191.   ret
  192.  
  193. ;*******************************************************************************
  194. ; Llegim una tecla utilitzant el servei 08h de les crides al DOS.
  195. ; Segons la tecla llegida cridarem al procediment corresponent.
  196. ;    [‘i’,’j’,’k’ o ’l’] cridar al procediment MouCursor
  197. ;    ‘<espai>’ cridar al procediment MouFitxa
  198. ;    ‘q’ posa Estat=0.
  199. ; (per la lectura de teclar utilitzar només crides als serceis del DOS).
  200. ; Paràmetres d'entrada: Cap
  201. ; Paràmetres de sortida: Cap
  202. ;*******************************************************************************
  203. LlegirTecla:
  204.  
  205.  
  206.   ret
  207.  
  208. ;*******************************************************************************
  209. ; Mou el cursor segons la direcció indicada per AL i actualitza FilCur i ColCur
  210. ; segons la direcció que s’haig seleccionat
  211. ; Paràmetres d'entrada: AL indica la direcció del moviment ('i', 'j', 'k' o 'l')
  212. ; Paràmetres de sortida: Cap
  213. ;*******************************************************************************
  214. MouCursor:
  215.  
  216.  
  217.   ret
  218.  
  219. ;*******************************************************************************
  220. ; Mira si hi ha una casella buida al costat (dalt, baix, esquerra o dreta) de
  221. ; la casella actual del cursor, si és així fem el moviment de la fitxa i
  222. ; decrementa en un el número de moviments, si estem a la casella buida o si
  223. ; la casella buida no està al costat de la casella on estem, no moure cap fitxa
  224. ; ni descomptar moviments.
  225. ; Paràmetres d'entrada: Cap
  226. ; Paràmetres de sortida: Cap
  227. ;*******************************************************************************
  228. MouFitxa:
  229.  
  230.  
  231.   ret
  232.  
  233. ;*******************************************************************************
  234. ; Verifica si el tauler està ordenat, és a dir, les fitxes estan ordenades
  235. ; d’esquerra a dreta i de dalt a baix, quedant la casella buida a la última
  236. ; posició (baix-dreta), si és així canviar l’estat a 2 (Guanya).
  237. ; Verifica si s'han esgotat els moviments disponibles, si és així posa estat a 4
  238. ; (moviments exhaurits)
  239. ; Paràmetres d'entrada: Cap
  240. ; Paràmetres de sortida: Cap
  241. ;*******************************************************************************
  242.  
  243. VerificaFi:
  244.  
  245.  
  246.   ret
  247.  
  248. ;*******************************************************************************
  249. ; Mostra el missatge indicat per SI.
  250. ; Paràmetres d'entrada: SI: adreça del missatge que volem mostrar
  251. ; Paràmetres de sortida: Cap
  252. ;*******************************************************************************
  253. MostraMissatge:
  254.  
  255.  
  256.   ret
  257.  
  258.  
  259. ;*******************************************************************************
  260. ; Instal·lació de la rutina d'atenció d'interrupció de rellotge
  261. ; Paràmetres d'entrada: Cap
  262. ; Paràmetres de sortida: Cap
  263. ;*******************************************************************************
  264. InstalRAI:
  265.  
  266.  
  267.   ret
  268.  
  269. ;*******************************************************************************
  270. ; Desinstal·lació de la rutina d'atenció d'interrupció de rellotge
  271. ; Paràmetres d'entrada: Cap
  272. ; Paràmetres de sortida: Cap
  273. ;*******************************************************************************
  274. DesInstalRAI:
  275.  
  276.  
  277.   ret
  278.  
  279.  
  280. ;*******************************************************************************
  281. ; Rutina d'atenció de l'interrupció del rellotge
  282. ; Paràmetres d'entrada: Cap
  283. ; Paràmetres de sortida: Cap
  284. ;*******************************************************************************
  285. RAIrellotge :  
  286.  
  287.   push ax
  288.   push dx
  289.   push ds
  290.  
  291.   mov ax,@DATA
  292.   mov ds,ax
  293.  
  294. &#59;codi de la RAI
  295.  
  296.  
  297. FiRAIrel:
  298.   mov al,20h
  299.   out 20h,al
  300.  
  301.   pop  ds
  302.   pop  dx
  303.   pop  ax
  304.  
  305.         iret
  306.  
  307.  
  308.  
  309. ;*******************************************************************************
  310. ; Programa Principal
  311. ;*******************************************************************************
  312. inici:
  313.   STARTUPCODE
  314.  
  315.   Call EsborraPantalla  
  316.  
  317.   Call MostraTauler
  318.  
  319.  &#59;El vostre codi
  320.  
  321.  
  322.  
  323.  
  324.  
  325.   EXITCODE 0
  326.  
  327. end inici
  328.  
  329.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tablero 4x4 Letras Desordenadas
« Respuesta #1 en: Viernes 11 de Mayo de 2007, 10:53 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

xernovil

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Tablero 4x4 Letras Desordenadas
« Respuesta #2 en: Viernes 11 de Mayo de 2007, 11:57 »
0
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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tablero 4x4 Letras Desordenadas
« Respuesta #3 en: Viernes 11 de Mayo de 2007, 12:12 »
0
Es irrelevante que no tengas tiempo o que alguien ya lo haya hecho antes, si tenes problemas concretos trataremos de ayudarte a resolverlos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.