Programación General > Visual Basic 6.0 e inferiores
hacer tres en raya
(1/1)
rraul:
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:
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 --- dim Tablero(0 to 2, 0 to 2) as InfoCasillas ' casillero, donde se pintará cuando se ocupe una casilla.Dim CasillasLibres as byte ' indica cuantas casillas hay libres hasta el momento
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 --- private enum InfoCasillas CASILLA_JUGADOR_B = -1 CASILLA_VACIA = 0 CASILLA_JUGADOR_A = 1end enum
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 --- ' a nivel de formulario...Dim ImgJugador(0 to 1) as IpictureDisp private sub Form_Initialize set ImgJugador(0)= loadpicture("ruta de la imagen del jugador A") set ImgJugador(1)= loadpicture("ruta de la imagen del jugador B")End Sub
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 --- picture1.autoredraw=true ' para que no se nos borre el tablero cuando se coloque otra ventana encima... call Picture1.Scale(0,0)-(3,3) 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 --- dim Cuadro as single ' esto a nivel del formulario cuadro = picture1.scalewidth / 3 ' esto justo debajo de la línea que escala el picture.' 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
Luego convendrá que tengamos una rutina llamada iniciar partida... pero antes definimos nombres para los jugadores...
--- Código: Visual Basic --- Dim turno as byte ' a nivel de formulario dim nombreJugador(0 to 1) as string ' en el load del formulario dim nombre as string nombre = InputBox("especifique el nombre del jugador A: ", "Nombre de los contendientes...", "Jugador A") if nombre ="" then nombrejugador(0)="Jugador A" else nombrejugador(0)= nombre end if nombre = InputBox("especifique el nombre del jugador B: ", "Nombre de los contendientes...", "Jugador B") if nombre ="" then nombrejugador(1)="Jugador B" else if nombre <> nombrejugador(0) then nombrejugador(1)= nombre else nombrejugador(1)="Jugador B" end if end if Private sub IniciarPartida picture1.cls ' borramos el tablero erase tablero ' la matriz es estática, por tanto erase sólo borra el contenido CasillasLibres = 9 ' si hay algún sistema de puntuación actualizar aquí. ' echamos a suertes que jugador empieza, basado en un 50% (del 0 al 49 = 0, del 50 al 99 = 1) turno= (100 *RND)50 msgbox "Empieza el Jugador : " & NombreJugador(turno) ' ahora AQUÍ se activan todos los controles de la interfaz para jugar la partida. End Sub
También deberíamos tener una rutina que marque la jugada....
--- Código: Visual Basic --- private sub Turnar(byval Fila as byte, byval Columna as byte) ' se omite la comprobamos de fila y columna fuera de rango, es obvio y si lo haces correctamente debería ser innecesario. if CasillaLibre(Fila, Columna) = TRUE then if CasillasLibres = 0 then call VerificarResultado ' exhibir mensaje de quien ganó, indcar línea ganadora y se prevee actualizar puntuación de los juadores ' desactivar interfaz de jugada excepto los botones nueva partida y salir ( si se pulsa en nueva partida allí se habilita de nuevo la interfaz). else Picture1.PaintPicture ImgJugador(turno), columna, fila, cuadro, cuadro ' ahora cambiamos el turno del jugador Turno= abs(turno -1) msgbox "es el turno del jugador: " & nombrejugador(turno) end if else bepp msgbox "La casilla " & fila & "," & columna & " ya está ocupada. elija otra, jugador " & nombreJugador(turno) end ifend sub
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 --- private function CasillaLibre(byval F as byte, byval C as byte) as boolean if tablero(c,f) = 0 then ' si tiene un valor 0 estçá libre tablero(c,f)= ((turno * 2) -1) ' entonces se la apropiamos al jugador que tiene el turno CasillasLibres = Casillaslibres -1 ' restamos una casilla libre CasillaLibre = TRUE ' y devolvemos el resultado 'estaba libre' end if end function
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...
Navegación
Ir a la versión completa