PDA

Ver la Versión Completa : consultita tipo de dato...


loadminds
19-03-2009, 01:13:13
buenas gente como va?, tengo una pequeña dudita que como siempre supuse la gente del foro que es bien grosa me la puede aclarar.
Estoy diagramando lo que seria un juego del Ahorcado, y primeramente me surgio la duda sobre que tipo de dato me almacenaria la palabra, pense en un arreglo por el acceso directo, y he aqui mi problema el arreglo es de dimension fisica fija verdad?, y las palabras ingresadas no tienen especificada la dimension. Existe alguna forma de dimensionar el arreglo al ingresar la palabra acorde al tamaño de esta?, o directamente me pienso otra estructura?:eek:quizas este encarando mal el problema gracias de antemano!

Delphius
19-03-2009, 03:15:20
Hola loadminds,
Dices que estás diagramando... ¿podríamos ver una muestra de ellos? Digo... para tener una idea más clara de como estás enfocando el programa.

El asunto es que como estás adelantando en algo y nos pides recomendaciones, es necesario que nos brindes algo más de información para ver de que modo ayudarte. Tu tienes una visión, y es muy probable que la visión de quienes pasemos por aquí tengamos una propia... Es más, tal vez la manera en como veamos o nos imaginamos al tema no sea compatible con la tuya.
¿Me entiendes?
Comentanos algo más concreto, por favor.

Pareciera ser que tienes un vector o arreglo estático. Algo así tal vez:

type
TArreglo = array[1..MAX_LETRAS] of Char;

var
MiArreglo: TArreglo;

Se puede definir un arreglo dinámico, si tu duda pasa por el tema del "tamaño" o la cantidad de caracteres que pueda tener la palabra:

type
TArregloDinamico = array of char;

Y de éste modo puedes definirle su tamaño en tiempo de ejecución mediante la función SetLength():

SetLength(miarreglodinamico, 24);

Y como es dinámico, la primera posición es 0 y la última ese tamaño menos 1 (según el ejemplo, 23). Puedes recorrer el array de este modo:


for i := Low(miarreglodinámico) to High(miarreglodinamico) do ...

Y como todo array, vector o arreglo se puede acceder a un elemento mediante el índice:

arreglo[indice] := 'A';

Recomiendo que leas la ayuda que ofrece Delphi sobre dynamics arrays.

Pero a como lo veo, este método es un tanto impráctico y "redundante". Se puede trabajar con el tipo string tranquilamente. El tipo string funciona como un vector de modo que puede tranquilamente definirse su tamaño y acceder a una posición determinada del mismo. La diferencia es que aquí al primer elemento le corresponde el índice 1.

var texto: string;
begin
SetLength(texto);
texto[1] := 'A';
for i := 1 to Length(texto);
texto[i] := ...

Me gustaría que nos comentases con mayores detalles sobre tus dudas, inquietudes. "Muestranos" algo con lo que podamos entenderte, opinar y ofrecerte soluciones y/o alternativas.

Saludos,

Caro
19-03-2009, 13:26:13
Hola, puedes también guardarlo en un StringList.


sl : TStringList;
.................
sl := TStringList.Create;
............
//Para guardar
sl .Add('A');
sl.Add('L');
.................
//Para recorrer
for i := 0 to sl.Count-1 do
showmessage(sl[i]);


Saluditos

duilioisola
19-03-2009, 14:33:42
En pascal (y Delphi) cada string es un arreglo. Puedes acceder a cada letra con subíndices.

- La primera posición (0) indica el largo de la cadena.
- Las siguientes posiciones te dan cada caracter.

