• Domingo 17 de Noviembre de 2024, 20:30

Autor Tema:  Sopa De Letras  (Leído 2691 veces)

xikitina

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Sopa De Letras
« en: Domingo 15 de Enero de 2006, 14:32 »
0
hola!!

Soy nueva aki,es la primera vez q os escribo preguntando,pero no es la primera vez q me ayudais!

Mirad,etoy haciendo una sopa de letras y tengo un gran problema q llevo intentando resolver desesperadamente desde hace ya bastante con libros y manuales xo no doi con ello.

Ya tengo construido un tablero relleno con letras aleatorias,y mi problema esta en que no se como meter las palabras introducidas por el usuario en el tablero para colocarlas o "esconderlas" entre las demas letras aleatorias del tablero.

He probado con 'insert' ,y 'copy' tambien,xo no consigo q me funcione.
Para las palabras introducidas por el usuario he construido un array de string mas o menos asi ---> palabras:array[1..30] of string[5];
y el tablero como un array bidimensinal de caracteres --> tablero:array[1..10,1..10] of char.
Nose si esq esas funciones no se pueden utilizar con arrays ,pq tambien las e probado con arrays mas sencillos pero no he conseguido nada...

Os ruego q me echeis una mano pq estoy realmente desesperada,basicamente porque sin eso no puedo continuar el programa. :ouch:

De todos modos muchas gracias por todo lo que me habeis ayudado en mi corta vida como "programadora"...

Un saludo
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Sopa De Letras
« Respuesta #1 en: Domingo 15 de Enero de 2006, 15:16 »
0
Código: Text
  1.  
  2. const
  3.    maxX = 50;
  4.    maxY = 50;
  5.  
  6. var
  7.    Tablero: array[1..maxX, 1..maxY] of char;
  8.  
  9. {
  10. str es la cadena
  11. inX es la posicion X inicial de donde empezara pegar la cadena
  12. inY es la posicion Y inicial.................
  13. dir es la direccion, true horizontal, false vertical.
  14. La funcion devuelve el resultado si la cadena se pudo pegar, por si es muy larga para entrar
  15. }
  16.  
  17. function insertString(str: string; inX, inY:Byte;  dir:boolean): boolean;
  18. var
  19.    i: integer;
  20. begin
  21.   if dir then
  22.   begin
  23.      if inX + length(str) > maxX then
  24.      begin
  25.         insertString := False;
  26.         Exit;
  27.       end else
  28.       begin
  29.           for i:=inX to (inX+length(str)) do
  30.              Tablero[i, inY] := str[i-inX+1];
  31.          insertString := true;
  32.       end
  33.    end
  34.    else if not dir then
  35.    begin
  36.      if inY + length(str) > maxY then
  37.      begin
  38.         insertString := False;
  39.         Exit;
  40.       end else
  41.       begin
  42.           for i:=inY to (inY + length(str)) do
  43.                 Tablero[inX, i] := str[i-inY+1];
  44.           insertString := true;
  45.      end;
  46.    end;
  47. end;
  48.  
  49.  
Revisa el código por ahí tenga algun error ya que no lo puedo probar ahora, no estoy en casa y no tengo compilador.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Sopa De Letras
« Respuesta #2 en: Domingo 15 de Enero de 2006, 16:20 »
0
Seria mejor una funcion más general como:

Para vertical descendente deltaX=0, deltaY=1;
Para horizontal normal deltaX=1, deltaY=0;
Para horizontal reverso deltaX=-1, deltaY=0;
Para diagonal deltaX=1, deltaY=1; deltaX=-1, deltaY=-1; deltaX=-1, deltaY=1; deltaX=1, deltaY=-1;

Código: Text
  1.  
  2. const maxX=10;
  3. const maxY=10;
  4. var Tablero: array[1..maxX,1..maxY] of char;
  5.  
  6.  
  7. function colocarEnLaSopa(cadena: string; PosX, PosY, deltaX, deltaY: integer): boolean;
  8.  
  9.   function PosicionValida(PosX, PosY:integer):boolean;
  10.   begin
  11.     PosicionValida:=(PosX>=1) and (PosX<=maxX) and (PosY>=1) and (PosY<=maxY);
  12.   end;
  13. var
  14.   i, caracteres: integer;
  15. begin
  16.   //Para normalizar posicion inicial a 0 y no 1:
  17.   caracteres:=length(cadena)-1;
  18.   //Revisar posicion inicial y final, si ambas son validas, entonces se puede colocar en la sopa.
  19.   if PosicionValida(PosX, PosY) and PosicionValida(PosX+caracteres*deltaX,PosY+caracteres*deltaY) then
  20.   begin
  21.     //Primero revisar por las casillas si estan libres
  22.     for i:=0 to caracteres do
  23.       if Tablero[PosX+i*deltaX,PosY+i*deltaY] <> ' ' then
  24.       begin
  25.         colocarEnLaSopa:=false;
  26.         exit;//casilla ocupada, salir
  27.       end;
  28.     //Agregar las letras
  29.     for i:=0 to caracteres do
  30.       Tablero[PosX+i*deltaX,PosY+i*deltaY] := cadena[i+1];
  31.     colocarEnLaSopa:=true;
  32.   end
  33.   else
  34.     colocarEnLaSopa:=false;
  35. end;
  36.  
  37.  

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Sopa De Letras
« Respuesta #3 en: Domingo 15 de Enero de 2006, 16:26 »
0
es que se me ocurió lo de la diagonales ya cuando estaba terminando y bueno......
no lo quiería cambiar. :rolleyes:  :whistling: