David Elfi | 3 Aug 00:40 2008
Picon

Re: Clonando Objectos

Hola Cristian,

Bienvenido al grupo, creo que Fernando va a saludarte oportunamente.
La clonacion en C++ se realiza a traves de los constructores por copia. Cada clase contiene un constructor por copia que puede ser el default (otorgado por el compilador) o alguno que el usuario defina acorde a sus necesidades. A partir de este constructor es que se puede generar una "clonacion" de otro objeto.
Para realizar una copia vas a tener que crear un objeto nuevo pasandole el "copiado" por parametro. O sea

A a;
a.setAttribute(1);
A b(a);
 
Esto no es tan  sencillo como parece. Al igual que la clonacion en java, debes tener en cuenta si se hace shallow (superficial) or deep (profunda). El constructor por copia default no hace un deep copy, para eso se debe proveer el constructor de copia por parte del usuario. Por ejemplo:

struct A
{
     B *b;
     A( const A &copy )  // <------- Copy constructor definition
    {
        this->b = copy.b;
    }
};

Espero que esto te sirva.
Saludos

David

On Sat, Aug 2, 2008 at 7:21 PM, Cristian Wilgenhoff <cristian.wil88-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
Hola que tal ? Mi nombre es Cristian Wilgenhoff y soy estudiante de Ingeniera en Sistemas en Tandil, usuario de Linux, y participante activo de gulBAC (LUG). Abro mi primer mensaje en esta lista para preguntar sobre el clonado de objetos,  en Java todos los objetos tienen un metodo llamado clone(), que lo que hace es copiar el contenido del objecto manteniendo las asignaciones de memoria. Todo lo que he probado hasta ahora no me funcion, asi que si me pudieran dar una mano estaria muy agradecido.

Muchas Gracias, Cristian.




--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Cristian Wilgenhoff | 3 Aug 01:08 2008
Picon

Re: Clonando Objectos

Voy  a ver en un rato eso que me pasaste David, de paso les cuento mas o menos que estoy haciendo:

Estoy haciendo un juego de Tablero, el Trabado (Klotski, Red Donkey, Dad's Puzzle o Rush Hour). Tengo que hacer la inteligencia, generación de niveles, y un algoritmo de "Hint", en papel ya tengo pensado todo. Pero a veces surguen estos problemas de implementacion en C++, cosas que no recuerdo o nunca aprendi :P.

El juego seria algo así:

+-------------+
 | a  b  b c |
 | a  b  b c |
 | d  e  e f  |
 | d  g  h f  |
 | i           j |
+--+goal!+--+

(y la pieza B debe destrabarse deslizando las demas, llegando a "goal!")

Como ven, puede haber piezas de diferentes tamaños...

Lo estoy haciendo con Kdevelop y Cmake, cmake es barbaro para portar los proyectos y demas cosas.

Una de las Clases es Move, abstracta por supuesto, de la cual se desprenden todos los movientos, Up, Down, Right y Left. Estas clases tiene unos metodos que los implemento de la siguiente manera:

bool MoveRight::MoveRight tryMove(puzzle *p){
      // Elimino la pieza de la posicion actual.
      // Me fijo si el area de la derecha esta vacia, el area se calcula de acuerdo del tamaño de la pieza asociada y devuelve true si es valida.
      // restauro la pieza original.
}

Nota: Cuando se instancia la clase se asocia la pieza que se quiere mover.

La idea básica, creo yo es muy simple, la unica forma que se me ocurrio fue que cuando elimino las piezas del tablero no deletearlas, ya que el tablero se implementa como map< int, Pieza *>. Pieza es otra clase...

Bueno espero que se entienda mas o menos, lo hice medio rapido, puede ser que este explicado medio para el cul...

Saludos, y muchas gracias.

Cristian.

--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Cristian Wilgenhoff | 3 Aug 01:44 2008
Picon

Re: Clonando Objectos

Si la idea es hacerlo open-source, para el 15 de agosto lo tengo que tener terminado :). Pero con la algoritmia (al menos en papel) ando bien. Aparte estoy todo el dia metido con esto. Le voy hacer una interface en QT4 tambien. No va a ser de los mas limpios y lindo el codigo, pero con el tiempo se arreglara. Supongo que lo subire a source forge, y la licencia va a ser GPL.

