Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-11-2005
mifiar mifiar is offline
Registrado
 
Registrado: nov 2005
Posts: 9
Poder: 0
mifiar Va por buen camino
Duda sobre como programar el juego Timbiriche

hola, tengo una duda sobre la forma de programar este juego, por si no lo conocen, consiste en una especie de cuadrícula con muchos puntos, los cuales se tienen que unir con lineas, con el objetivo de formar cuadros. Espero me haya dado a entender; estaba pensando la manera de como hacerlo, tengo la idea de como hacer algunas cosas, pero lo que no puedo siquiera imaginar es como identificar durante el juego cuando se ha formado un cuadro (y si quieren aportar algunas otras ideas que creen me pudieran servir bienvenidas sean ), por lo que acudo a ustedes a ver si alguien ha hecho algo parecido y pudiera orientarme. Tambien quiero saber si delphi es la herramienta idónea para hacer este tipo de cosas; espero sus respuestas y gracias de antemano .
Responder Con Cita
  #2  
Antiguo 05-11-2005
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
idonea. yo creo que si...

este tipo de cosas de reconocer formas....
me han dicho que tienen que ver con la programacion de
redes neuronales.

en torry hay unos componentes que es para reconocer
texto, y pasarlo a texto. desde una imagen escaneada
de un libro.

eso puede servir, como idea orientativa.
Responder Con Cita
  #3  
Antiguo 05-11-2005
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
No se si es función únicamente de los moderadores, pero bueno: ¡Bienvenido a Clubdelphi!

Cita:
Empezado por mifiar
estaba pensando la manera de como hacerlo, tengo la idea de como hacer algunas cosas
¿Serías tan amable, de indicarnos como estabas pensando resolverlo? Para un problema pueden existir miles de soluciones, sería conveniente que nos indiques la tuya para poder ofrecerte una ayuda más precisa.
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 05-11-2005
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
¿Puede ser así?

Cita:
Empezado por JXJ
este tipo de cosas de reconocer formas....
me han dicho que tienen que ver con la programacion de
redes neuronales
¿Redes nueornales? Eso me huele complicado.... y creo que lo es, ¿que acaso no está relacionado con lo que es IA (Inteligencia Artificial)?
Debe haber algo más simple.

Por ejemplo yo estaba pensando en hacer un "tablero" con una estructura adecuada de nodos (con punteros, oviamente) donde cada nodo representa un punto de cada cuadrícula. NOTA: para que esto funcione, habría que identificar a cada nodo. Entonces, si se puede hacer algún procedimiento hipotético BuscarVecinos() y se pasa como parámetro dicho identificador que devuelva algún valor booleano que refleje si hay un rectángulo.

NOTA:
1. Habría que contemplar si el nodo en cuestión está ubicado en las esquinas.
2. Se entiende por nodo vecino a todo nodo que lo "rodee" al mismo. Claro está que un nodo tendrá entonces cuatro punteros.

Algo así:
nodo1 - nodo2 - nodo3
| | |
nodo4 - nodo5 - nodo6
| | |
nodo7 - nodo8 - nodo9

Cada línea representaría el enlace de los nodos.
Crearía una clase que hiciera lo siguiente:

Hasta el momento podría ser así:
Código Delphi [-]
procedure CrearTablero(Tamanno: integer);
// crea el tablero con una estructura de nodos
 
function BuscarVecinos(IDNodo: TIDNodo): boolean;
// buscar vecinos: si encuentra a los vecinos marcados 
//(hay una línea entre ellos) indica que se ha formado un cuadrado
 
// estructura de nodo
Nodo = ^TNodo;
TNodo = record
Marcado: boolean;
Vecino1,Vecino2,Vecino3,Vecino4: Nodo;
end;

No se si me explico.
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 05-11-2005 a las 06:39:13. Razón: aclaraciones
Responder Con Cita
  #5  
Antiguo 05-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por Delphius
No se si es función únicamente de los moderadores, pero bueno: ¡Bienvenido a Clubdelphi!
No solamente no es cuestión únicamente de los moderadores, pero, todo lo contrario, diría yo.

Recordarle a mifiar la guía de estilo y el buscador de estos Foros, pues que le serán seguro útiles.

La bienvenida ya se la diste tú Delphius, y, que sea enhorabuena.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 05-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Vamos a ver, no creo que sea muy complicado. Como pienso las cosas lo primero que hay que hacer es separar la parte gráfica de la parte lógica.

Vería muy difícil que del sólo trazo gráfico Canvas.LineTo(X, Y) pudieras determinar si se cierra o no un cuadrado. Así que lo primero es pensar en cómo podemos representar el juego de manera lógica sin meternos para nada en lo gráfico. De hecho esto último es meramente secundario.

Piensa en el tablero del timbiriche como lo muestra esta figura donde numeras las filas de arriba hacia abajo y las columnas de izquierda a derecha.

Ahora piensa en una raya horizontal y en una raya vertical.

