Circles

Реализация знаменитой игры палочки, только вместо палочек выступают кружки. Для тех кто не знаком с этой игрой:  соперники по очереди могут убирать не более 3 кружков, тот кому достанется последний проиграл. Игра ведется с компьютером. Кол-во кружков всегда разное. Управление мышкой.
Платформы: Windows , Linux.
Автор: Станислав Будинов, создано 2011 году.

Игра палочки(кружки)

#INCLUDE "fbgfx.bi"

Using FB
Randomize Timer

Screenres 320,240

Windowtitle "Circles"

Type D
    MASS(35) As Integer

    Num As Integer

    Lw As Integer=25

    Lh As Integer=1

End Type

Type Koord
    x As Integer

    y As Integer

End Type


Dim Shared Dp As D
Dim Shared K As EVENT
Dim Shared EvM As Koord
'Случайное число
Sub RND_()
    Dp.Num=Int(Rnd*20)+15

    Erase(Dp.MASS)
End Sub

' проверка на самое большое кол-во выделенных кружков
Function CheckFull() As Integer

    Dim As Integer R
    For a As Integer=1 To Dp.num
        If Dp.MASS(a)=1 Then

            R+=1

        Endif
    Next

    If R=3 Then

        Return 1

    Elseif R=0 Then

        Return 2

    Endif
End Function

' Рисование анимации ожидания
Sub wait_
    For v As Integer=1 To 2

        For a As Integer=1 To 10

            Circle (122, 24), a\2,a,,,,F
            Circle (200, 24), a\2,a,,,,F
            Sleep(100)
        Next

    Next

    Circle (122, 24), 5,0,,,,F
    Circle (200, 24), 5,0,,,,F
End Sub

'Рисование кнопки
Sub But(butF As Integer)
    Dim As Integer a,b
    If butF=0 Then

        a=3:b=1

    Else

        a=5:b=4

    Endif
    Line (270, 210)-(300, 225), a, bf
    Line (271, 211)-(299, 224), b, bf
    Draw String (278, 214), "Ok"
End Sub

'Рисование кружков
Sub drC()
    For n As Integer=1 To Dp.Num
        Select Case Dp.MASS(n)
            Case 0

                Circle (Dp.Lw, Dp.Lh*50), 10,2,,,,F
            Case 1

                Circle (Dp.Lw, Dp.Lh*50), 10,6,,,,F
            Case 2

                Circle (Dp.Lw, Dp.Lh*50), 10,0,,,,F
        End Select

        Dp.Lw+=30

        If Dp.Lw > 300 Then

            Dp.Lh+=1: Dp.Lw=25

        Endif
    Next

    Dp.Lw=25

    Dp.Lh=1

End Sub

' Рисование рамки и заголовка
Sub EnotherDraw()
    Draw "BM 5,5 R310 D230 L310 U230"
    Draw String (135, 20), "Circles"
End Sub

' Удаление выбранных ячеек
Sub ClearSel()
    For a As Integer=1 To Dp.num
        If Dp.MASS(a)=1 Then

            Dp.MASS(a)=2

        Endif
    Next

End Sub

' Запуск новой игры
Sub newGame()
    RND_()
    drC()
    EnotherDraw()
    But(0)
End Sub

'Окно выигрыша или проигрыша
Sub PV(st As String)
    Cls

    Draw String (45, 100),ST & " Want to play again?"
    Draw String (97, 130),"Y - Yes , N - No"
    Do

        If Multikey(SC_Y) Then

            Cls

            newGame()
            Exit Sub

        Elseif Multikey(SC_N) Then

            End

        Endif
    Loop

End Sub

'Проверка имеющихся ячеек
Sub Check(RR() As Integer)
    Dim As Integer R
    For a As Integer=1 To Dp.num
        If Dp.MASS(a)=0 Then

            R+=1

            RR(R)=a
        Endif
    Next

    RR(0)=R
End Sub

' Проверка на проигрыш
Function finish() As Integer

    For a As Integer=1 To Dp.num
        If Dp.MASS(a)<>2 Then Return 1

    Next

End Function

'Ход компьютера
Sub AI()
    Setmouse(,,0)
    Sleep(2000,1)
    Dim As Integer RR(35),R1,R2
    Check(RR(0))
    If  RR(0)-1=1 Or RR(0)-1=5 Or RR(0)-1=9 Or RR(0)-1=13 Or RR(0)-1=17 Then R2=1

    If  RR(0)-2=1 Or RR(0)-2=5 Or RR(0)-2=9 Or RR(0)-2=13 Or RR(0)-2=17 Then R2=2

    If  RR(0)-3=1 Or RR(0)-3=5 Or RR(0)-3=9 Or RR(0)-3=13 Or RR(0)-3=17 Then R2=3

    If R2<>0 Then

        For a As Integer=1 To R2
            R1=Int(Rnd*RR(0))+1

            Dp.MASS(RR(R1))=2

            Erase(RR)
            Check(RR(0))
        Next

    Else

        For a As Integer=1 To Int(Rnd*3)+1

            R1=Int(Rnd*RR(0))+1

            Dp.MASS(RR(R1))=2

            If finish()<>1 Then

                PV("You won!")
                Exit For

            Endif
            Erase(RR)
            Check(RR(0))
        Next

    Endif
    drC()
    Setmouse(,,1)
End Sub

' Распознавание кружка в строке
Function RK() As Integer

    Dim As Integer xx=15,yy=35

    For a As Integer=1 To 10

        If EvM.x>xx And EvM.x<yy Then
            Return a
        Endif
        xx+=30:yy+=30

    Next

End Function


' определение события в кнопке или в кружках и определение кружка
Sub Ev()
    If EvM.x>270 And EvM.x<300 And EvM.y>210 And EvM.y<225 Then

        If CheckFull=2 Then Exit Sub

        But(1)
        ClearSel()
        If finish()=1 Then

            Threadcreate(Cast(Any Ptr,@wait_()))
            Threadcreate(Cast(Any Ptr,@AI()))
        Else

            PV("You lost!")
        Endif
    Endif
    Dim As Integer xx=40,yy=60

    For a As Integer=1 To 4

        If EvM.y>xx And EvM.y<yy Then

            If CheckFull=1 Then

                If Dp.MASS(RK+(a-1)*10)<>1 Then

                    Exit Sub

                Endif
            Endif
            If RK<>0 Then

                Dp.MASS(RK+(a-1)*10)=Dp.MASS(RK+(a-1)*10) Xor 1

            Endif
        Endif
        xx+=50:yy+=50

    Next

End Sub

newGame()
Do

    If (Screenevent(@K)) Then

        If K.type=EVENT_MOUSE_BUTTON_PRESS Then

            If K.button=1 Then

                Getmouse(EvM.x,EvM.y)
                Ev()
                drC()
                EnotherDraw()
            Endif
        Elseif K.type=EVENT_MOUSE_BUTTON_release Then

            But(0)
        Endif
    Endif
    Sleep(1)
Loop Until K.type=EVENT_WINDOW_CLOSE