Saludos, Cristian.

2008/8/2 Soledad Alborno <soledad.alborno-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Hola Cristian,

Con respecto a clone, quizás sea util revisar un poco el patrón de diseño prototype: http://en.wikipedia.org/wiki/Prototype_pattern. Incluso en el link hay un ejemplo en C++

Me encantó la idea del juego, el trabado es uno de mis juegos favoritos... Cuando lo termines, subilo asi podemos ver el código y comentarlo :)

Bienvenido!
Sole

2008/8/2 Cristian Wilgenhoff <cristian.wil88-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

Voy  a ver en un rato eso que me pasaste David, de paso les cuento mas o menos que estoy haciendo:

Estoy haciendo un juego de Tablero, el Trabado (Klotski, Red Donkey, Dad's Puzzle o Rush Hour). Tengo que hacer la inteligencia, generación de niveles, y un algoritmo de "Hint", en papel ya tengo pensado todo. Pero a veces surguen estos problemas de implementacion en C++, cosas que no recuerdo o nunca aprendi :P.

El juego seria algo así:

+-------------+
 | a  b  b c |
 | a  b  b c |
 | d  e  e f  |
 | d  g  h f  |
 | i           j |
+--+goal!+--+

(y la pieza B debe destrabarse deslizando las demas, llegando a "goal!")

Como ven, puede haber piezas de diferentes tamaños...

Lo estoy haciendo con Kdevelop y Cmake, cmake es barbaro para portar los proyectos y demas cosas.

Una de las Clases es Move, abstracta por supuesto, de la cual se desprenden todos los movientos, Up, Down, Right y Left. Estas clases tiene unos metodos que los implemento de la siguiente manera:

bool MoveRight::MoveRight tryMove(puzzle *p){
      // Elimino la pieza de la posicion actual.
      // Me fijo si el area de la derecha esta vacia, el area se calcula de acuerdo del tamaño de la pieza asociada y devuelve true si es valida.
      // restauro la pieza original.
}

Nota: Cuando se instancia la clase se asocia la pieza que se quiere mover.

La idea básica, creo yo es muy simple, la unica forma que se me ocurrio fue que cuando elimino las piezas del tablero no deletearlas, ya que el tablero se implementa como map< int, Pieza *>. Pieza es otra clase...

Bueno espero que se entienda mas o menos, lo hice medio rapido, puede ser que este explicado medio para el cul...

Saludos, y muchas gracias.

Cristian.







--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Cristian Wilgenhoff | 3 Aug 00:21 2008
Picon

Clonando Objectos

Hola que tal ? Mi nombre es Cristian Wilgenhoff y soy estudiante de
Ingeniera en Sistemas en Tandil, usuario de Linux, y participante activo de
gulBAC (LUG). Abro mi primer mensaje en esta lista para preguntar sobre el
clonado de objetos,  en Java todos los objetos tienen un metodo llamado
clone(), que lo que hace es copiar el contenido del objecto manteniendo las
asignaciones de memoria. Todo lo que he probado hasta ahora no me funcion,
asi que si me pudieran dar una mano estaria muy agradecido.

Muchas Gracias, Cristian.

David Elfi | 3 Aug 01:49 2008
Picon

Re: Grep of the week #1

Hola Gente,

Asi como Daniel me habia incentivado a ver un poco de regex y spirit en C++ lo hice. Lamentablemente lo hice hace tiempo, y siempre postergaba el post para mas adelante. Como veo que Daniel esta muy ocupado y hace mucho que no se le da por hacer sus preguntas locas :) (pero sirven mucho), aca les mando algo de lo que vi de regex y spirit.

