2011年9月22日 星期四

保齡球計分板

在世界各地,保齡球是相當受歡迎的運動項目之一,藉著球道上滾動的球,來碰倒球道
上的球瓶,勝負以擊倒球瓶之多寡的計分來判定。請你根據下面的計分規則,寫一個保齡球
計分程式,規則如下:
一、每一局共10 格,依序完成每1 格。
二、每格的分數將累計到下1 格。
三、第1 至9 格之計分:每1 格在2 球以內,將全部10 個球瓶擊倒為原則,分數計
算方式可分為:
1. 全倒(Strike):第1 球就將全部球瓶擊倒,即完成一格。分數計算分式為10 分,
再加上下2 球的擊倒瓶數。
2. 補全倒(Spare):第1 球未全倒時,再打1 球將剩餘球瓶全部擊倒。分數計算
方式為10 分,再加下1 球的擊倒瓶數。
3. 打完第 1 球後,第2 球如未將剩餘之球瓶全部擊倒,分數為第1 球加第2 球
擊倒之球瓶數。
四、第10 格計分方法:如果前2 球為全倒或補全倒,可再加打1 球,最多打3 球。
五、計分劃記的符號代表意義如下:
1. 全倒以記號『X』來代表。
2. 補全倒以記號『/』來代表。
3. 數字代表擊倒的球數。
4. 擊倒球數為 0 時以『-』來代表。

舉例來說:
每格擊球 7- 8/ X 8- X X X X X 8/9
分數 7 27 45 53 83 113 143 171 191 210
輸入說明:
第一行的數字,表示有幾個計分板要計分,第二行開始的每一行,為一個獨立的計分板。
每一行包含10 格擊球結果。每格以一個空白作為區隔。
輸出說明:
對輸入的每個計分板,分別計算出後的總分數。
輸入範例:
2
7- 8/ X 8- X X X X X 8/9
X X X X X X X X X XXX
輸出範例:
210
300

4 則留言:

  1. 第一次看文章以為是
    加"上下兩球擊倒瓶數",想說奇怪跟平常不一樣
    原來是
    加上"下兩球擊倒瓶數":P

    Private Sub Form_Load()
    'Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    For j = 1 To n
    List1.Clear: List2.Clear
    Dim Z As Byte: Dim ZZ As Byte: Dim ZZZ As Byte
    Z = 0: ZZ = 0: ZZZ = 0 '第一個Z計局數,第二個Z計完成單局沒,第三個Z計第九局最後位子
    Line Input #1, X
    Y = Replace(X, " ", "")

    For i = 1 To Len(Y)
    A = Mid(Y, i, 1)
    Select Case A
    Case 1 To 9: List1.AddItem A: List2.AddItem "-": ZZ = ZZ + 1
    Case "-": List1.AddItem 0: List2.AddItem "-": ZZ = ZZ + 1
    Case "X": List1.AddItem 10: List2.AddItem "X": ZZ = 0: Z = Z + 1
    Case "/": List1.AddItem (10 - Val(List1.List(i - 2))): List2.AddItem "/": ZZ = 0: Z = Z + 1
    End Select

    If ZZ = 2 Then Z = Z + 1: ZZ = 0
    If Z = 9 Then ZZZ = (i - 1)
    Next i

    Sum = 0

    For i = 0 To ZZZ
    A = List2.List(i)
    If A = "/" Then Sum = Sum + Val(List1.List(i + 1))
    If A = "X" Then Sum = Sum + Val(List1.List(i + 1)) + Val(List1.List(i + 2))
    Next i

    For i = 0 To (List1.ListCount - 1)
    Sum = Sum + Val(List1.List(i))
    Next i

    Print #2, Sum

    Next j


    Close #2
    Close #1
    'End
    End Sub

    回覆刪除
  2. in.txt
    3
    7- 8/ X 8- X X X X X 8/9
    X 9/ X 7/ X 2/ X 5/ X 1/X
    X X X X X X X X X XXX

    out.txt
    210
    200
    300

    回覆刪除
  3. Dim n, m As String, P As Integer
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Input #1, Ti
    For i = 1 To Ti
    P = 0: List1.Clear
    Line Input #1, m
    n = Split(m)
    Call run
    Call cnt
    Print #2, P
    Next


    Close
    Close
    End
    End Sub

    Sub cnt()
    Dim NowAt
    NowAt = 0

    For i = 0 To 9
    For j = 1 To Len(n(i))
    k = Mid(n(i), j, 1)
    Select Case k
    Case "/": If Len(n(i)) < 3 Then P = P + List1.List(NowAt) + List1.List(NowAt + 1): NowAt = NowAt + 1
    Case "X": If Len(n(i)) < 3 Then P = P + List1.List(NowAt) + List1.List(NowAt + 1) + List1.List(NowAt + 2): NowAt = NowAt + 1
    Case Else: If Len(n(i)) < 3 Then P = P + List1.List(NowAt): NowAt = NowAt + 1
    End Select
    If Len(n(i)) = 3 Then P = P + List1.List(NowAt) + List1.List(NowAt + 1) + List1.List(NowAt + 2): Exit For
    Next
    Print P & " " & n(i)
    Next

    End Sub


    Sub run()

    For i = 0 To 9

    For j = 1 To Len(n(i))
    k = Mid(n(i), j, 1)
    Select Case k
    Case "-": List1.AddItem 0
    Case "/": List1.AddItem (10 - tmp)
    Case "X": List1.AddItem 10
    Case Else: List1.AddItem k
    End Select
    tmp = k
    Next


    Next

    End Sub




    <<<<<<<<<<<<<<<<<<<<<<<<
    輸入:
    2
    7- 8/ X 8- X X X X X 8/X
    -- -- -- -- -- -- -- -- -- --
    輸出:
    211
    0

    回覆刪除
  4. 這一題又出現了!!!
    那時候我還上網查保齡球規則哩@@

    回覆刪除