• Viernes 26 de Abril de 2024, 23:44

Autor Tema:  hacer tres en raya  (Leído 8395 veces)

rraul

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
hacer tres en raya
« en: Martes 18 de Mayo de 2010, 09:37 »
0
e exo unas tres en raya con 2 imagens
1 imagen la x en la cual hay 3 una matriz lo mismo con el circulo ayudarme a terminar
tngo un picture con varios shapes para hacer los cuadros de las tres en raya






Option Explicit
Dim Ocupado(6), Usada(6) As Boolean
Dim Pieza As Integer

Private Sub Image_Click(Index As Integer)
Usada(Index) = True
Ocupado(Index) = False
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Image1(1).Left = X
Image1(1).Top = Y
End If

If Button = 2 Then
Image2(1).Left = X
Image2(1).Top = Y
End If

End Sub

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: hacer tres en raya
« Respuesta #1 en: Jueves 20 de Mayo de 2010, 03:41 »
0
Al menos en mi tierra, el juego de las 3 en raya se compone de un tablero de 3x3, luego lo correcto para reflejar el estado del tablero sería una matriz de 3x3

Código: Visual Basic
  1.  
  2. dim Tablero(0 to 2, 0 to 2) as InfoCasillas    ' casillero, donde se pintará cuando se ocupe una casilla.
  3. Dim CasillasLibres as byte  ' indica cuantas casillas hay libres hasta el momento
  4.  
  5.  

Cada casilla del tablero puede tener 3 estados, 0 = no ocupado, 1= ocupada por el jugador A, -1= ocupada por el jugador B
Código: Visual Basic
  1.  
  2. private enum InfoCasillas
  3.       CASILLA_JUGADOR_B = -1
  4.       CASILLA_VACIA = 0
  5.       CASILLA_JUGADOR_A = 1
  6. end enum
  7.  
  8.  

Para dibujar el tablero dado que solo requiere unas pocas líneas podrías usar un control line, de hecho una matriz de line, basta con 4 rayas si el picture que hace de tablero lo delimita perimetralmente.

Luego podrías tener 2 imágenes ocultas, para indicar  casilla ocupada por un jugador u otro, básicamente podría ser una imagen cuadrada roja y otra azul ambas cruzadas por una 'X' blanca (por ejemplo), luego al iniciar el formulario las podrías cargar desde fichero o si lo prefieres mantenerlas ocultas en un par de controles image.
Código: Visual Basic
  1.  
  2. ' a nivel de formulario...
  3. Dim ImgJugador(0 to 1) as IpictureDisp
  4.  
  5.  
  6. private sub Form_Initialize
  7.      set ImgJugador(0)= loadpicture("ruta de la imagen del jugador A")
  8.      set ImgJugador(1)= loadpicture("ruta de la imagen del jugador B")
  9. End Sub
  10.  
  11.  

El tablero puesto que es finito y de tamaño conocido podría ser escalado a las casillas que ha de contener (esto facilita luego su dibujado), entonces en el evento initiiialize del formulario o en el load, podrías poner la siguiente línea:
Código: Visual Basic
  1.  
  2.       picture1.autoredraw=true ' para que no se nos borre el tablero cuando se coloque otra ventana encima...
  3.      call Picture1.Scale(0,0)-(3,3)
  4.  
  5.  
Como ya hemos escalado el tablero entonces podremos referirnos a las casillas como 0,1 y 2, para terminar de hacer cómodo el uso del tablero definimos también la medida de 1 casilla del tablero:
Código: Visual Basic
  1.  
  2. dim Cuadro as single  ' esto a nivel del formulario
  3.  
  4.     cuadro = picture1.scalewidth / 3 ' esto justo debajo de la línea que escala el picture.
  5. ' NOTA: si la picture no es cuadrado convendrá definir otra variable dedicando una para el ancho de las casillas y otra para el alto de las casillas
  6.  
  7.  