Empezamos con regex (http://www.boost.org/doc/libs/1_35_0/libs/regex/doc/html/index.html). La verdad que la implementacion de esta libreria es muy buena, me hace acordar mucho a como se usan las regex en php u otros lenguajes que la implementan. Eso esta bueno, porque una vez que aprendes mas o menos a reliazar una expresion regular, luego es sencillo ver como el lenguaje o las librerias la soportan. Como ejemplo les presento el parseo de una url que es lo que yo necesitaba. La verda que fue muy sencillo de realizar y en unos minutos uno tiene algo andando

const string REURL = "http://([\\w\\.\\-_\\d]+)(/?.*)";

de acuerdo a esa expresion regular uno puede sacar un codigo como

    const boost::regex e( REURL );
    boost::smatch what;
    if ( boost::regex_match( url, what, e ) )
    {
        hostName = what[1];
        if ( what.size() > 2 && what[2].length() > 0 )
        {
            page = what[2];
        }
        else
        {
            page = "/";
        }
    }

donde es muy facil acceder a los elementos que se han hecho match a traves del operador []. Solo construi la expresion regular a partir de la constante, luego cree un objeto que va a contener el resultado de la expresion y por ultimo solo llamo a ver si la expresion coincide.
Dani, ahora te queda a vos ver que es lo que tiene la exp regular.
La unica contrapartida que le vi es que al linkear, le tenemos que especificar la libreria boost_regex. Acostumbrado a no especificar librerias en C++ por usar mucho templates, me parecio raro, pero depende si el destino es para un sistema embebido o uno no embebido.

Para spirit la cosa fue bastante mas complicada. Me llevo tiempo entender pero vi que es muy potente. Spirit en si es un analizador lexico que permite parsear una gramatica. Es decir, a partir de una gramatica, podemos llegar a un parser bastante interesante, como aquellos que alguna vez usamos lex e yacc.
El ejemplo que yo implemente es un mini parser de un form en html. La verdad que estuve lidiando un poco con la gramatica y los casos especiales, asi que en un momento corte de casos especiales porque no queria un browser, solo un ejemplo de spirit :)

El parser que arme fue el siguiente
struct form_parser : public grammar<form_parser>
{
    /** Form attributes **/
    FormParser::InputContainer &fields;
    FormParserResult result;

    form_parser( FormParser::InputContainer &fields, FormParser::ActionType &action, FormParser::SubmitName &subname ) : fields( fields ), result( fields, action, subname ) { }

    template <typename ScannerT>
    struct definition
    {
        definition( form_parser const &const_self )
        {
            form_parser &self = const_cast<form_parser&>( const_self );
            attributes = lexeme_d[
                                  as_lower_d[
                                             +alnum_p >>
                                             !( '=' >>
                                                     !ch_p('"') >>
                                                     +(alnum_p | '.' | '/' | '_' ) >>
                                                     !ch_p('"') ) ]];

            input = ch_p('<') >> as_lower_d[ "input" ] >> *attributes[ boost::bind( &attribute, boost::ref(self.result), _1, _2 ) ] >> str_p("/>");

            br = as_lower_d["<br/>"];

            text = +(~ch_p('<') & anychar_p);

            form_open = ch_p('<') >> as_lower_d["form"] >> *attributes[boost::bind( &attribute, boost::ref(self.result), _1, _2 )] >> ch_p('>');
            form_close = as_lower_d[str_p("</form>")];

            html_open = ch_p('<') >> as_lower_d["html"] >> ch_p('>');
            html_close = as_lower_d[str_p("</html>")];

            body_open = ch_p('<') >> as_lower_d["body"] >> ch_p('>');
            body_close = as_lower_d[str_p("</body>")];

            form = !html_open >>
            !body_open >>
            form_open[boost::bind( &form_creator, boost::ref(self.result), _1, _2 )] >>
            *( input[boost::bind( &input_creator, boost::ref(self.result), _1, _2 )] |
                    text[&print] |
                    br[&newline] ) >>
                    form_close >>
                    !body_close >>
                    !html_close >> (*anychar_p)[&print];
        }
        rule<ScannerT> const &start() { return form; }
        rule<ScannerT> attributes,
        input,
        text,
        br,
        html_open, html_close,
        body_open, body_close,
        form_open, form_close,
        form;
    };
};

