Você está na página 1de 10

Realizar el juego Ping Pong

1.- ndice
Realizar el juego Ping Pong ............................................................................... 1 1.- ndice ......................................................................................................... 1 2.- Objectivo.................................................................................................... 2 3.- Pasos a realizar......................................................................................... 3 3.1.- Dibujar el tablero ................................................................................. 3 3.2.- Crear objetos mviles ......................................................................... 4 3.3.- Controlar las 2 palas con el teclado .................................................... 5 3.4.- Movimientos y rebotes de la bola........................................................ 6 3.4.1.- Definicin ......................................................................................... 6 3.4.2.- Cdigo general completo ................................................................. 7 3.4.3.- Funcin gestionar_rebotes_bola ...................................................... 8 3.5.- Definicin de Constantes .................................................................. 10

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

1/1

2.- Objectivo
Realizar el juego del Ping Pong en Excel utilizando macros y llamadas a funciones DLL.

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

2/2

3.- Pasos a realizar


Para realizar este juego se debern de seguir un conjunto de pasos, son los siguientes: 1.- Dibujar el tablero 2.- Crear objetos mviles 3.- Controlar las 2 palas con el teclado 4.- Movimiento y rebotes de la bola

3.1.- Dibujar el tablero


Como se espera que el campo de juego sea simtrico es necesario hacer que el ancho de las columnas que conforman el campo sean iguales, en este caso 3 cm. Nuestro campo estar delimitado por celdas de fondo negro, adicionalmente dibujamos una lnea vertical y una circunferencia.

Las porteras sern de las filas 9 a las 16 Ponemos un botn y le asociamos el siguiente cdigo: Private Sub CommandButton1_Click() Call ejecutar_juego End Sub

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

3/3

3.2.- Crear objetos mviles


Para hacer una paleta: Se dibuja un rectngulo y se le pone fondo amarillo Se cambia el nombre del rectngulo y se le llama jugador1 Con el fin de asegurarnos que las 2 paletas son iguales se hace un copiar pegar, a esta segunda paleta se le llama jugador2 y se pinta de color verde. Situamos ambas paletas equidistantes de las paredes verticales

Realizamos un circulo azul con la herramienta elipse, a esta elipse la llamaremos bola

A este tablero le aadiremos un botn de inicio y informacin de las teclas de control www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

4/4

3.3.- Controlar las 2 palas con el teclado


Vamos a empezar a realizar un mdulo al que llamaremos MMOVIMIENTO. Con el fin de poder utilizar una DLL que controle cuando apretamos una tecla o cuando apretamos otra pondremos la siguiente declaracin:
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

Para realizar una espera activa se utiliz la siguiente declaracin:


Declare Function GetTickCount Lib "kernel32" () As Long

Para controlar el juego en si y el movimiento de las paletas declaramos la siguiente accin:


Public Sub ejecutar_juego() Dim fin As Boolean fin = False While fin = False If GetAsyncKeyState(48) Then fin = True: gol = False End If If GetAsyncKeyState(76) Or GetAsyncKeyState(108) Then 'l Call mover_pala("jugador2", 2) End If If GetAsyncKeyState(80) Or GetAsyncKeyState(112) Then 'p Call mover_pala("jugador2", -2) End If If GetAsyncKeyState(81) Or GetAsyncKeyState(113) Then 'q Call mover_pala("jugador1", -2) End If If GetAsyncKeyState(97) Or GetAsyncKeyState(65) Then 'a Call mover_pala("jugador1", 2) End If DoEvents Call esperar(20) Wend End Sub

La funcin GetAsyncKeyState nos indica si el cdigo ASCII1 esta siendo apretado o no. Controles 0 l p q a Funcin salir del juego mover pala abajo del jugador2 mover pala arriba del jugador2 mover pala arriba del jugador1 mover pala abajo del jugador1

El procedimiento mover_pala gestiona el movimiento de la paleta; controlando que esta no se salga del tablero
1