La raya horizontal queda determinada por dos parámetros (i, j), significando que es la raya en la fila i que va de la columna j a la j+1.

De la misma forma, la raya vertical requiere de dos parámetros (i, j), sólo que ahora significan que la raya está en la columna j y va de la fila i a la i+1.

Puedes entonces crear dos arreglos bidimensionales H y V de valores booleanos:

Código Delphi [-]
var
  H: array[0..m-1, 0..n-2] of Boolean;
  V: array[0..m-2, 0..n-1] of Boolean;

donde m es el número de filas y n el número de columnas. H te indicaría cuáles rayas horizontales están ya pintadas y V te diría cuáles rayas verticales ya lo están.

Resumiendo,
  • si H[i, j] es true, significa que ya está pintada la raya en la fila i que va de la columna j a la j+1.

  • si V[i,j] es true, significa que ya está pintada la raya en la columna j que va de la fila i a la i+1.

Con esto tendrías representado el estado del juego en todo momento, y éste terminará cuando todas las entradas de los dos arreglos sean true.

Ahora bien, cuando trazas una raya horizontal sólo hay dos cuadrados que pueden cerrarse, como se ve en esta figura y análogamente sucede con una raya vertical, como puedes ver aquí.

Así pues, al trazar la raya H[i, j] debes ver si las otras aristas del cuadrado de arriba o del de abajo ya están trazadas. Las tres rayas del cuadrado superior son

(a) H[i-1, j], V[i-1, j] y V[i-1, j+1]

mientras que las del cuadrado inferior son

(b) H[i+1, j], V[i, j] y V[i, j+1]

Entonces, al trazar la raya horizontal en la fila i que va de la columna j a la j+1 (la correspondiente a H[i, j]) debes verificar si las tres entradas de (a) son todas true o bien si todas las entradas de (b) son true.

Un análisis similar haces para cuando trazas la raya V[i, j]. En este caso tienes que considerar:

(c) V[i, j-1], H[i, j-1] y H[i+1, j-1]

(d) V[i, j+1], H[i, j] y H[i+1, j]

Claro que hay que considerar aparte los casos en que la raya se trace en un extremo de la retícula de puntos ya que en ese caso, la raya sólo puede estar cerrando a lo sumo un cuadrado.

Obvio que esto es apenas una parte de todo el juego. Cada vez que una raya cierre un cuadrado tendrías que ver si puede cerrarse otro más para desarrollar la cadena de cuadrados. Y ni qué decir que la parte más difícil- si quieres que la pc juegue contra el humano -será implementar la estrategia ganadora.

Desde luego no sé qué tan buena es esta representación del juego en cuanto a eficiencia, pero considerando que un tablero de timbiriche no puede ser demasiado grande, quizá no importe demasiado.

En cuanto a la parte gráfica, como ya te indicó David, buscando en los foros podrás encontrar varias referencias a cómo dibujar. De momento se me ocurre un PaintBox en cuyo evento OnPaint repasas los dos arreglos para saber qué rayas has de pintar.

postdata

Esto lo comencé a escribir antes de ver que ya Delphius había proporcionado una idea concreta. Analiza ambas para ver cuál te acomoda más. Puede ser que la de él sea más viable, no lo sé. El punto es que tomes la que facilite más la búsqueda del cuadrado.

// Saludos

Última edición por roman fecha: 05-11-2005 a las 09:09:16.
Responder Con Cita
  #7  
Antiguo 05-11-2005
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por roman
Esto lo comencé a escribir antes de ver que ya Delphius había proporcionado una idea concreta. Analiza ambas para ver cuál te acomoda más. Puede ser que la de él sea más viable, no lo sé. El punto es que tomes la que facilite más la búsqueda del cuadrado.
Cita:
Empezado por Yo
Para un problema pueden existir miles de soluciones, sería conveniente que nos indiques la tuya para poder ofrecerte una ayuda más precisa.
Tal como lo dije antes, para un problema hay muchas soluciones.... Habría que ver como lo estaba pensando mifiar, lo ideal sería "ajustar" sus ideas más que ofrecerle alternativas.

PD: roman, al principio lo había pensado así pero al usar arrays limitaría demasiado el tamaño del tablero... me pareció oportuno trabajar con nodos (a pesar de que sería complicado) ya que podría crearse tableros de distintos tamaños. NOTA: Me llamó la atención de que tu tablero sea de (mxn), tengo entendido que el tablero debe ser de (nxn)
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 05-11-2005 a las 15:40:58. Razón: corrección en etiquetas
Responder Con Cita
  #8  
Antiguo 05-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Delphius
NOTA: Me llamó la atención de que tu tablero sea de (mxn), tengo entendido que el tablero debe ser de (nxn)
Pues no sé si hay alguna regla oficial. En mis tiempos de escolar, hace muchas lunas, lo jugábamos en cualquier papel cuadriculado que tuviéramos a mano y el tamaño del "tablero" era proporcional a qué tan aburrida estaba la clase del profesor.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:31:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi