NovaYoshi

BOWLING

May 23rd, 2012
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Public Class Form1
  2.     ' BOWLING GAME
  3.    ' a giant pile of messy code :)
  4.  
  5.     Dim Frames(14, 4) As Integer ' sloppy code example #1 - frame 10 is handled with up to 3 frames,
  6.    ' and 13 and 14 are only there so that when it looks ahead two frames on 12 it doesn't crash.
  7.  
  8.     Dim CurFrame As Integer = 1
  9.     Dim CurBall As Integer = 1
  10.     Dim Strikes As Integer = 0 ' only used for the STRIKE! DOUBLE! TURKEY! effects
  11.  
  12.     Dim GameRunning As Boolean = True
  13.     Dim generator As New Random
  14.  
  15.     Dim TenBLeft As Integer ' sloppy code example #2
  16.    Dim TenCLeft As Integer '   stores frame 10's 2nd and 3rd slots for a sloppy fix for when you get a strike on the first ball
  17.  
  18.     Function GetTotalScore() ' get the total score from adding everything in RealScores()
  19.        Dim i As Integer
  20.         Dim score As Integer = 0
  21.         For i = 1 To 10
  22.             Dim s As Integer = RealScores(i)
  23.             score += CInt(s)
  24.         Next
  25.         Return score
  26.     End Function
  27.  
  28.     Sub ResetGame() ' initializes everything
  29.        lblPerfect.Visible = False
  30.         CurFrame = 1
  31.         CurBall = 1
  32.         Strikes = 0
  33.         GameRunning = True
  34.         Dim i, j As Integer
  35.         For i = 1 To 13 ' reset the frames
  36.            For j = 1 To 4
  37.                 Frames(i, j) = 0
  38.             Next
  39.         Next
  40.  
  41.         For i = 1 To 10 ' reset all the text boxes
  42.            GetScorebox(i, 1).Clear()
  43.             GetScorebox(i, 2).Clear()
  44.             GetScorebox(i, 4).Clear()
  45.  
  46.             GetScorebox(i, 1).BackColor = Color.White
  47.             GetScorebox(i, 2).BackColor = Color.White
  48.             RealScores(i) = 0
  49.         Next
  50.         GetScorebox(11, 1).Clear()
  51.         btnRoll.Enabled = True
  52.         GetScorebox(1, 1).BackColor = Color.Gray()
  53.         txtTotal.Text = 0
  54.         txtF10B.Left = TenBLeft
  55.         txtF10C.Left = TenCLeft
  56.         lstLog.Items.Clear()
  57.     End Sub
  58.  
  59.     Function SafeCInt(ByVal s As String) ' just like CInt() but won't crash if you pass it ""
  60.        If s = "" Then
  61.             Return 0
  62.         End If
  63.         Return CInt(s)
  64.     End Function
  65.  
  66.     Dim RealScores(12) As Integer
  67.     Sub BackwardsFix(ByVal Start As Integer) ' steps backwards and fixes scores
  68.        Dim i As Integer
  69.  
  70.         For i = Start To 1 Step -1
  71.             Dim Total As Integer = Frames(i, 1) + Frames(i, 2)
  72.             Dim Score As Integer = Total
  73.             If Total = 10 Then
  74.                 If Frames(i, 1) <> 10 Then ' spare
  75.                    Score = 10 + Frames(i + 1, 1)
  76.                 Else
  77.                     Score = 10 + Frames(i + 1, 1) + Frames(i + 1, 2)
  78.                     If Frames(i + 2, 1) = 10 Then ' special case for 3 strikes in a row
  79.                        Score += 10
  80.                     End If
  81.                 End If
  82.             End If
  83.  
  84.             GetScorebox(i, 4).Text = Score
  85.             RealScores(i) = Score
  86.         Next
  87.     End Sub
  88.     Sub RunningTotal()
  89.         ' apparently we have to have the score under a frame be the total AT that frame, not FOR the frame,
  90.        ' and basically everything relies on the latter, so this is a sloppy fix that runs after the real stuff
  91.        Dim Score2 As Integer = 0
  92.         Dim i As Integer
  93.         For i = 1 To 10
  94.             If Frames(i, 1) = 0 And Frames(i, 2) = 0 Then
  95.                 Exit Sub
  96.             End If
  97.             Score2 += SafeCInt(GetScorebox(i, 4).Text)
  98.             GetScorebox(i, 4).Text = Score2
  99.         Next
  100.     End Sub
  101.  
  102.     Sub RollBall(ByVal Roll As Integer)
  103.         If (Frames(CurFrame, 1) + Frames(CurFrame, 2) + Roll) > 10 Then
  104.             lstLog.Items.Clear()
  105.             lstLog.Items.Add("Not enough pins to roll " & Roll)
  106.             Dim pinsleft As Integer = 10 - Frames(CurFrame, 1) - Frames(CurFrame, 2)
  107.             lstLog.Items.Add("(There are " & pinsleft & " left)")
  108.             txtGuess.Text = pinsleft
  109.             Exit Sub
  110.         End If
  111.         GetScorebox(CurFrame, CurBall).BackColor = Color.White
  112.  
  113.         Frames(CurFrame, CurBall) = Roll
  114.         lstLog.Items.Clear()
  115.  
  116.         If CurFrame < 11 Then
  117.             lstLog.Items.Add("== Frame #" & CurFrame & " - " & CurBall & " ==")
  118.         Else
  119.             lstLog.Items.Add("== Frame #10 - extended - ==")
  120.         End If
  121.  
  122.         lstLog.Items.Add("Knocked over " & Roll & " pins.")
  123.         Dim Left As Integer = 10 - (Frames(CurFrame, 1) + Frames(CurFrame, 2) + Frames(CurFrame, 3))
  124.         If Roll = 0 Then
  125.             MakeBigNotice(My.Resources.gutter)
  126.             lstLog.Items.Add("GUTTER BALL")
  127.         End If
  128.  
  129.         lstLog.Items.Add("Pins left: " & Left)
  130.  
  131.         GetScorebox(CurFrame, CurBall).Text = Frames(CurFrame, CurBall)
  132.         GetScorebox(CurFrame, 4).Text = Frames(CurFrame, 1) + Frames(CurFrame, 2) + Frames(CurFrame, 3)
  133.  
  134.         If CurFrame <> 11 Then
  135.             RealScores(CurFrame) = GetScorebox(CurFrame, 4).Text
  136.         End If
  137.         If CurFrame <> 1 Then
  138.             BackwardsFix(CurFrame - 1)
  139.         End If
  140.  
  141.         ' check for strikes and spares ( only for the effects; BackwardsFix() does the actual handling )
  142.        If Left = 0 Then
  143.             If CurBall = 1 Then
  144.                 GetScorebox(CurFrame, CurBall).Text = "X"
  145.                 Strikes += 1
  146.                 MakeBigNotice(My.Resources.SPARE_)
  147.                 Dim NumSpelledOut() As String = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen"}
  148.                 Select Case Strikes ' http://en.wikipedia.org/wiki/Strike_(bowling)#Consecutive_strikes
  149.                    Case 1
  150.                         lstLog.Items.Add("Strike!!!")
  151.                         MakeBigNotice(My.Resources.STRIKE_2)
  152.                     Case 2
  153.                         lstLog.Items.Add("Double!!!")
  154.                         MakeBigNotice(My.Resources.DOUBLE_)
  155.                     Case 3
  156.                         lstLog.Items.Add("Turkey!!!")
  157.                         MakeBigNotice(My.Resources.TURKEY_)
  158.                     Case 5
  159.                         lstLog.Items.Add("Yahtzee!!!")
  160.                         MakeBigNotice(My.Resources.STRIKE_2_again)
  161.                     Case 6
  162.                         lstLog.Items.Add("Six Pack!!!")
  163.                         MakeBigNotice(My.Resources.STRIKE_2_again)
  164.                     Case 9
  165.                         lstLog.Items.Add("Golden Turkeys!!!")
  166.                         MakeBigNotice(My.Resources.STRIKE_2_again)
  167.                     Case 12
  168.                         lstLog.Items.Add("Thanksgiving Turkey!")
  169.                         MakeBigNotice(My.Resources.STRIKE_2_again)
  170.  
  171.                     Case Else
  172.                         lstLog.Items.Add(NumSpelledOut(Strikes) + "-bagger!!!")
  173.                         MakeBigNotice(My.Resources.STRIKE_2_again)
  174.                 End Select
  175.             Else
  176.                 GetScorebox(CurFrame, CurBall).Text = "/"
  177.                 lstLog.Items.Add("Spare!!!")
  178.                 MakeBigNotice(My.Resources.SPARE_)
  179.             End If
  180.             CurBall = 0
  181.             CurFrame += 1
  182.         Else
  183.             Strikes = 0
  184.         End If
  185.  
  186.         Dim total As Integer = GetTotalScore()
  187.         txtTotal.Text = total
  188.  
  189.         ' move onto the next ball
  190.        CurBall += 1
  191.         If CurBall = 3 Then
  192.             CurBall = 1
  193.             CurFrame += 1
  194.         End If
  195.         If CurFrame = 11 Then
  196.             If (Frames(CurFrame - 1, 1) + Frames(CurFrame - 1, 2)) <> 10 Or CurBall = 2 Then
  197.                 GameRunning = False
  198.             End If
  199.         End If
  200.         If CurFrame = 12 And CurBall = 2 Or CurFrame = 13 Then
  201.             GameRunning = False
  202.         End If
  203.  
  204.         txtTotal.Text = total
  205.         If CurFrame = 11 And Frames(CurFrame - 1, 1) = 10 Then
  206.             txtF10B.Left = TenCLeft
  207.             txtF10C.Left = TenBLeft
  208.         End If
  209.         If GameRunning Then
  210.             GetScorebox(CurFrame, CurBall).BackColor = Color.Gray
  211.         Else
  212.             lstLog.Items.Add("Game over; Score: " & total)
  213.             If total = 300 Then
  214.                 lstLog.Items.Add("PERFECT GAME!")
  215.                 lblPerfect.Visible = True
  216.             End If
  217.             btnRoll.Enabled = False
  218.         End If
  219.         Me.Text = "BOWLING GAME!! - Score: " & total
  220.  
  221.         RunningTotal()
  222.     End Sub
  223.  
  224.     Private Sub btnRoll_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRoll.Click
  225.         If chkRandom.Checked Then
  226.             Dim rolled As Integer
  227.             rolled = generator.Next(0, 2 * (10 - Frames(CurFrame, 1) - Frames(CurFrame, 2))) / 2
  228.             RollBall(rolled)
  229.         Else
  230.             If txtGuess.Text <> "" Then
  231.                 Try
  232.                     RollBall(CInt(txtGuess.Text))
  233.                 Catch ex As Exception
  234.                     MsgBox("Please enter a number in the text box." & Chr(13) & Chr(10) & "What you entered does not seem to be a number.", MsgBoxStyle.Information, "Bowling Game!!!!")
  235.                 End Try
  236.             End If
  237.             txtGuess.Focus()
  238.         End If
  239.     End Sub
  240.  
  241.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  242.         TenBLeft = txtF10B.Left
  243.         TenCLeft = txtF10C.Left
  244.         ResetGame()
  245.     End Sub
  246.  
  247.     Dim Wavy As Double = 0
  248.     Sub MakeBigNotice(ByVal pic As Image)
  249.         picNotice.Image = pic
  250.         picNotice.Left = -picNotice.Width
  251.         Wavy = 0
  252.         BigNoticeTimer.Start()
  253.     End Sub
  254.     Private Sub BigNoticeTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles BigNoticeTimer.Tick
  255.         picNotice.Left += 10
  256.         picNotice.Top = (Me.Height / 2) - (picNotice.Height / 2) + Math.Sin(Wavy) * 50 + 100 ' standard wavy sinewave thing
  257.        picNotice.Visible = True
  258.         Wavy += 0.1
  259.         If picNotice.Left > Me.Width Then
  260.             BigNoticeTimer.Stop()
  261.             picNotice.Visible = False
  262.         End If
  263.     End Sub
  264.  
  265.     Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click
  266.         ResetGame()
  267.     End Sub
  268.  
  269.     Function GetScorebox(ByVal i As Integer, ByVal ball As Integer) As TextBox
  270.         ' too lazy to try and do a control array :(
  271.        Select Case i
  272.             Case 1
  273.                 Select Case ball
  274.                     Case 1
  275.                         Return txtF1A
  276.                     Case 2
  277.                         Return txtF1B
  278.                     Case 4
  279.                         Return txtF1T
  280.                 End Select
  281.             Case 2
  282.                 Select Case ball
  283.                     Case 1
  284.                         Return txtF2A
  285.                     Case 2
  286.                         Return txtF2B
  287.                     Case 4
  288.                         Return txtF2T
  289.                 End Select
  290.             Case 3
  291.                 Select Case ball
  292.                     Case 1
  293.                         Return txtF3A
  294.                     Case 2
  295.                         Return txtF3B
  296.                     Case 4
  297.                         Return txtF3T
  298.                 End Select
  299.             Case 4
  300.                 Select Case ball
  301.                     Case 1
  302.                         Return txtF4A
  303.                     Case 2
  304.                         Return txtF4B
  305.                     Case 4
  306.                         Return txtF4T
  307.                 End Select
  308.             Case 5
  309.                 Select Case ball
  310.                     Case 1
  311.                         Return txtF5A
  312.                     Case 2
  313.                         Return txtF5B
  314.                     Case 4
  315.                         Return txtF5T
  316.                 End Select
  317.             Case 6
  318.                 Select Case ball
  319.                     Case 1
  320.                         Return txtF6A
  321.                     Case 2
  322.                         Return txtF6B
  323.                     Case 4
  324.                         Return txtF6T
  325.                 End Select
  326.             Case 7
  327.                 Select Case ball
  328.                     Case 1
  329.                         Return txtF7A
  330.                     Case 2
  331.                         Return txtF7B
  332.                     Case 4
  333.                         Return txtF7T
  334.                 End Select
  335.             Case 8
  336.                 Select Case ball
  337.                     Case 1
  338.                         Return txtF8A
  339.                     Case 2
  340.                         Return txtF8B
  341.                     Case 4
  342.                         Return txtF8T
  343.                 End Select
  344.             Case 9
  345.                 Select Case ball
  346.                     Case 1
  347.                         Return txtF9A
  348.                     Case 2
  349.                         Return txtF9B
  350.                     Case 4
  351.                         Return txtF9T
  352.                 End Select
  353.             Case 10
  354.                 Select Case ball
  355.                     Case 1
  356.                         Return txtF10A
  357.                     Case 2
  358.                         Return txtF10B
  359.                     Case 4
  360.                         Return txtF10T
  361.                 End Select
  362.             Case 11
  363.                 Select Case ball
  364.                     Case 1
  365.                         Return txtF10C
  366.                     Case 4
  367.                         Return txtF10T
  368.                 End Select
  369.             Case 12
  370.                 Select Case ball
  371.                     Case 1
  372.                         Return txtF10B
  373.                     Case 4
  374.                         Return txtF10T
  375.                 End Select
  376.         End Select
  377.         Return txtF1A
  378.     End Function
  379.  
  380.     Private Sub chkRandom_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkRandom.CheckedChanged
  381.         If chkRandom.Checked Then
  382.             txtGuess.ReadOnly = True
  383.             lstInstructions.Items.Clear()
  384.             lstInstructions.Items.Add("Just click " + Chr(34) + "Roll Ball" + Chr(34))
  385.             lstInstructions.Items.Add("and the program will")
  386.             lstInstructions.Items.Add("pick each score for you.")
  387.         Else
  388.             txtGuess.ReadOnly = False
  389.             lstInstructions.Items.Clear()
  390.             lstInstructions.Items.Add("Enter a number from")
  391.             lstInstructions.Items.Add("0 to 10 in the textbox")
  392.             lstInstructions.Items.Add("to the right then click")
  393.             lstInstructions.Items.Add(Chr(34) + "Roll Ball" + Chr(34) + " to enter")
  394.             lstInstructions.Items.Add("each score.")
  395.         End If
  396.     End Sub
  397.  
  398. End Class
Add Comment
Please, Sign In to add comment