Como veran es un codigo medio complejo, pero les puedo comentar lo que si vale la pena y luego si tienen ganas lo pueden probar (no creo que tengan taaantas ganas :-P )
Primero que nada, el parser es una clase que debe implementar la clase de spirit "grammar" quien debe conocer la clase que hereda como parametro del template. Este es un concepto que no recuerdo el nombre, asi que Daniel o Fernando podrian ayudarme en este sentido.
Como parte de la clase se definen como atributos los elementos que van a ser parseados, en este caso form, form_open, etc. y en el metodo "definition" uno completa lo que cada elemento va a parser. Para esto, spirit contiene un monton de elementos implementados que nos permiten ir componiendo la gamatica de forma facil. Por ejemplo br se define como el tag as_lower_d["<br/>"] donde dice que la entrada la tomamos en lower case y la comparamos con "<br/>".
Para mas informacion de spirit y sus componentes puede ir a http://www.boost.org/doc/libs/1_35_0/libs/spirit/index.html
Lo mas interesante de todo esto, es que por cada componente que se reconoce en la gramatica se le puede asociar una funcion o functor a ser llamado cuando la ocurrencia de ese componente aparece en el texto parseado. Por ejemplo, siguiendo el ejemplo de br, cuando se crea el form una de las partes contiene

br[&newline]

esto esta diciendo que cada vez que se encuentre el componente br (que fue el que creamos anteriormente) llame a la funcion newline.
Esto realmente es muuy potente, y si lo juntamos con funtores y demas elementos de la stl o boost podemos lograr cosas muuuy interesantes, como las que puse en el caso del componente input cuando reconoce attributes.

Mi unica preocupacion despues de haber usado spirit fue que luego de compilar me genero un binario de 3 MB solo para esa gramatica!!!!! Imaginense algo mas grande. Lo bueno es que no tuve que linkear con nada. Ademas, stripeado quedo en 300 k. Anyway, para un sistema embebido es demasiado.

Como conclusion, les puedo decir que tanto spirit como regex son excelentes, pero son para cosas totalmente diferentes. Las regex son solo para cosas chicas donde necesitamos realizar una busqueda en un texto o necesitamos que el texto se de tal forma, pero no para hacer algo con gramaticas, para eso esta spirit. Cuando se metan con spirit, realmente ponganle pilas a la gramatica porque es fundamental, luego el codigo sale solo.

Espero que esta mini introduccion les sirva de algo y si necesitan alguna explicacion mas en detalle avisenme.
Saludos a todos.

David

PD: Si llegaron hasta aca leyendo se los agradezco mucho!!! Me llevo su tiempo escribir esto :)
PD2: Dani, FELIZ CUMPLE!!! espero que la pases de 10 y lo disfrutes Abrazo (se que vos vas a leer hasta aca :) )

2008/5/30 Daniel Gutson <danielgutson-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Ya que clamás que esto sirve en C++, y que está on-topic, y que boost y todo eso, te propongo, para que a todos los que nos interesa el C++ nos sirva, que de hecho postees el programita que lo implementa, usando a) Boost.Regex, y b) Boost.Spirit.
 
De esa manera sí compro y me interesa mucho ver como queda. A mí por lo menos. Vos sabé que me sube la presión y me broto cuando pasa mucho tiempo y no veo código en C++. Con este thread ya tengo una eruptiva.
 
  Daniel.
 
:)

 
On 5/30/08, David Elfi <david.elfi-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
Mas alla de que Daniel piense que esto esta off the topic, yo lo creo muy interesante sobre todo porque uno nunca sabe como trabajar bien con texto y esto ayuda a que empecemos a ver como podemos usar Regex de Boost

http://www.boost.org/doc/libs/1_35_0/libs/regex/doc/html/index.html