var
s : string;
begin
s := 'Delphi';
ShowMessage('La primera letra de S es : '+s[1]);
ShowMessage('El largo de S es : '+IntToStr(Ord(s[0]));
end;

Caro
19-03-2009, 15:00:34
Hola, creo que nos hemos complicado Marcelo, ademas que se me ha ido lo acaba de explicar Duosiloa que cabeza que tengo, loadminds mejor que lo hagas como te ha indicado Duosiloa manejandolo como un String.

Saluditos

loadminds
19-03-2009, 18:29:57
primero que nada muchisimas gracias por las respuestas!!, esta tarde intentare con las opciones que me dieron. La idea es sencilla, el usuario ingresa una palabra, la que necesito almacenarme en la estructura en cuestion.
Luego mediante botones (uno por letra), el usuario va tirando posibles letras para intentar adivinar la palabra, la cual va actualizando a medida que acierta, o en caso contrario contablizando los errores.
Es decir, almacenada ya la palabra, deberia analizarla caracter a caracter comparando con el ingresado hasta el final de esta y asi concluir si es una letra erronea o tiene alguna aparicion.
Quizas soy un poco confuso al explicarlo, esta tarde tratare de tener algo de codigo para que sea mas sencillo, saludos a todos y gracias x los datos!!

loadminds
21-03-2009, 21:14:57
bueno gente logre que funcione pero me quedo alguna que otra duda minima.
Antes de consultarles doy una idea mas o menos de como seria el Form, se ingresa una nueva palabra en un Tmaskedit de otro Form, que se almacena en un string y se visualiza su inicial y tantos guiones como letras resten en este formato 'L _ _ _ _ _ '. Tengo 6 Timages que voy mostrando y ocultando de acuerdo a los errores, que se contabilizan tambien en un Tedit y finalmente un boton por cada letra:

Tedit.Text:=palabra[1]; //inicial
for i:=2 to length(palabra) do
Tedit.Text:=Tedit.Text+' _ '; // resto de las letras separadas por espacio para poder contar la cant

y al ir adivinando letra a letra modifico la palabra en la posicion de la letra por un '_' y en una segunda variable string que contiene todos guiones por la o las letras adivinadas. Asi se me iria "formando" en la variable auxiliar la palabra letra a letra. Finalmente muestro la variable auxiliar con la inicial incluida en el Tedit de esta forma:

procedure actualizarletra(i:integer; letra:char);
begin
palabra[i]:='_';
palabramodificada[i]:=letra;
Tedit.Text:=palabramodificada;
end;

Al ser char, no puedo meter el espacio adelante ni atras para mantener el formato inicial y no quedar separacion entre los guiones ('L______' sin poder contar las q qdan) Se les ocurre alguna idea para lograrlo?me suena a demasiado sencillo pero no le encuentro la vuelta.
Y una ultima duda pero primordial, es como terminar el juego, (el gameover es facil, hay un limite en cantidad de errores) pero para ganarlo se me ocurre analizar la variable palabra verificando que sean todos guiones (la palabra ya se descubrio) o viceversa con la variable auxiliar, pero deberia hacerlo cada vez que clickeo una letra?

Caro
23-03-2009, 16:00:37
bueno gente logre que funcione pero me quedo alguna que otra duda minima.
Antes de consultarles doy una idea mas o menos de como seria el Form, se ingresa una nueva palabra en un Tmaskedit de otro Form, que se almacena en un string y se visualiza su inicial y tantos guiones como letras resten en este formato 'L _ _ _ _ _ '. Tengo 6 Timages que voy mostrando y ocultando de acuerdo a los errores, que se contabilizan tambien en un Tedit y finalmente un boton por cada letra:

Tedit.Text:=palabra[1]; //inicial
for i:=2 to length(palabra) do
Tedit.Text:=Tedit.Text+' _ '; // resto de las letras separadas por espacio para poder contar la cant

y al ir adivinando letra a letra modifico la palabra en la posicion de la letra por un '_' y en una segunda variable string que contiene todos guiones por la o las letras adivinadas. Asi se me iria "formando" en la variable auxiliar la palabra letra a letra. Finalmente muestro la variable auxiliar con la inicial incluida en el Tedit de esta forma:

procedure actualizarletra(i:integer; letra:char);
begin
palabra[i]:='_';
palabramodificada[i]:=letra;
Tedit.Text:=palabramodificada;
end;

Al ser char, no puedo meter el espacio adelante ni atras para mantener el formato inicial y no quedar separacion entre los guiones ('L______' sin poder contar las q qdan) Se les ocurre alguna idea para lograrlo?me suena a demasiado sencillo pero no le encuentro la vuelta.
Y una ultima duda pero primordial, es como terminar el juego, (el gameover es facil, hay un limite en cantidad de errores) pero para ganarlo se me ocurre analizar la variable palabra verificando que sean todos guiones (la palabra ya se descubrio) o viceversa con la variable auxiliar, pero deberia hacerlo cada vez que clickeo una letra?

Hola de nuevo, no te endiendo muy bien, que recuerde este jueguito consiste si introduces o seleccionas una letra, se busca en todas las posiciones donde se encuentra y se reemplaza la letra en todas esas posiciones y también tienes la opción de indicar directamente toda la palabra, claro que tiene numero n de intentos.

Lo que se me ocurre es esto, digamos que introduces la letra desde un Edit y lo que se va formando lo muestras en un label.


var
Aux, Palabra : String;
Ind : Integer;
begin
//En Aux estaría la palabra completa que viene de tu otro form
Aux := 'Algo';
//En tu label como dices tu, estaría la inicial y los guiones osea A___
//y lo guardamos también en palabra
Palabra := Label.Caption;

//En edit1 esta la letra que ha introducido, buscamos y reemplazamos
While Pos(Edit1.Text, Aux) > 0 do
begin
Ind := Pos(Edit1.Text, Aux);
Aux[Ind] := '_';
Palabra[Ind] := Edit1.Text[1];
end;
Label2.Caption := Palabra; //Actualizamos nuestro label
Edit1.Clear;


Ahora para saber si ha ganado, en tu label no tendría que haber ningún guión, sería hacer un "Pos" , deberías también dar la opción de introducir toda la palabra y si es igual a la que tienes, entonces ya ha ganado sino, que siga introduciendo letras hasta el numero de veces que tu definas.

Saluditos