Microsoft Small Basic

Program Listing:
Embed this in your website
' Football 0.5
' Copyright (c) 2013 Nonki Takahashi. All rights reserved.
'
' History:
' 0.5 2013/03/10 Changed not to kick back by forward. (ZVL057-3)
' 0.4 2013/03/06 VRAM array removed. (ZVL057-2)
' 0.3b 2013/03/05 Enabled to play and added semaphore. (ZVL057-1)
' 0.2a 2013/03/05 Enabled score and paddle. (ZVL057-0)
' 0.1a 2013/03/05 Graphics created. (ZVL057)
'
GraphicsWindow.Title = "Football 0.5"
GraphicsWindow.BackgroundColor = "#222222"
Sound_Init()  ' preload sounds
Num_Init()
Court_Init()
Paddle_Init()
Score_Init()
player = 1
Ball_Init()
Timer.Interval = 10
Timer.Tick = OnTick
GraphicsWindow.KeyUp = OnKeyDown
While "True"
  If beep Then
    Sound.PlayAndWait(urlBeep)
    beep = "False"
  EndIF
  If ping Then
    Sound.Stop(urlPing)
    Sound.Play(urlPing)
    ping = "False"
  EndIF
  Program.Delay(10)
EndWhile
Sub OnKeyDown
  If semaphore Then
    Goto okd_exit
  Else
    semaphore = "True"
  EndIf
  key = GraphicsWindow.LastKey
  If key = "S" Then     ' player 1 paddle up
    player = 1
    Paddle_Up()
  ElseIf key = "D" Then ' player 1 paddle down
    player = 1
    Paddle_Down()
  ElseIf key = "K" Then ' player 2 paddle up
    player = 2
    Paddle_Up()
  ElseIf key = "L" Then ' player 2 paddle down
    player = 2
    Paddle_Down()
  EndIf
  semaphore = "False"
  okd_exit:
EndSub
Sub OnTick
  If semaphore Then
    Goto ot_exit
  Else
    semaphore = "True"
  EndIf
  Ball_Update()
  semaphore = "False"
  ot_exit:
EndSub
Sub Ball_Init
  ' param player - 1 or 2
  ballX = x0 + (centerCol - 1) * sizeX
  ballY = y0 + (centerRow - 1) * sizeY
  If ball = "" Then
    ball = Shapes.AddRectangle(sizeX, sizeY)
  EndIf
  Shapes.Move(ball, ballX, ballY)
  If player = 1 Then
    vx = 4
    vy = (Math.GetRandomNumber(10) - 5.5) / 2
  ElseIf player = 2 Then
    vx = -4
    vy = (Math.GetRandomNumber(10) - 5.5) / 2
  EndIf
EndSub
Sub Ball_Update
  ' param ballY, ballX - ball position
  ' param vx, vy - velocity of ball [pixel/tick]
  ballX = ballX + vx
  ballY = ballY + vy
  Shapes.Move(ball, ballX, ballY)
  If 0 < vy Then
    If bottomY - sizeY <= ballY Then
      vy = -vy
      ping = "True"
    EndIf
  ElseIf vy < 0 Then
    If ballY <= topY + sizeY Then
      vy = -vy
      ping = "True"
    EndIf
  EndIf
  If ballX < goalX[1] Then
    player = 2
    s = score[player]["score"] + 1
    Score_Set()
    beep = "True"
    Program.Delay(2000)
    player = 1
    Ball_Init()
  ElseIf goalX[2] < ballX Then
    player = 1
    s = score[player]["score"] + 1
    Score_Set()
    beep = "True"
    Program.Delay(2000)
    player = 2
    Ball_Init()
  ElseIf 0 < vx Then
    If Math.Abs(paddleX[2][1] - sizeX - ballX) <= Math.Abs(vx) And paddleY[2] - sizeY <= ballY And ballY <= paddleY[2] + 5 * sizeY Then
      vx = -vx
      ping = "True"
    ElseIf Math.Abs(paddleX[2][2] - sizeX - ballX) <= Math.Abs(vx) And paddleY[2] - sizeY <= ballY And ballY <= paddleY[2] + 5 * sizeY Then
      vx = -vx
      ping = "True"
    ElseIf Math.Abs(goalX[2] - sizeX - ballX) <= Math.Abs(vx) And topY + sizeY <= ballY And ballY <= goalUpY Then
      vx = -vx
      ping = "True"
    ElseIf Math.Abs(goalX[2] - sizeX - ballX) <= Math.Abs(vx) And goalLowY <= ballY And ballY <= bottomY Then
      vx = -vx
      ping = "True"
    EndIf
  ElseIf vx < 0 Then
    If Math.Abs(paddleX[1][1] + sizeX - ballX) <= Math.Abs(vx) And paddleY[1] - sizeY <= ballY And ballY <= paddleY[1] + 5 * sizeY Then
      vx = -vx
      ping = "True"
    ElseIf Math.Abs(paddleX[1][2] + sizeX - ballX) <= Math.Abs(vx) And paddleY[1] - sizeY <= ballY And ballY <= paddleY[1] + 5 * sizeY Then
      vx = -vx
      ping = "True"
    ElseIf Math.Abs(goalX[1] + sizeX - ballX) <= Math.Abs(vx) And topY + sizeY <= ballY And ballY <= goalUpY Then
      vx = -vx
      ping = "True"
    ElseIf Math.Abs(goalX[1] + sizeX - ballX) <= Math.Abs(vx) And goalLowY <= ballY And ballY <= bottomY Then
      vx = -vx
      ping = "True"
    EndIf
  EndIf