Yo lo estoy usando para un pequeno practico (el mismo de los streams que antes les comente) y es muy potente. Pero para usarlo necesitas conocer expresiones regulares!! Y aprender boost.RegEx y expresiones regulares al mismo tiempo creo que puede ser muuuy complicado.
Es solo mi opinion ... aguafiestas ... jaja

David


On Fri, May 30, 2008 at 12:36 PM, Daniel Gutson <danielgutson <at> gmail.com> wrote:
 


 
On 5/30/08, David Elfi <david.elfi-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

Perdon me olvide de eso.
Expliquemos paso a paso:
> cat test | perl -n -e '/^ABC_.*(ABC-.*)$/ && print "var=\"$1\"\n";'

1. cat test hace un cat del archivo que contiene la info
2. perl -n realiza un bucle que lee toda la info que viene por la
entrada estandar y que no imprime lo que va leyendo. En caso de que se
quiera imprimir se tiene que utilizar la opcion -p
3. la opcion de -e de perl significa que se tiene que evaluar los
comandos a continuacion por cada una de las lineas leidas de la
entrada estandar. Segun la explicacion del man de perl en linux
tenemos
LINE:
               while (<>) {
                   ...             # your program goes here
               }
-n significa ese while y el -e es lo que dice "# your program goes here"
4. lo que esta entre // es la expresion que se va a evaluar para cada linea.
5. La expresion esta compuesta de "^alguna expresion$". El simbolo ^
significa comienzo de linea y el $ significa fin de linea.
6. Luego tenemos ABC_.*  en esta parte buscamos ABC_ como patron fijo
y .* donde . es cualquie caracter y el * dice que se tiene que
reconocer 0 o mas veces. Podemos reconocer 1 o mas veces utilizando el
signo +, donde la expresion quedaria ABC_.+
7. Luego aparecen los ( ) y una expresion dentro muy parecida a la
anterior. Esto es, todo lo que reconozca dentro del patron que esta en
los parentesis va a ponerlo en una variable que es $1 (con el $ se
indican las variables en perl).
8. Por ultimo tenemos el print que lo unico que hace es imprimir
"var='contenido-de-la-expresion'"

Para ser mas grafico veamos el ejemplo que enviaste

  ABC_      DEF=123 and      ABC-      I=hello world
^^^^^^^^     ^^^^^^^^^^^^^^^^^     ^^^^^^      ^^^^^^^^^^^^^^^^
^  ABC_              .*                 ABC-           .*              $

Espero que quede claro. Si quieren ver mas de esto pongan "man
perlrequick", "man perlretut" o "man perlre".
Espero les sirva.
Saludos

David

On Fri, May 30, 2008 at 9:36 AM, Fernando Cacciola
<fernando.cacciola-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> Hola David,
>
> > Ok, yo siempre use perl para este tipo de cosas, no se si vale la
> > respuesta,
> > pero como estas preguntando solo de expresiones regulares podemos
> > adaptarla
> > a la tool que quieras.
>
> Claro.. de hecho me olvidé nada menos que del mismísimo perl cuando mencioné
> las herramientas a usar para esto!
>
> > Mi forma de resolverlo seria algo como
> >
> > cat test | perl -n -e '/^ABC_.*(ABC-.*)$/ && print "var=\"$1\"\n";'
> >
> > suponiendo que el archivo test tiene las lineas que mencionas.
> > Las variables $1,$2, $n en perl corresponden a las expresiones que estan
> > entre corchetes cuando se hace un matching.
> >
> Eso esta perfecto (jaja ahora que se como hacerlo me hago el canchero!)
>
> Pero te falta explicarlo, si no no vale ;)
>
> (y no estás asignando el match a una variable)
>
> Salu2
>
> Fernando
>
>
>
> >









--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Soledad Alborno | 3 Aug 01:40 2008
Picon

Re: Clonando Objectos

Hola Cristian,

Con respecto a clone, quizás sea util revisar un poco el patrón de diseño prototype: http://en.wikipedia.org/wiki/Prototype_pattern. Incluso en el link hay un ejemplo en C++

Me encantó la idea del juego, el trabado es uno de mis juegos favoritos... Cuando lo termines, subilo asi podemos ver el código y comentarlo :)