Utilice la funcin CODIGO para dado una letra saber cual es su cdigo ASCII

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

5/5

'Realiza el movimiento de la pala Private Sub mover_pala(nombre_pala As String, desfase As Long) Dim nueva_posicion As Long nueva_posicion = ActiveSheet.Shapes(nombre_pala).Top + desfase If nueva_posicion < CONST_PALA_EJEY_MAX And _ nueva_posicion > CONST_PALA_EJEY_MIN Then ActiveSheet.Shapes(nombre_pala).Top = nueva_posicion End If End Sub

Para descubrir cuales son los valores mximos y mnimos de las paletas se calcularon de manera emprica, es decir, que a medida que mova la paleta mostraba en que posicin se encontraba hasta ver donde se podra considerar que era el fin del tablero. Este mtodo tambin sirvi para definir los rangos del movimiento de la bola. Se realiza una espera activa de 20 milisegundos con el fin de que se pueda controlar bien las paletas
'Espera activa Public Sub esperar(milisegundos As Long) Dim tiempo As Long tiempo = GetTickCount Do While GetTickCount - tiempo < milisegundos DoEvents Loop End Sub

3.4.- Movimientos y rebotes de la bola 3.4.1.- Definicin


Para definir el movimiento de la bola debemos tomar varias decisiones: 1.- La velocidad de la bola se definir por el desplazamiento horizontal (eje x) y vertical (eje y) de la bola; es decir; utilizaremos 2 variables. El signo nos indicar el sentido. Valores de velocidad Movimiento de la bola velocidadx>0 de izquierda a derecha velocidadx=0 no hay movimiento horizontal Nunca llegar a las porteras!!!! velocidadx<0 de derecha a izquierda velocidady>0 de abajo a arriba velocidady=0 no hay movimiento vertical velocidady<0 de arriba a abajo 2.- La velocidad inicial es aleatoria; hay que tener en cuenta que la velocidad del eje horizontal debe ser diferente de 0; ya que si no; no llegara a ninguna de las dos porteras

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

6/6

3.- Definiremos que hay rebote con una pared (sea la superior, inferior, izquierda o derecha) cuando la posicin actual no llega pero en la siguiente la sobrepasa. ejemplo1: la pared izquierda esta en las coordenadas: 39 la bola esta en la posicin 45 y su velocidad es de 10 posicin actual:45, siguiente posicin: 35 ==> hay rebote ya que 39 esta en este intervalo(35,45) ejemplo2: la pared izquierda esta en las coordenadas: 39 la bola esta en la posicin 45 y su velocidad es de 5 posicin actual:45, siguiente posicin: 40 ==> no hay rebote ya que 39 no esta en este intervalo(40,45)

3.4.2.- Cdigo general completo


El cdigo general quedar de la siguiente manera.
Public Sub ejecutar_juego() Dim fin As Boolean, gol As Boolean Dim velocidad_bolax As Long, velocidad_bolay As Long Call calcular_posicion_velocidad(velocidad_bolax, velocidad_bolay) Call posicion_inicial_juego("bola", "jugador1", "jugador2") fin = False While fin = False If GetAsyncKeyState(48) Then fin = True: gol = False End If If GetAsyncKeyState(76) Or GetAsyncKeyState(108) Then 'l Call mover_pala("jugador2", 2) End If If GetAsyncKeyState(80) Or GetAsyncKeyState(112) Then 'p Call mover_pala("jugador2", -2) End If If GetAsyncKeyState(81) Or GetAsyncKeyState(113) Then 'q Call mover_pala("jugador1", -2) End If If GetAsyncKeyState(97) Or GetAsyncKeyState(65) Then 'a Call mover_pala("jugador1", 2) End If If gestionar_rebotes_bola("bola", "jugador1", "jugador2", velocidad_bolax, _ velocidad_bolay) = True Then fin = True: gol = True End If 'Call gestionar_posiciones_bola("bola") DoEvents Call esperar(20) Wend DoEvents Call posicion_inicial_juego("bola", "jugador1", "jugador2") DoEvents If gol Then MsgBox "GOOOOOOOOOOOOOOL!!!!!!!!!!!!" End If End Sub

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