EndSub
Sub Court_Init
  init[0]  = "----+----1----+----2----+----3----+----4----+----5----+----6"
  init[1]  = " ********************************************************* "
  init[2]  = " * * "
  init[3]  = " * * * "
  init[4]  = " * * "
  init[5]  = " * * * "
  init[6]  = " * * "
  init[7]  = " * * * "
  init[8]  = " * * "
  init[9]  = " * "
  init[10] = " "
  init[11] = " * "
  init[12] = " "
  init[13] = " * "
  init[14] = " "
  init[15] = " * "
  init[16] = " "
  init[17] = " * "
  init[18] = " "
  init[19] = " * "
  init[20] = " "
  init[21] = " * "
  init[22] = " * * "
  init[23] = " * * * "
  init[24] = " * * "
  init[25] = " * * * "
  init[26] = " * * "
  init[27] = " * * * "
  init[28] = " * * "
  init[29] = " ********************************************************* "
  init[30] = " "
  nCols = Text.GetLength(init[0])
  nRows = 30
  centerCol = nCols /2
  centerRow = nRows / 2
  sizeX = 10
  sizeY = 14
  x0 = Math.Floor((GraphicsWindow.Width - sizeX * nCols) / 2)
  y0 = Math.Floor((GraphicsWindow.Height - sizeY * nRows) / 2)
  goalCol[1] = 2         ' left end
  goalX[1] = x0 + (goalCol[1] - 1) * sizeX
  goalCol[2] = nCols - 2 ' right end
  goalX[2] = x0 + (goalCol[2] - 1) * sizeX
  topRow = 1             ' top end
  topY = y0 + (topRow - 1) * sizeY
  bottomRow = nRows - 1  ' bottom end
  bottomY = y0 + (bottomRow - 1) * sizeY
  goalUpRow = 9          ' upper row of goal
  goalUpY = y0 + (goalUpRow - 1) * sizeY
  goalLowRow = nRows - 9 ' lower row of goal
  goalLowY = y0 + (goalLowRow - 1) * sizeY
  GraphicsWindow.PenWidth = 2
  GraphicsWindow.PenColor = "LightGray"
  GraphicsWindow.BrushColor = "LightGray"
  For row = 1 To nRows
    y = y0 + (row - 1) * sizeY
    For col = 1 To nCols
      i = (row - 1) * nCols + col
      x = x0 + (col - 1) * sizeX
      If Text.GetSubText(init[row], col, 1) <> " " Then
        GraphicsWindow.FillRectangle(x, y, sizeX, sizeY)
      EndIf
    EndFor
  EndFor
EndSub
Sub Num_Init
  num[0][1] = "***"
  num[0][2] = "* *"
  num[0][3] = "* *"
  num[0][4] = "* *"
  num[0][5] = "***"
  num[1][1] = " *"
  num[1][2] = " *"
  num[1][3] = " *"
  num[1][4] = " *"
  num[1][5] = " *"
  num[2][1] = "***"
  num[2][2] = " *"
  num[2][3] = "***"
  num[2][4] = "* "
  num[2][5] = "***"
  num[3][1] = "***"
  num[3][2] = " *"
  num[3][3] = "***"
  num[3][4] = " *"
  num[3][5] = "***"
  num[4][1] = "* *"
  num[4][2] = "* *"
  num[4][3] = "***"
  num[4][4] = " *"
  num[4][5] = " *"
  num[5][1] = "***"
  num[5][2] = "* "
  num[5][3] = "***"
  num[5][4] = " *"
  num[5][5] = "***"
  num[6][1] = "***"
  num[6][2] = "* "
  num[6][3] = "***"
  num[6][4] = "* *"
  num[6][5] = "***"
  num[7][1] = "***"
  num[7][2] = " *"
  num[7][3] = " *"
  num[7][4] = " *"
  num[7][5] = " *"
  num[8][1] = "***"
  num[8][2] = "* *"
  num[8][3] = "***"
  num[8][4] = "* *"
  num[8][5] = "***"
  num[9][1] = "***"
  num[9][2] = "* *"
  num[9][3] = "***"
  num[9][4] = " *"
  num[9][5] = "***"
  num[" "][1] = " "
  num[" "][2] = " "
  num[" "][3] = " "
  num[" "][4] = " "
  num[" "][5] = " "