Bienvenido!
Sole

2008/8/2 Cristian Wilgenhoff <cristian.wil88-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Voy  a ver en un rato eso que me pasaste David, de paso les cuento mas o menos que estoy haciendo:

Estoy haciendo un juego de Tablero, el Trabado (Klotski, Red Donkey, Dad's Puzzle o Rush Hour). Tengo que hacer la inteligencia, generación de niveles, y un algoritmo de "Hint", en papel ya tengo pensado todo. Pero a veces surguen estos problemas de implementacion en C++, cosas que no recuerdo o nunca aprendi :P.

El juego seria algo así:

+-------------+
 | a  b  b c |
 | a  b  b c |
 | d  e  e f  |
 | d  g  h f  |
 | i           j |
+--+goal!+--+

(y la pieza B debe destrabarse deslizando las demas, llegando a "goal!")

Como ven, puede haber piezas de diferentes tamaños...

Lo estoy haciendo con Kdevelop y Cmake, cmake es barbaro para portar los proyectos y demas cosas.

Una de las Clases es Move, abstracta por supuesto, de la cual se desprenden todos los movientos, Up, Down, Right y Left. Estas clases tiene unos metodos que los implemento de la siguiente manera:

bool MoveRight::MoveRight tryMove(puzzle *p){
      // Elimino la pieza de la posicion actual.
      // Me fijo si el area de la derecha esta vacia, el area se calcula de acuerdo del tamaño de la pieza asociada y devuelve true si es valida.
      // restauro la pieza original.
}

Nota: Cuando se instancia la clase se asocia la pieza que se quiere mover.

La idea básica, creo yo es muy simple, la unica forma que se me ocurrio fue que cuando elimino las piezas del tablero no deletearlas, ya que el tablero se implementa como map< int, Pieza *>. Pieza es otra clase...

Bueno espero que se entienda mas o menos, lo hice medio rapido, puede ser que este explicado medio para el cul...

Saludos, y muchas gracias.

Cristian.




--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Cristian Wilgenhoff | 3 Aug 04:26 2008
Picon

Re: Clonando Objectos


Recien termine con todo lo básico movimientos, tablero y demás! estoy a full! hhahha. Ahora me tengo que poner codear los algoritmos a ver que sale. Lo del clon lo pude solucionar sin hacer el delete. Cuando puedan ver el codigo se van a dar cuenta, estaria piola subirlo todo de una a google code, pero no se como se maneja el svn y no tengo mucho tiempo para perder...

Saludos, Cristian.

PD: Adjunto la super version alpha, a ver si alguien la quiere ver.

--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Attachment (trabado.tar.gz): application/x-gzip, 59 KiB
Cristian Wilgenhoff | 3 Aug 02:08 2008
Picon

Channel en Freenode #cppba

Que les parece la idea de crear un channel de irc en FreeNode del grupo, si
les gusta la idea lo hago. También estaría piola, montar algún wiki o algo
de eso.

Saludos, Cristian.

Daniel Gutson | 4 Aug 03:25 2008
Picon

Re: Clonando Objectos

Hola Cristian,
  no entiendo bien el tema, y me encantaría tener tiempo para ver el código, pero estoy a mil xq estoy en un laburo nuevo.
Tenés un diagrama de clases? Mepa q hay un temita de diseño.

Por un lado: hay una jerarquía de piezas? Por qué no le pedís a una pieza q se mueva?
Cómo es el ciclo de vida de una pieza?

Según imagino, el ciclo de vida de las piezas debería coincidir con el ciclo de vida del tablero, y además esos ciclos de vida deberían estar contenidos en el ciclo de vida del juego. No entiendo por qué necesitás un ´move semantics´ (esto es, crear y destruir objetos cuando en realidad las instancias corresponden a una entidad lógica: pieza).

Te pido q lo q me respondas, sea agnóstico al lenguaje; 100% diseño. Después si surgen cosas del lenguaje, las vemos. Pero antes, el diseño.

Nos vemos,

   Daniel.

pd: te recomiendo chusmear http://code.google.com/p/board-games/


2008/8/2 Cristian Wilgenhoff <cristian.wil88 <at> gmail.com>
Voy  a ver en un rato eso que me pasaste David, de paso les cuento mas o menos que estoy haciendo:

Estoy haciendo un juego de Tablero, el Trabado (Klotski, Red Donkey, Dad's Puzzle o Rush Hour). Tengo que hacer la inteligencia, generación de niveles, y un algoritmo de "Hint", en papel ya tengo pensado todo. Pero a veces surguen estos problemas de implementacion en C++, cosas que no recuerdo o nunca aprendi :P.

El juego seria algo así:

+-------------+
 | a  b  b c |
 | a  b  b c |
 | d  e  e f  |
 | d  g  h f  |
 | i           j |
+--+goal!+--+

(y la pieza B debe destrabarse deslizando las demas, llegando a "goal!")

Como ven, puede haber piezas de diferentes tamaños...

Lo estoy haciendo con Kdevelop y Cmake, cmake es barbaro para portar los proyectos y demas cosas.

Una de las Clases es Move, abstracta por supuesto, de la cual se desprenden todos los movientos, Up, Down, Right y Left. Estas clases tiene unos metodos que los implemento de la siguiente manera:

bool MoveRight::MoveRight tryMove(puzzle *p){
      // Elimino la pieza de la posicion actual.
      // Me fijo si el area de la derecha esta vacia, el area se calcula de acuerdo del tamaño de la pieza asociada y devuelve true si es valida.
      // restauro la pieza original.
}

Nota: Cuando se instancia la clase se asocia la pieza que se quiere mover.

La idea básica, creo yo es muy simple, la unica forma que se me ocurrio fue que cuando elimino las piezas del tablero no deletearlas, ya que el tablero se implementa como map< int, Pieza *>. Pieza es otra clase...

Bueno espero que se entienda mas o menos, lo hice medio rapido, puede ser que este explicado medio para el cul...

Saludos, y muchas gracias.

Cristian.




--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---

Cristian Wilgenhoff | 4 Aug 03:50 2008
Picon

Re: Clonando Objectos

Como estas Daniel ? Gracias por el link, pero ya tengo andando todo y estoy corto de tiempo.

Tal vez mi diseño sea una porqueria que se yo pero anduvo ( horrible respuesta ), me parecio lo mas facil y rapido. El diseño sin contar los algoritmos seria algo asi:

+------------------+         +------------------------------+
 |    Pieza       |          |    Puzzle                 |
+------------------+         +------------------------------+
 |                   |          | +makeMove( Move *) |
+------------------+         +-------------------------------+

+----------------------------------+
 | Move (abstracta)          |
+----------------------------------+
 | - Pieza * p                  |
 | - pair<int , int > origen |
+----------------------------------+
 |+tryMove( Puzzle *)      |
 |+makeMove( Puzzle *)  |
+----------------------------------+
          |
   +----+------------------------------+------------------------------+------------------------------+
    |                                     |                               |                                |
+------------------+         +------------------+           +------------------+         +------------------+
 |    Up           |          |    Down       |             |    Left          |          |    Right        |
+------------------+         +------------------+           +------------------+         +------------------+
 |                   |          |                   |             |                   |          |                   |
+------------------+         +------------------+           +------------------+         +------------------+

La clase que realmente toca el tablero es "Move". Cada subclase sabe como debe tocar el tablero y me libro de tener que hacer 4000 if y case's.

void Puzzle::Puzzle makeMove( Move *move)
{
     return move->makeMove(this);
}

No se, vuelvo a repetir, tal vez es la bosta mas grande de todas... Pero salio esto y tengo poco tiempo, y no mires mucho el codigo que pase porque le corregi y modifique bastantes cosas. ( svn  :'(  )

Nota: Disculpen si no se ve bien el diagrama en ascii...

Saludos, espero que me entiendan, y si hay algun consejito rapido, bienvenido sea.

Cristian.-

--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---


Gmane