7/7

Nuevos procedimientos: calcular_posicion_velocidad: retorna la velocidad inicial de la bola posicion_inicial_juego: coloca las paletas y las bola en la posicin inicial

3.4.3.- Funcin gestionar_rebotes_bola


La funcin mas compleja y que estudiaremos ahora es gestionar_rebotes_bola Esta funcin realiza las siguientes validaciones: aplica rebote con la paletas si se da el caso si no hay rebote con las paletas gestiona si ha habido gol en caso contrario gestiona rebote con la paredes si aplica aplica movimiento de la bola Nos retornara si ha habido gol
Public Function gestionar_rebotes_bola(nombre_bola As String, nombre_jugador1 As String, nombre_jugador2 As String, _ velocidadx As Long, velocidady As Long) As Boolean Dim x0 As Long, x1 As Long Dim y0 As Long, y1 As Long Dim ret As Boolean ret = False x0 = ActiveSheet.Shapes(nombre_bola).Left x1 = ActiveSheet.Shapes(nombre_bola).Left + velocidadx y0 = ActiveSheet.Shapes(nombre_bola).Top y1 = ActiveSheet.Shapes(nombre_bola).Top + velocidady If gestionar_rebotes_palas(nombre_bola, nombre_jugador1, _ nombre_jugador2, x0, x1, y0, y1, _ velocidadx, velocidady) = False Then ret = gestionar_gol(nombre_bola, x0, x1, y0, y1) Call gestionar_rebotes_bola_paredes(nombre_bola, x0, x1, y0, y1, _ velocidady, velocidadx) End If ActiveSheet.Shapes(nombre_bola).Top = _ ActiveSheet.Shapes(nombre_bola).Top + velocidady ActiveSheet.Shapes(nombre_bola).Left = _ ActiveSheet.Shapes(nombre_bola).Left + velocidadx gestionar_rebotes_bola = ret End Function

Fjate como se definen 4 variables: x0: posicin horizontal actual de la bola, y0: posicin vertical actual de la bola x1: posicin horizontal futura de la bola, y1: posicin vertical futura de la bola Con estas variables podremos definir los diferentes rebotes (con las paletas o con la pared) o si ha habido gol. Al final de la funcin realiza el movimiento de la bola sumando la posicin actual a la velocidad. Los posibles rebotes solo cambiarn el signo de las velocidades, es decir, el sentido del movimiento

www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

8/8

La funcin gestionar_gol confirma si horizontalmente sobrepasa la pared y si verticalmente esta dentro de la portera. Recuerda el significado de estas variables: x0: posicin horizontal actual, y0: posicin vertical actual x1: posicin horizontal futura, y1: posicin vertical futura
Private Function gestionar_gol(nombre_bola As String, x0 As Long, x1 As Long, y0 As Long, y1 As Long) As Boolean Dim ret As Boolean ret = False If x0 >= CONST_BOLA_EJEX_MIN And _ x1 <= CONST_BOLA_EJEX_MIN Then 'porteria izquierda If y1 >= CONST_PORTERIA_EJEY_MIN And _ y1 <= CONST_PORTERIA_EJEY_MAX Then ret = True End If ElseIf x0 <= CONST_BOLA_EJEX_MAX And _ x1 >= CONST_BOLA_EJEX_MAX Then 'porteria derecha If y1 >= CONST_PORTERIA_EJEY_MIN And _ y1 <= CONST_PORTERIA_EJEY_MAX Then ret = True End If End If gestionar_gol = ret End Function

