martes, 18 de octubre de 2016

Capítulo 77. Programando mi primer video juego en Small Basic Parte 5

Continuación del capítulo anterior...

SONIDO

Otra cualidad que tienen los video juegos, son la parte sonora, ya sean efectos de sonido o música de fondo.
Small basic nos provee de algunos sonidos que utilizaré en esta ocasión, (aunque también nos permite utilizar sonidos personalizados como el formato MP3). Voy a utilizar un sonido para el "clic" y otro para el fin del juego.
El sonido que utilizaré para el "clic" será el que provee la operación Sound.PlayChimes(). Para el fin del juego (Cuando se traza una línea sobre las figuras) utilizaré la operación Sound.PlayBellRing(). Poner ambos sonidos es relativamente sencillo. El primero que voy a poner será el sonido para el fin del juego. Este irá ubicado en la siguiente parte:

'raya horizontal superior
  If matriz[1][1] + matriz[1][2] + matriz[1][3] = 3 Or matriz[1][1] + matriz[1][2] + matriz[1][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(50,85,320,85)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf

Esa línea de código debe agregarse a cada condición que dibuje la línea que marca el final del juego.
Lo siguiente es agregar la operación para dar un sonido al "clic". Para ello, debe agregarse esta única línea:

  'raya horizontal superior
  If matriz[1][1] + matriz[1][2] + matriz[1][3] = 3 Or matriz[1][1] + matriz[1][2] + matriz[1][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(50,85,320,85)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  Else
    Sound.PlayChimes()
  EndIf

Cuando digo única, me refiero a que esta condición "else" solamente debe escribirse en esta zona y nada más, ya que al llamarse a la función y verificar que la condición es falsa, se ejecutará esta operación.
Y listo, creo que con esto ya podemos por dar por terminado nuestro primer juego.
Como siempre, ahora voy a publicar el código completo de este juego. Saludos.

Sub inicio
  interruptor = 1
  GraphicsWindow.MouseDown = clicX
  GraphicsWindow.Width = 370
  GraphicsWindow.Height = 300
  GraphicsWindow.PenWidth = 2
  GraphicsWindow.PenColor = "Green"
  GraphicsWindow.CanResize = "no"
 
  'lineas horizontales
  GraphicsWindow.DrawLine(80,110,290,110)
  GraphicsWindow.DrawLine(80,170,290,170)

  'lineas verticales
  GraphicsWindow.DrawLine(150,60,150,220)
  GraphicsWindow.DrawLine(220,60,220,220)
 
  'Matriz de 3 x 3 de ceros
  'X = 1
  'O = 9

  '11   12    13
  '21  22   23
  '31  32   33

  For fila = 1 To 3
    For columna = 1 To 3
      matriz[fila][columna] = 0
    EndFor
  EndFor

EndSub

inicio()

Sub clicX
  If Math.Remainder(interruptor,2) <> 0  Then
    figuraX()
  EndIf
 
  If Math.Remainder(interruptor,2) = 0 Then
     figuraO()
  EndIf 
EndSub

Sub inter
  interruptor = interruptor + 1
  If interruptor = 10 Then
    Reinicio()
  EndIf
EndSub

Sub FiguraX
  GraphicsWindow.PenColor = "Blue"
  gmX = GraphicsWindow.MouseX
  gmY = GraphicsWindow.MouseY
 
  'ubicacion 1,1
  If gmX >= 85 And gmX <= 145 And gmY >= 65 And gmY <= 105 Then
    If matriz[1][1] = 0 Then
      GraphicsWindow.DrawLine(100,70,130,100)
      GraphicsWindow.DrawLine(100,100,130,70)
      matriz[1][1] = 1
      inter()
      SumaMatriz()
    EndIf
  EndIf
 'ubicacion 1,2
 If gmX >= 155 And gmX <= 215 And gmY >= 65 And gmY <= 105 Then
   If matriz[1][2] = 0 Then
      GraphicsWindow.DrawLine(170,70,200,100)
      GraphicsWindow.DrawLine(170,100,200,70)
      matriz[1][2] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf
 
  'ubicacion 1,3
  If gmX >= 225 And gmX <= 285 And gmY >= 65 And gmY <= 105 Then
    If matriz[1][3] = 0 Then
      GraphicsWindow.DrawLine(240,70,270,100)
      GraphicsWindow.DrawLine(240,100,270,70)
      matriz[1][3] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf
 
  'ubicacion 2,1
  If gmX >= 85 And gmX <= 145 And gmY >= 115 And gmY <= 165 Then
    If matriz[2][1] = 0 Then
      GraphicsWindow.DrawLine(100,125,130,155)
      GraphicsWindow.DrawLine(100,155,130,125)
      matriz[2][1] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf 
 
  'ubicacion 2,2
  If gmX >= 155 And gmX <= 215 And gmY >= 115 And gmY <= 165 Then
    If matriz[2][2] = 0 Then
      GraphicsWindow.DrawLine(170,125,200,155)
      GraphicsWindow.DrawLine(170,155,200,125)
      matriz[2][2] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf

  'ubicacion 2,3
  If gmX >= 225 And gmX <= 285 And gmY >= 115 And gmY <= 165 Then
    If matriz[2][3] = 0 Then
      GraphicsWindow.DrawLine(240,125,270,155)
      GraphicsWindow.DrawLine(240,155,270,125)
      matriz[2][3] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf
 
  'ubicacion 3,1
  If gmX >= 85 And gmX <= 145 And gmY >= 175 And gmY <= 215 Then
    If matriz[3][1] = 0 Then
      GraphicsWindow.DrawLine(100,180,130,210)
      GraphicsWindow.DrawLine(100,210,130,180)
      matriz[3][1] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf
 
  'ubicacion 3,2
  If gmX >= 155 And gmX <= 215 And gmY >= 175 And gmY <= 215 Then
    If matriz[3][2] = 0 Then
      GraphicsWindow.DrawLine(170,180,200,210)
      GraphicsWindow.DrawLine(170,210,200,180)
      matriz[3][2] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf 
 
  'ubicacion 3,3
  If gmX >= 225 And gmX <= 285 And gmY >= 175 And gmY <= 215 Then
    If matriz[3][3] = 0 Then
      GraphicsWindow.DrawLine(240,180,270,210)
      GraphicsWindow.DrawLine(240,210,270,180)
      matriz[3][3] = 1
      inter()
      SumaMatriz()
      EndIf
  EndIf     
EndSub

Sub FiguraO
 GraphicsWindow.PenColor  = "Red"
  gwX = GraphicsWindow.MouseX
  gwY = GraphicsWindow.MouseY

  'ubicacion 1,1
  If gwX >= 85 And gwX <= 145 And gwY >= 65 And gwY <= 105 Then
    If matriz[1][1] = 0 Then
      GraphicsWindow.DrawEllipse(100,70,30,30)
      matriz[1][1] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 1,2
  If gwX >= 155 And gwX <= 215 And gwY >= 65 And gwY <= 105 Then
    If matriz[1][2] = 0 Then
      GraphicsWindow.DrawEllipse(170,70,30,30)
      matriz[1][2] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 1,3
  If gwX >= 225 And gwX <= 285 And gwY >= 65 And gwY <= 105 Then
    If matriz[1][3] = 0 Then
      GraphicsWindow.DrawEllipse(240,70,30,30)
      matriz[1][3] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 2,1
  If gwX >= 85 And gwX <= 145 And gwY >= 115 And gwY <= 165 Then
    If matriz[2][1] = 0 Then
      GraphicsWindow.DrawEllipse(100,125,30,30)
      matriz[2][1] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 2,2
  If gwX >= 155 And gwX <= 215 And gwY >= 115 And gwY <= 165 Then
    If matriz[2][2] = 0 Then
      GraphicsWindow.DrawEllipse(170,125,30,30)
      matriz[2][2] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 2,3
  If gwX >= 225 And gwX <= 285 And gwY >= 115 And gwY <= 165 Then
    If matriz[2][3] = 0 Then
      GraphicsWindow.DrawEllipse(240,125,30,30)
      matriz[2][3] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 3,1
  If gwX >= 85 And gwX <= 145 And gwY >= 175 And gwY <= 215 Then
    If matriz[3][1] = 0 Then
      GraphicsWindow.DrawEllipse(100,180,30,30)
      matriz[3][1] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 3,2
  If gwX >= 155 And gwX <= 215 And gwY >= 175 And gwY <= 215 Then
    If matriz[3][2] = 0 Then
      GraphicsWindow.DrawEllipse(170,180,30,30)
      matriz[3][2] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
 
  'ubicacion 3,3
  If gwX >= 225 And gwX <= 285 And gwY >= 175 And gwY <= 215 Then
    If matriz[3][3] = 0 Then
      GraphicsWindow.DrawEllipse(240,180,30,30)
      matriz[3][3] = 9
      inter()
      SumaMatriz()
    EndIf
  EndIf
EndSub

Sub SumaMatriz'Y raya final****************************************************
  'raya horizontal superior
  If matriz[1][1] + matriz[1][2] + matriz[1][3] = 3 Or matriz[1][1] + matriz[1][2] + matriz[1][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(50,85,320,85)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  Else
    Sound.PlayChimes()
  EndIf
 
    'raya horizontal media
  If matriz[2][1] + matriz[2][2] + matriz[2][3] = 3 Or matriz[2][1] + matriz[2][2] + matriz[2][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(50,140,320,140)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
 
  'raya horizontal inferior
  If matriz[3][1] + matriz[3][2] + matriz[3][3] = 3 Or matriz[3][1] + matriz[3][2] + matriz[3][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(50,195,320,195)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
 
  'raya vertical izquierda
  If matriz[1][1] + matriz[2][1] + matriz[3][1] = 3 Or matriz[1][1] + matriz[2][1] + matriz[3][1] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(115,30,115,250)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
 
  'raya vertical centro
  If matriz[1][2] + matriz[2][2] + matriz[3][2] = 3 Or matriz[1][2] + matriz[2][2] + matriz[3][2] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(185,30,185,250)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
 
  'raya vertical derecha
  If matriz[1][3] + matriz[2][3] + matriz[3][3] = 3 Or matriz[1][3] + matriz[2][3] + matriz[3][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(255,30,255,250)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
 
  'raya diagonal sup. izq. a der.
  If matriz[1][1] + matriz[2][2] + matriz[3][3] = 3 Or matriz[1][1] + matriz[2][2] + matriz[3][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(90,60,280,220)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
 
  'raya diagonal inf. izq. a der.
  If matriz[3][1] + matriz[2][2] + matriz[1][3] = 3 Or matriz[3][1] + matriz[2][2] + matriz[1][3] = 27 Then
    GraphicsWindow.PenWidth = 5
    GraphicsWindow.DrawLine(90,220,280,60)
    RellenaMatriz()
    Reinicio()
    Sound.PlayBellRing()
  EndIf
EndSub

'Detener clic*********************************************************
Sub RellenaMatriz
  For fila = 1 To 3
    For columna = 1 To 3
      matriz[fila][columna] = 2
    EndFor
  EndFor
EndSub

'Boton reiniciar
Sub Reinicio
  Controls.AddButton("Reiniciar",150,240)
  Controls.ButtonClicked = BtnReinicio
EndSub

Sub BtnReinicio
  GraphicsWindow.Clear()
  inicio()
EndSub


Este pequeño juego lo publiqué en la página de small basic bajo el siguiente enlace:

http://smallbasic.com/smallbasic.com/program/?QNX227

En estos momentos me encuentro desarrollando una actualización de este juego en la cual incluyo una opción para poder jugar contra la CPU. Además me gustaría incluir un sistema de puntajes para ver quien va ganando.
Esto es todo por ahora. Saludos
Version.
//Actualización. 
Se agrega modo para un jugador y se publica con codigo WMG259  y en la web con la dirección
http://smallbasic.com/smallbasic.com/program/?

Gustavo J. Cerda Nilo
Julio 2016, Octubre 2016



2 comentarios:

  1. Hola, Gus :)

    Ante todo, te agradezco mucho que te hayas tomado el trabajo monumental de publicar tus experiencias en SB. Me está siendo muy útil. Veo que hace años que has dejado este hilo, pero espero que aún estés por ahí...

    Soy un antiguo aficionado a la programación, aunque la he tenido abandonada muchos años, y ahora ya no veo compiladores para mis lenguajes, y, dado que necesito hacer un programa determinado, me he animado a empezar con SB.

    Tengo un problema muy concreto, y no encuentro nada en internet que me funcione; necesito saber si un fichero determinado está en un directorio o no está, para saber si puedo leer de él o he de crearlo inicializando sus datos. He probado con el objeto File, pero no hay manera de que me dé un resultado; tampoco me funcionan las detecciones de errores con la propiedad LastError. Por el momento me estoy apañando de mala manera arrancando con un .BAT y la función IFEXIST, pero es una cochinada :P.

    Quisiera saber si podrías publicar algún breve ejemplo de subrutina para localizar un fichero determinado y guardar el resultado en alguna variable que yo pueda usar.

    Gracias de nuevo por tu trabajo y saludos cordiales :)

    ResponderEliminar

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...