Luego convendrá que tengamos una rutina llamada iniciar partida... pero antes definimos nombres para los jugadores...
Código: Visual Basic
  1.  
  2.   Dim turno as byte ' a nivel de formulario
  3.   dim nombreJugador(0 to 1) as string
  4.  
  5.    ' en el load del formulario
  6.    dim nombre as string
  7.       nombre = InputBox("especifique el nombre del jugador A: ", "Nombre de los contendientes...", "Jugador A")
  8.      if nombre ="" then
  9.                  nombrejugador(0)="Jugador A"
  10.       else
  11.             nombrejugador(0)= nombre
  12.       end if
  13.  
  14.      nombre = InputBox("especifique el nombre del jugador B: ", "Nombre de los contendientes...", "Jugador B")
  15.      if nombre ="" then
  16.                  nombrejugador(1)="Jugador B"
  17.       else
  18.             if nombre <> nombrejugador(0) then
  19.                     nombrejugador(1)= nombre
  20.             else
  21.                     nombrejugador(1)="Jugador B"
  22.               end if
  23.       end if
  24.  
  25.  
  26.      Private sub IniciarPartida
  27.             picture1.cls     '  borramos el tablero
  28.             erase tablero  '  la matriz es estática, por tanto erase sólo borra el contenido
  29.             CasillasLibres = 9
  30.            ' si hay algún sistema de puntuación actualizar aquí.
  31.          
  32.           ' echamos a suertes que jugador empieza, basado en un 50% (del 0 al 49 = 0, del 50 al 99 = 1)
  33.          turno= (100 *RND)50
  34.          msgbox "Empieza el Jugador : " & NombreJugador(turno)  
  35.          
  36.          ' ahora AQUÍ se activan todos los controles de la interfaz para jugar la partida.
  37.      End Sub
  38.  
  39.  

También deberíamos tener una rutina que marque la jugada....
Código: Visual Basic
  1.  
  2. private sub Turnar(byval Fila as byte, byval Columna as byte)
  3.          ' se omite la comprobamos de fila y columna fuera de rango, es obvio y si lo haces correctamente debería ser innecesario.
  4.          
  5.          if CasillaLibre(Fila, Columna) = TRUE then
  6.               if CasillasLibres = 0 then
  7.                     call VerificarResultado
  8.                     ' exhibir mensaje de quien ganó, indcar línea ganadora y se prevee actualizar puntuación de los juadores
  9.                     ' desactivar interfaz de jugada excepto los botones nueva partida y salir  ( si se pulsa en nueva partida allí se habilita  de nuevo la interfaz).
  10.              else
  11.                    Picture1.PaintPicture ImgJugador(turno), columna, fila, cuadro, cuadro
  12.                     ' ahora cambiamos el turno del jugador
  13.                    Turno= abs(turno -1)  
  14.                    msgbox "es el turno del jugador: " & nombrejugador(turno)
  15.                end if
  16.         else
  17.                 bepp
  18.                 msgbox "La casilla " & fila & "," & columna & " ya está ocupada. elija otra, jugador " & nombreJugador(turno)
  19.         end if
  20. end sub
  21.  
  22.  
 

Como ya podrás averiguar por el código anterior necesitamos 2 nuevas funciones una que verifique si la casilla indicada está libre:
si está libre la marcamos 'fichada' por el jugador que ostenta elturno y restamos una casilla libre del tablero...
Código: Visual Basic
  1.  
  2.          private function CasillaLibre(byval F as byte, byval C as byte) as boolean
  3.                    if tablero(c,f) = 0 then   ' si tiene un valor 0 estçá libre
  4.                            tablero(c,f)= ((turno * 2) -1)   ' entonces se la apropiamos al jugador que tiene el turno
  5.                            CasillasLibres = Casillaslibres -1  ' restamos una casilla libre
  6.                             CasillaLibre = TRUE   ' y devolvemos el resultado 'estaba libre'
  7.                   end if
  8.          end function
  9.  
  10.  

Como ves está casi todo, te dejo que resuelvas la función "VerificarResultado" para determinar quien ganó o si acabó en tablas... y algunos pequeños detalles... que corren de tu cuenta, como enviar la fila y columna elegida por un jugador a la rutina que evalúa el movimiento de la ficha a la casilla determinada por la fila y columna elegida...

Los controles 'line' para dibujar el resto del tablero 8las 4 rayas divisorias) puedes ubicarlas fácilmente una vez que hemos escalado el picture y obtenido el tamaño de cada casilla en la variable 'cuadro'....

Te invito también a que añadas código al evento resize del formulario para que al agrandarse éste también se agrande el tablero y las fichas ya colocadas...
«Ma non troppo»
----> ModoVacaciones = False<----