Ver Mensaje Individual
  #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
Reputación: 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