EndSub
Sub Paddle_Init
  upRow = topRow + 2          ' upper end for paddle
  upY = y0 + (upRow - 1) * sizeY
  lowRow = bottomRow - 6      ' lower end for paddle
  lowY = y0 + (lowRow - 1) * sizeY
  paddleX[1][1] = goalX[1] + 2 * sizeX
  paddleX[1][2] = goalX[2] - (nCols / 4) * sizeX
  paddleY[1] = y0 + (centerRow - 3) * sizeY
  paddleX[2][1] = goalX[1] + (nCols / 4) * sizeX
  paddleX[2][2] = goalX[2] - 2 * sizeX
  paddleY[2] = y0 + (centerRow - 3) * sizeY
  For player = 1 To 2
    y = paddleY[player]
    For i = 1 To 2
      paddle[player][i] = Shapes.AddRectangle(sizeX, sizeY * 5)
      x = paddleX[player][i]
      Shapes.Move(paddle[player][i], x, y)
    EndFor
  EndFor
EndSub
Sub Paddle_Down
  ' param player - 1 or 2
  If paddleY[player] < lowY Then
    paddleY[player] = paddleY[player] + sizeY
    y = paddleY[player]
    For i = 1 To 2
      x = paddleX[player][i]
      Shapes.Move(paddle[player][i], x, y)
    EndFor
  EndIf
EndSub
Sub Paddle_Up
  ' param player - 1 or 2
  If upY < paddleY[player] Then
    paddleY[player] = paddleY[player] - sizeY
    y = paddleY[player]
    For i = 1 To 2
      x = paddleX[player][i]
      Shapes.Move(paddle[player][i], x, y)
    EndFor
  EndIf
EndSub
Sub Score_Init
  For player = 1 To 2
    score[player]["score"] = 0
    s = score[player]["score"]
    len = Text.GetLength(s)
    If len = 1 Then
      s = " " + s
    EndIf
    For o = 2 To 1 Step -1
      d = Text.GetSubText(s, 3 - o, 1)
      For i = 1 To 15
        j = (o - 1) * 15 + i
        col = Math.Remainder(i - 1, 3) + 1
        row = Math.Floor((i - 1) / 3) + 1
        x = x0 + sizeX * (centerCol - 10 + 12 * (player - 1) + 4 * (2 - o) + col - 1)
        y = y0 + sizeY * (2 + row - 1)
        obj = Shapes.AddRectangle(sizeX, sizeY + 1)
        score[player]["obj" + j] = obj
        Shapes.Move(obj, x, y)
        If Text.GetSubText(num[d][row], col, 1) = " " Then
          Shapes.SetOpacity(obj, 0)
        EndIf
      EndFor
    EndFor
  EndFor
EndSub
Sub Score_Set
  ' param player - 1 or 2
  ' param s - score
  score[player]["score"] = s
  len = Text.GetLength(s)
  If len = 1 Then
    s = " " + s
  EndIf
  For o = 2 To 1 Step -1
    d = Text.GetSubText(s, 3 - o, 1)
    For i = 1 To 15
      j = (o - 1) * 15 + i
      col = Math.Remainder(i - 1, 3) + 1
      row = Math.Floor((i - 1) / 3) + 1
      obj = score[player]["obj" + j]
      If Text.GetSubText(num[d][row], col, 1) = " " Then
        Shapes.SetOpacity(obj, 0)
      Else
        Shapes.SetOpacity(obj, 100)
      EndIf
    EndFor
  EndFor
EndSub
Sub Sound_Init
  urlPing = "http://www.nonkit.com/smallbasic.files/se_sad05.wav"
  Sound.PlayAndWait(urlPing)  ' test for preload
  urlBeep = "http://www.nonkit.com/smallbasic.files/se_sad08.wav"
  Sound.PlayAndWait(urlBeep)  ' test for preload
EndSub
Copyright (c) Microsoft Corporation. All rights reserved.