La funcin gestionar_rebotes_bola_paredes gestiona los rebotes con las paredes horizontales o verticales, si hay rebote lo que har ser multiplicar por -1 la componente horizontal o vertical
Private Sub gestionar_rebotes_bola_paredes(nombre_bola As String, x0 As Long, x1 As Long, y0 As Long, y1 As Long, velocidady As Long, velocidadx As Long) 'rebote vertical If y0 >= CONST_BOLA_EJEY_MIN And y1 <= CONST_BOLA_EJEY_MIN Then 'rebote inferior velocidady = velocidady * -1 ElseIf y0 <= CONST_BOLA_EJEY_MAX And y1 >= CONST_BOLA_EJEY_MAX Then 'rebote superior velocidady = velocidady * -1 End If 'rebote horizontal If x0 >= CONST_BOLA_EJEX_MIN And x1 <= CONST_BOLA_EJEX_MIN Then 'rebote izquierda velocidadx = velocidadx * -1 ElseIf x0 <= CONST_BOLA_EJEX_MAX And x1 >= CONST_BOLA_EJEX_MAX Then 'rebote derecha velocidadx = velocidadx * -1 End If End Sub

La funcin rebotes_palas comprueba que haya rebote con la pala. En caso de que exista modificar la velocidad vertical del rebote utilizando la funcin modificar_rebote_bola_ejey, este cambio ser en valor con el fin de simular si se rebota con las esquinas de la paleta. www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

9/9

Primero comprueba si horizontalmente tendr rebote con la paleta (sea la del jugador 1 o la del jugador 2); en caso afirmativo comprueba si verticalmente hay contacto; esto se da cuando la diferencia de posicin vertical entre la bola y la paleta esta entre 6 y 24. Este rango se da por que la paleta tiene altura con lo que hay que comprobar si la bola da en alguna zona de la paleta, estos valores se calcularon empricamente. Si hay rebote modificar el signo de la velocidad horizontal.
Private Function gestionar_rebotes_palas(nombre_bola As String, _ nombre_jugador1 As String, _ nombre_jugador2 As String, _ x0 As Long, x1 As Long, y0 As Long, y1 As Long, _ velocidadx As Long, velocidady As Long) As Boolean Dim ret As Boolean, diffy As Long ret = False If x0 >= CONST_BOLA_PALA_JUG1_REBOTE And _ x1 <= CONST_BOLA_PALA_JUG1_REBOTE Then 'Rebote con el jugador1 diffy = y1 - ActiveSheet.Shapes(nombre_jugador1).Top If diffy >= -6 And diffy <= 24 Then Call modificar_rebote_bola_ejey(diffy, velocidady, y0, y1) ret = True velocidadx = velocidadx * -1 End If ElseIf x0 <= CONST_BOLA_PALA_JUG2_REBOTE And _ x1 >= CONST_BOLA_PALA_JUG2_REBOTE Then 'Rebote con el jugador2 diffy = y1 - ActiveSheet.Shapes(nombre_jugador2).Top If diffy >= -6 And diffy <= 24 Then Call modificar_rebote_bola_ejey(diffy, velocidady, y0, y1) ret = True velocidadx = velocidadx * -1 End If End If gestionar_rebotes_palas = ret End Function

3.5.- Definicin de Constantes


Las constantes que se han definido empricamente son las siguientes: Constantes Valor Significado CONST_PALA_EJEY_MIN 81 Posicin vertical mnima de las palas CONST_PALA_EJEY_MAX 282 Posicin vertical mxima de las palas CONST_BOLA_EJEY_MIN 81 Pared inferior CONST_BOLA_EJEY_MAX 300 Pared superior CONST_BOLA_EJEX_MIN 39 Pared izquierda CONST_BOLA_EJEX_MAX 596 Pared derecha CONST_PORTERIA_EJEY_MIN 145 Poste inferior de la portera CONST_PORTERIA_EJEY_MAX 236 Poste superior de la portera CONST_BOLA_PALA_JUG1_REBOTE 47 Posicin horizontal de contacto entre pala y bola del jugador1 CONST_BOLA_PALA_JUG2_REBOTE 589 Posicin horizontal de contacto entre pala y bola del jugador2 www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.

10 / 10

Você também pode gostar