QIX
#1
Making my way through this game, thought I'd share what I have done so far.

For those not familiar, it's an old arcade game from 1981.   The idea is to fill in 75% of the screen to complete a level.   (So far no scores yet, and unlimited lives)

Still some things missing (like those sparks) and there are some bugs to sort out.   No sound either - not sure how I'll do that because the original game had bad sound effects.

One thing I'd like to do eventually is learn a flood fill algorithm.   I struggled with that and decided to just use paint for now.   Flood fill in this case was more complicated than I was expecting it to be.   But it'd be nice to do it like the original game does.

Code: (Select All)
'QB64 Qix
'james2464 - November 2022

'controls : arrow keys to move
'        : left CTRL for fast draw (blue)
'        : left ALT for slow draw (red)


_FullScreen
Option _Explicit

Dim Shared scx, scy
scx = 610: scy = 500

Screen _NewImage(scx, scy, 32)

Const PI = 3.141592654#
Randomize Timer

Dim Shared bg&, dbg&, logo1
bg& = _NewImage(scx, scy, 32)
dbg& = _NewImage(scx, scy, 32)

Dim Shared xx, yy, t, olddir, x, y, h, hd, fl, fl2, ct
Dim Shared sdinprocess, fdinprocess As Integer
Dim Shared qpath, flag, n, movepermit, flagrestart As Integer
Dim Shared qixtot, qxv, qyv, f, pmove, pfast, pslow, oldpx, oldpy, ps, drawoldx, drawoldy
Dim Shared j, k, checkx1, checkx2, checky1, checky2, totpct, btot, rtot
Dim Shared bluetot, redtot As _Integer64

'origin
xx = 320: yy = 240

Dim Shared c(50) As Long
c(0) = _RGB(0, 0, 0)
c(1) = _RGB(200, 200, 210) 'outside border
c(2) = _RGB(255, 255, 255) 'cursor white dot
c(3) = _RGB(200, 100, 100)
c(4) = _RGB(50, 120, 150) 'fast zone (fill)
c(5) = _RGB(180, 60, 30) 'slow zone (fill)
c(6) = _RGB(0, 255, 0)
c(7) = _RGB(255, 0, 0) 'cursor red
c(44) = _RGB(50, 120, 155) 'fast zone (drawing lines)
c(45) = _RGB(185, 60, 30) 'slow zone (drawing lines)



Type player
    x As Single
    y As Single
End Type
Dim Shared pl As player



Type qix
    dir As Single
    x1 As Integer
    x2 As Integer
    y1 As Integer
    y2 As Integer
    xx As Single
    yy As Single
    len1 As Single
    c1 As Integer
    c2 As Integer
    c3 As Integer
End Type
Dim Shared q(7) As qix
Dim Shared qd(7) As qix


qixtot = 7: qpath = 0: f = 1
ps = 5


Do
    'start
    pl.x = 320: pl.y = 440
    flagrestart = 0

    For t = 1 To qixtot
        q(t).xx = xx: q(t).yy = yy: q(t).len1 = 40
    Next t

    '_MouseHide

    Cls

    'screen setup
    Line (120, 40)-(520, 440), c(1), B 'outer border

    '_PutImage (500, 50), logo1

    bluetot = 0: redtot = 0

    _PutImage (1, 1)-(scx - 1, scy - 1), 0, bg&, (1, 1)-(scx, scy) 'take snapshot of screen

    Do

        _Limit 20



        'player cursor                =======================================================================================

        'get keyboard input
        pmove = arrowkey
        pfast = fastdraw
        pslow = slowdraw

        oldpx = pl.x: oldpy = pl.y

        If pfast + pslow = 0 Then normalmove
        If pfast > pslow Then fastdrawmove
        If pfast < pslow Then slowdrawmove




        'ok so about that qix thing....=======================================================================================


        'heading and direction  -----------------------------------------------------
        If qpath < 1 Then
            If qpath = 0 Then
                '_Delay 1.
                qpath = Int(Rnd * 11) + 1: qxv = Rnd * 30 - 15: qyv = Rnd * 30 - 15
                olddir = q(1).dir: q(1).dir = olddir + Rnd * PI - PI / 2
            End If
            If qpath = -1 Then
                '_Delay .5
                qpath = (Rnd * 22) + 1: qxv = Rnd * 30 - 15: qyv = Rnd * 30 - 15
                olddir = q(1).dir
                If olddir > PI Then
                    q(1).dir = olddir - PI
                Else
                    q(1).dir = olddir + PI
                End If
            End If
        End If

        qpath = Int(qpath - 1)

        'update trailing lines -----------------------------------------------------
        For t = 7 To 2 Step -1
            q(t).xx = q(t - 1).xx: q(t).yy = q(t - 1).yy
            q(t).x1 = q(t - 1).x1: q(t).x2 = q(t - 1).x2
            q(t).y1 = q(t - 1).y1: q(t).y2 = q(t - 1).y2
            q(t).len1 = q(t - 1).len1
            q(t).c1 = q(t - 1).c1: q(t).c2 = q(t - 1).c2: q(t).c3 = q(t - 1).c3
        Next t


        'collision detection -------------------------------------------------------

        flag = 0 'collision - assume none to start

        q(1).xx = q(1).xx + qxv
        q(1).yy = q(1).yy + qyv



        q(1).dir = q(1).dir + Rnd * .9 - .45
        q(1).len1 = q(1).len1 + Rnd * 10 - 4.4
        If q(1).len1 > 40 Then q(1).len1 = 40
        If q(1).len1 < 5 Then q(1).len1 = 5

        x = Cos(q(1).dir) * q(1).len1
        y = Sin(q(1).dir) * q(1).len1
        q(1).x1 = q(1).xx + x: q(1).x2 = q(1).xx - x
        q(1).y1 = q(1).yy - y: q(1).y2 = q(1).yy + y


        'scan background colour along line
        For j = 0 To q(1).len1
            x = Cos(q(1).dir) * j: y = Sin(q(1).dir) * j
            checkx1 = q(1).xx + x: checkx2 = q(1).xx - x
            checky1 = q(1).yy - y: checky2 = q(1).yy + y
            c(19) = Point(checkx1, checky1)
            c(20) = Point(checkx2, checky2)
            If c(19) <> c(0) Then
                Select Case c(19)
                    Case c(1)
                        flag = 1
                    Case q(2).c1, q(3).c1, q(4).c1, q(5).c1, q(6).c1, q(7).c1
                        flag = 1
                    Case c(44), c(7)
                        If fdinprocess = 1 Then
                            flag = 2
                        End If
                    Case c(45), c(7)
                        If sdinprocess = 1 Then
                            flag = 2
                        End If
                End Select
            End If
            If c(20) <> c(0) Then
                Select Case c(20)
                    Case c(1)
                        flag = 1
                    Case q(2).c1, q(3).c1, q(4).c1, q(5).c1, q(6).c1, q(7).c1
                        flag = 1
                    Case c(44), c(7)
                        If fdinprocess = 1 Then
                            flag = 2
                        End If
                    Case c(45), c(7)
                        If sdinprocess = 1 Then
                            flag = 2
                        End If
                End Select
            End If
        Next j

        'check for skipped/crossed line
        h = _Hypot(qyv, qxv)
        hd = _Atan2(-qxv, -qyv)

        For j = 0 To Int(h) Step .5
            x = Sin(-hd) * j: y = Cos(hd) * j
            checkx2 = q(1).xx - x
            checky2 = q(1).yy + y
            c(20) = Point(checkx2, checky2)
            If c(20) <> c(0) Then
                Select Case c(20)
                    Case c(1)
                        flag = 1
                    Case q(2).c1, q(3).c1, q(4).c1, q(5).c1, q(6).c1, q(7).c1
                        flag = 1
                    Case c(4), c(7)
                        If fdinprocess = 1 Then
                            flag = 2
                        End If
                    Case c(5), c(7)
                        If sdinprocess = 1 Then
                            flag = 2
                        End If
                End Select
            End If
        Next j


        'changing colour
        q(1).c1 = q(1).c1 + Rnd * 60 - 30
        If q(1).c1 < 80 Then q(1).c1 = 80
        If q(1).c1 > 255 Then q(1).c1 = 255
        q(1).c2 = q(1).c2 + Rnd * 60 - 30
        If q(1).c2 < 80 Then q(1).c2 = 80
        If q(1).c2 > 255 Then q(1).c2 = 255
        q(1).c3 = q(1).c3 + Rnd * 60 - 30
        If q(1).c3 < 80 Then q(1).c3 = 80
        If q(1).c3 > 255 Then q(1).c3 = 255


        'if collision detected...
        If flag = 1 Then
            qpath = -1 'new path needed - reverse direction
            q(1).xx = q(3).xx: q(1).yy = q(3).yy
            q(1).x1 = q(3).x1: q(1).x2 = q(3).x2
            q(1).y1 = q(3).y1: q(1).y2 = q(3).y2
            q(1).len1 = q(3).len1 - 3 'shorter line
        End If

        If flag = 2 Then
            youdead
            _PutImage (1, 1)-(scx, scy), dbg&, bg&, (1, 1)-(scx, scy)
        End If


        '====================================================================================================
        '====================================================================================================
        '====================================================================================================
        '====================================================================================================



        Cls

        _PutImage (0, 0)-(scx, scy), bg&, 0 'draw background


        For t = 1 To qixtot
            c(9) = _RGB(q(t).c1, q(t).c2, q(t).c3)
            Line (q(t).x1, q(t).y1)-(q(t).x2, q(t).y2), c(9)
        Next t

        Line (pl.x - ps, pl.y)-(pl.x, pl.y - ps), c(7)
        Line (pl.x, pl.y - ps)-(pl.x + ps, pl.y), c(7)
        Line (pl.x + ps, pl.y)-(pl.x, pl.y + ps), c(7)
        Line (pl.x, pl.y + ps)-(pl.x - ps, pl.y), c(7)
        Line (pl.x - 1, pl.y)-(pl.x + 1, pl.y), c(2)
        Line (pl.x, pl.y - 1)-(pl.x, pl.y + 1), c(2)


        btot = Int(bluetot / 1570)
        rtot = Int(redtot / 1570)
        totpct = Int(btot + rtot)

        Locate 29, 20
        Print "BLUE:"; btot; "%"
        Locate 29, 36
        Print "RED:"; rtot; "%"
        Locate 29, 52
        Print "TOTAL:"; totpct; "%"





        _Display

        If sdinprocess < 0 Then
            _Delay .8
            sdinprocess = 0
        End If

        If fdinprocess < 0 Then
            _Delay .8
            fdinprocess = 0
        End If

        If totpct > 75 Then
            endlevel
            flagrestart = 1
        End If

        If _KeyDown(15104) Then
            endlevel
            flagrestart = 1
        End If


    Loop Until flagrestart = 1

Loop

Function arrowkey
    arrowkey = 0
    If _KeyDown(18432) Then '                                IF up arrow key was pressed
        arrowkey = 1 '
    End If
    If _KeyDown(20480) Then '                                IF down arrow key was pressed
        arrowkey = 2 '
    End If
    If _KeyDown(19200) Then '                                IF left arrow key was pressed
        arrowkey = 3 '
    End If
    If _KeyDown(19712) Then '                                IF right arrow key was pressed
        arrowkey = 4 '
    End If
End Function

Function fastdraw
    fastdraw = 0
    If _KeyDown(100306) Then '                                  IF L-CTRL key was pressed
        fastdraw = 1 '
    End If
End Function

Function slowdraw
    slowdraw = 0
    If _KeyDown(100308) Then '                                  IF L-ALT key was pressed
        slowdraw = 1 '
    End If
End Function

'-----------------------------------------------------------------------------------------------------------------



Sub normalmove
    Select Case pmove
        Case 1
            pl.y = pl.y - 4
            c(19) = Point(pl.x, pl.y)
            c(20) = Point(pl.x + 1, pl.y)
            c(21) = Point(pl.x - 1, pl.y)
            c(22) = Point(pl.x, pl.y + 1)
            c(23) = Point(pl.x, pl.y - 1)
            c(24) = Point(pl.x + 1, pl.y + 1)
            c(25) = Point(pl.x - 1, pl.y - 1)
            c(26) = Point(pl.x - 1, pl.y + 1)
            c(27) = Point(pl.x + 1, pl.y - 1)
            fl2 = 0
            For fl = 20 To 27 Step 1
                If c(fl) = c(0) Then fl2 = 1
            Next fl
            movepermit = 0
            While movepermit = 0
                If c(19) = c(1) And fl2 > 0 Then
                    movepermit = 1
                Else
                    pl.y = pl.y + 2
                    c(19) = Point(pl.x, pl.y)
                    c(20) = Point(pl.x + 1, pl.y)
                    c(21) = Point(pl.x - 1, pl.y)
                    c(22) = Point(pl.x, pl.y + 1)
                    c(23) = Point(pl.x, pl.y - 1)
                    c(24) = Point(pl.x + 1, pl.y + 1)
                    c(25) = Point(pl.x - 1, pl.y - 1)
                    c(26) = Point(pl.x - 1, pl.y + 1)
                    c(27) = Point(pl.x + 1, pl.y - 1)
                    fl2 = 0
                    For fl = 20 To 27 Step 1
                        If c(fl) = c(0) Then fl2 = 1
                    Next fl
                    If c(19) = c(1) And fl2 > 0 Then
                        movepermit = 1
                    Else
                        pl.y = pl.y + 2
                        movepermit = -1
                    End If
                End If
            Wend

        Case 2
            pl.y = pl.y + 4
            c(19) = Point(pl.x, pl.y)
            c(20) = Point(pl.x + 1, pl.y)
            c(21) = Point(pl.x - 1, pl.y)
            c(22) = Point(pl.x, pl.y + 1)
            c(23) = Point(pl.x, pl.y - 1)
            c(24) = Point(pl.x + 1, pl.y + 1)
            c(25) = Point(pl.x - 1, pl.y - 1)
            c(26) = Point(pl.x - 1, pl.y + 1)
            c(27) = Point(pl.x + 1, pl.y - 1)
            fl2 = 0
            For fl = 20 To 27 Step 1
                If c(fl) = c(0) Then fl2 = 1
            Next fl
            movepermit = 0
            While movepermit = 0
                If c(19) = c(1) And fl2 > 0 Then
                    movepermit = 1
                Else
                    pl.y = pl.y - 2
                    c(19) = Point(pl.x, pl.y)
                    c(20) = Point(pl.x + 1, pl.y)
                    c(21) = Point(pl.x - 1, pl.y)
                    c(22) = Point(pl.x, pl.y + 1)
                    c(23) = Point(pl.x, pl.y - 1)
                    c(24) = Point(pl.x + 1, pl.y + 1)
                    c(25) = Point(pl.x - 1, pl.y - 1)
                    c(26) = Point(pl.x - 1, pl.y + 1)
                    c(27) = Point(pl.x + 1, pl.y - 1)
                    fl2 = 0
                    For fl = 20 To 27 Step 1
                        If c(fl) = c(0) Then fl2 = 1
                    Next fl
                    If c(19) = c(1) And fl2 > 0 Then
                        movepermit = 1
                    Else
                        pl.y = pl.y - 2
                        movepermit = -1
                    End If
                End If
            Wend

        Case 3
            pl.x = pl.x - 4
            c(19) = Point(pl.x, pl.y)
            c(20) = Point(pl.x + 1, pl.y)
            c(21) = Point(pl.x - 1, pl.y)
            c(22) = Point(pl.x, pl.y + 1)
            c(23) = Point(pl.x, pl.y - 1)
            c(24) = Point(pl.x + 1, pl.y + 1)
            c(25) = Point(pl.x - 1, pl.y - 1)
            c(26) = Point(pl.x - 1, pl.y + 1)
            c(27) = Point(pl.x + 1, pl.y - 1)
            fl2 = 0
            For fl = 20 To 27 Step 1
                If c(fl) = c(0) Then fl2 = 1
            Next fl

            movepermit = 0
            While movepermit = 0
                If c(19) = c(1) And fl2 > 0 Then
                    movepermit = 1
                Else
                    pl.x = pl.x + 2
                    c(19) = Point(pl.x, pl.y)
                    c(20) = Point(pl.x + 1, pl.y)
                    c(21) = Point(pl.x - 1, pl.y)
                    c(22) = Point(pl.x, pl.y + 1)
                    c(23) = Point(pl.x, pl.y - 1)
                    c(24) = Point(pl.x + 1, pl.y + 1)
                    c(25) = Point(pl.x - 1, pl.y - 1)
                    c(26) = Point(pl.x - 1, pl.y + 1)
                    c(27) = Point(pl.x + 1, pl.y - 1)
                    fl2 = 0
                    For fl = 20 To 27 Step 1
                        If c(fl) = c(0) Then fl2 = 1
                    Next fl
                    If c(19) = c(1) And fl2 > 0 Then
                        movepermit = 1
                    Else
                        pl.x = pl.x + 2
                        movepermit = -1
                    End If
                End If
            Wend

        Case 4
            pl.x = pl.x + 4
            c(19) = Point(pl.x, pl.y)
            c(20) = Point(pl.x + 1, pl.y)
            c(21) = Point(pl.x - 1, pl.y)
            c(22) = Point(pl.x, pl.y + 1)
            c(23) = Point(pl.x, pl.y - 1)
            c(24) = Point(pl.x + 1, pl.y + 1)
            c(25) = Point(pl.x - 1, pl.y - 1)
            c(26) = Point(pl.x - 1, pl.y + 1)
            c(27) = Point(pl.x + 1, pl.y - 1)
            fl2 = 0
            For fl = 20 To 27 Step 1
                If c(fl) = c(0) Then fl2 = 1
            Next fl
            movepermit = 0
            While movepermit = 0
                If c(19) = c(1) And fl2 > 0 Then
                    movepermit = 1
                Else
                    pl.x = pl.x - 2
                    c(19) = Point(pl.x, pl.y)
                    c(20) = Point(pl.x + 1, pl.y)
                    c(21) = Point(pl.x - 1, pl.y)
                    c(22) = Point(pl.x, pl.y + 1)
                    c(23) = Point(pl.x, pl.y - 1)
                    c(24) = Point(pl.x + 1, pl.y + 1)
                    c(25) = Point(pl.x - 1, pl.y - 1)
                    c(26) = Point(pl.x - 1, pl.y + 1)
                    c(27) = Point(pl.x + 1, pl.y - 1)
                    fl2 = 0
                    For fl = 20 To 27 Step 1
                        If c(fl) = c(0) Then fl2 = 1
                    Next fl
                    If c(19) = c(1) And fl2 > 0 Then
                        movepermit = 1
                    Else
                        pl.x = pl.x - 2
                        movepermit = -1
                    End If
                End If
            Wend

    End Select
End Sub



Sub fastdrawmove
    Select Case pmove

        Case 1
            pl.y = pl.y - 4
            If pl.y < 40 Then pl.y = 40
            c(19) = Point(pl.x, pl.y)
            c(18) = Point(pl.x, pl.y + 2)
            movepermit = 0
            While movepermit = 0
                If c(18) = c(0) Then
                    movepermit = 1
                Else
                    pl.y = pl.y + 2
                    If c(18) = c(1) Then
                        movepermit = 1
                    Else
                        pl.y = pl.y + 2
                        movepermit = -1
                    End If
                End If
            Wend


        Case 2
            pl.y = pl.y + 4
            If pl.y > 440 Then pl.y = 440
            c(19) = Point(pl.x, pl.y)
            c(18) = Point(pl.x, pl.y - 2)
            movepermit = 0
            While movepermit = 0
                If c(18) = c(0) Then
                    movepermit = 1
                Else
                    pl.y = pl.y - 2
                    If c(18) = c(1) Then
                        movepermit = 1
                    Else
                        pl.y = pl.y - 2
                        movepermit = -1
                    End If
                End If
            Wend


        Case 3
            pl.x = pl.x - 4
            If pl.x < 120 Then pl.x = 120
            c(19) = Point(pl.x, pl.y)
            c(18) = Point(pl.x + 2, pl.y)
            movepermit = 0
            While movepermit = 0
                If c(18) = c(0) Then
                    movepermit = 1
                Else
                    pl.x = pl.x + 2
                    If c(18) = c(1) Then
                        movepermit = 1
                    Else
                        pl.x = pl.x + 2
                        movepermit = -1
                    End If
                End If
            Wend


        Case 4
            pl.x = pl.x + 4
            If pl.x > 520 Then pl.x = 520
            c(19) = Point(pl.x, pl.y)
            c(18) = Point(pl.x - 2, pl.y)
            movepermit = 0
            While movepermit = 0
                If c(18) = c(0) Then
                    movepermit = 1
                Else
                    pl.x = pl.x - 2
                    If c(18) = c(1) Then
                        movepermit = 1
                    Else
                        pl.x = pl.x - 2
                        movepermit = -1
                    End If
                End If
            Wend
    End Select


    c(19) = Point(pl.x, pl.y)
    If c(19) = c(0) Then
        Cls
        _PutImage (0, 0)-(scx, scy), bg&, 0 'draw background screen
        If fdinprocess = 0 Then
            drawoldx = oldpx: drawoldy = oldpy
            _PutImage (1, 1)-(scx - 1, scy - 1), 0, dbg&, (1, 1)-(scx, scy) 'take snapshot of screen - in case of death
        End If
        Line (oldpx, oldpy)-(pl.x, pl.y), c(44)
        If fdinprocess = 0 Then
            PSet (oldpx, oldpy), c(1)
        End If
        fdinprocess = 1
        _PutImage (1, 1)-(scx - 1, scy - 1), 0, bg&, (1, 1)-(scx, scy) 'take snapshot of screen
    End If

    If fdinprocess = 1 Then
        c(19) = Point(pl.x, pl.y)
        If c(19) = c(1) Then 'fast draw completed
            Cls
            _PutImage (0, 0)-(scx, scy), bg&, 0 'draw background screen
            Line (oldpx, oldpy)-(pl.x, pl.y), c(44)
            PSet (pl.x, pl.y), c(1)
            fdinprocess = -1
            claimlinefast
            claimfillfast
            _PutImage (1, 1)-(scx - 1, scy - 1), 0, bg&, (1, 1)-(scx, scy) 'take snapshot of screen
        End If
    End If

End Sub


Sub slowdrawmove
    Select Case pmove
        Case 1
            pl.y = pl.y - 2
            If pl.y < 40 Then pl.y = 40
            c(19) = Point(pl.x, pl.y)
            movepermit = 0
            While movepermit = 0
                If c(19) = c(0) Then
                    movepermit = 1
                Else
                    If c(19) = c(1) Then
                        movepermit = 1
                    Else
                        pl.y = pl.y + 2
                        movepermit = -1
                    End If
                End If
            Wend


        Case 2
            pl.y = pl.y + 2
            If pl.y > 440 Then pl.y = 440
            c(19) = Point(pl.x, pl.y)
            movepermit = 0
            While movepermit = 0
                If c(19) = c(0) Then
                    movepermit = 1
                Else
                    If c(19) = c(1) Then
                        movepermit = 1
                    Else
                        pl.y = pl.y - 2
                        movepermit = -1
                    End If
                End If
            Wend


        Case 3
            pl.x = pl.x - 2
            If pl.x < 120 Then pl.x = 120
            c(19) = Point(pl.x, pl.y)
            movepermit = 0
            While movepermit = 0
                If c(19) = c(0) Then
                    movepermit = 1
                Else
                    If c(19) = c(1) Then
                        movepermit = 1
                    Else
                        pl.x = pl.x + 2
                        movepermit = -1
                    End If
                End If
            Wend


        Case 4
            pl.x = pl.x + 2
            If pl.x > 520 Then pl.x = 520
            c(19) = Point(pl.x, pl.y)
            movepermit = 0
            While movepermit = 0
                If c(19) = c(0) Then
                    movepermit = 1
                Else
                    If c(19) = c(1) Then
                        movepermit = 1
                    Else
                        pl.x = pl.x - 2
                        movepermit = -1
                    End If
                End If
            Wend
    End Select



    c(19) = Point(pl.x, pl.y)
    If c(19) = c(0) Then
        Cls
        _PutImage (0, 0)-(scx, scy), bg&, 0 'draw background screen
        If sdinprocess = 0 Then
            drawoldx = oldpx: drawoldy = oldpy
            _PutImage (1, 1)-(scx - 1, scy - 1), 0, dbg&, (1, 1)-(scx, scy) 'take snapshot of screen - in case of death
        End If
        Line (oldpx, oldpy)-(pl.x, pl.y), c(45)
        If sdinprocess = 0 Then
            PSet (oldpx, oldpy), c(1)
        End If
        sdinprocess = 1
        _PutImage (1, 1)-(scx - 1, scy - 1), 0, bg&, (1, 1)-(scx, scy) 'take snapshot of screen
    End If

    If sdinprocess = 1 Then
        c(19) = Point(pl.x, pl.y)
        If c(19) = c(1) Then 'slow draw completed
            Cls
            _PutImage (0, 0)-(scx, scy), bg&, 0 'draw background screen
            Line (oldpx, oldpy)-(pl.x, pl.y), c(45)
            PSet (pl.x, pl.y), c(1)
            sdinprocess = -1
            claimlineslow
            claimfillslow
            _PutImage (1, 1)-(scx - 1, scy - 1), 0, bg&, (1, 1)-(scx, scy) 'take snapshot of screen
        End If
    End If

End Sub



Sub claimlinefast
    'scan board for blue line
    For j = 41 To 439
        For k = 121 To 519
            c(19) = Point(k, j)
            n = 0
            If c(19) = c(44) Then 'blue pixel found
                c(20) = Point(k - 1, j)
                c(21) = Point(k + 1, j)
                c(22) = Point(k, j - 1)
                c(23) = Point(k, j + 1)
                c(24) = Point(k, j + 2)
                c(25) = Point(k, j - 2)
                c(26) = Point(k + 2, j)

                'horizontal line
                If c(22) = c(0) Then 'look above
                    If c(23) = c(0) Then n = Int(2) 'look below
                End If

                'upper left corner
                If n = 0 Then
                    'look below 2 pixels
                    If c(23) = c(44) Then
                        If c(24) = c(44) Then
                            If c(20) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If

                'upper right corner
                If n = 0 Then
                    'look below 2 pixels
                    If c(23) = c(44) Then
                        If c(24) = c(44) Then
                            If c(21) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If


                'lower left corner
                If n = 0 Then
                    'look to the right 2 pixels
                    If c(21) = c(44) Then
                        If c(26) = c(44) Then
                            If c(23) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If


                'lower right corner
                If n = 0 Then
                    'look above 2 pixels
                    If c(22) = c(1) Then
                        If c(25) = c(1) Then
                            If c(23) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If


                'if part of vertical line
                If c(20) = c(0) Then
                    If c(21) = c(0) Then n = Int(2)
                End If


                If n = 2 Then
                    PSet (k, j), c(1) 'change blue pixel to white
                End If
            End If
        Next k
    Next j
End Sub


Sub claimlineslow
    'scan board for red line
    For j = 41 To 439
        For k = 121 To 519
            c(19) = Point(k, j)
            n = 0
            If c(19) = c(45) Then 'red pixel found
                c(20) = Point(k - 1, j)
                c(21) = Point(k + 1, j)
                c(22) = Point(k, j - 1)
                c(23) = Point(k, j + 1)
                c(24) = Point(k, j + 2)
                c(25) = Point(k, j - 2)
                c(26) = Point(k + 2, j)

                'horizontal line
                If c(22) = c(0) Then 'look above
                    If c(23) = c(0) Then n = Int(2) 'look below
                End If

                'upper left corner
                If n = 0 Then
                    'look below 2 pixels
                    If c(23) = c(45) Then
                        If c(24) = c(45) Then
                            If c(20) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If

                'upper right corner
                If n = 0 Then
                    'look below 2 pixels
                    If c(23) = c(45) Then
                        If c(24) = c(45) Then
                            If c(21) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If



                'if lower left corner
                If n = 0 Then
                    'look to the right 2 pixels
                    If c(21) = c(45) Then
                        If c(26) = c(45) Then
                            If c(23) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If

                'if lower right corner
                If n = 0 Then
                    'look above 2 pixels
                    If c(22) = c(1) Then
                        If c(25) = c(1) Then
                            If c(23) = c(0) Then
                                n = Int(2)
                            End If
                        End If
                    End If
                End If

                'if part of vertical line
                If c(20) = c(0) Then
                    If c(21) = c(0) Then n = Int(2)
                End If


                If n = 2 Then
                    PSet (k, j), c(1) 'change red pixel to white
                End If
            End If
        Next k
    Next j
End Sub



Sub claimfillfast 'using paint for flood fills
    'start at qix
    c(14) = _RGB(30, 30, 30)
    k = q(1).xx: j = q(1).yy
    Paint (k, j), c(14), c(1)

    'fill black with blue
    For j = 41 To 439
        For k = 121 To 519
            c(16) = Point(k, j)
            If c(16) = c(0) Then
                PSet (k, j), c(4)
                bluetot = bluetot + 1
            End If
        Next k
    Next j

    'fill gray with black
    k = q(1).xx: j = q(1).yy
    Paint (k, j), c(0), c(1)
End Sub


Sub claimfillslow 'using paint for flood fills

    'start at qix
    c(14) = _RGB(30, 30, 30)
    k = q(1).xx: j = q(1).yy
    Paint (k, j), c(14), c(1)

    'fill black with red
    For j = 41 To 439
        For k = 121 To 519
            c(16) = Point(k, j)
            If c(16) = c(0) Then
                PSet (k, j), c(5)
                redtot = redtot + 1
            End If
        Next k
    Next j

    'fill gray with black
    k = q(1).xx: j = q(1).yy
    Paint (k, j), c(0), c(1)
End Sub



Sub endlevel
    'fill black
    For j = 121 To 519
        For k = 439 To 41 Step -1
            PSet (j, k), c(0)
        Next k
        _Display
        _Delay .005
    Next j
End Sub



Sub youdead
    Dim ct2, ct3, ct4, basedir, tx, ty, dist, d2, rp

    basedir = .785
    dist = 15
    d2 = 10
    qd(1).xx = pl.x + 5: qd(1).yy = pl.y - 5
    qd(1).len1 = 10
    qd(1).dir = basedir



    For ct = 1 To 35
        Cls
        _PutImage (0, 0)-(scx, scy), bg&, 0 'draw background screen

        dist = dist + 10
        rp = ct
        If rp > 7 Then rp = 7


        qd(1).dir = basedir
        qd(1).len1 = qd(1).len1 + 1.5

        If rp > 1 Then
            For ct4 = 2 To rp
                qd(ct4).len1 = qd(ct4 - 1).len1 - 1.5
                qd(ct4).dir = basedir
            Next ct4
        End If

        For ct2 = 1 To rp
            For ct3 = 1 To 4
                Select Case ct3
                    Case 1
                        qd(ct2).xx = pl.x + (dist - ct2 * d2): qd(ct2).yy = pl.y - (dist - ct2 * d2)
                    Case 2
                        qd(ct2).xx = pl.x + (dist - ct2 * d2): qd(ct2).yy = pl.y + (dist - ct2 * d2)
                    Case 3
                        qd(ct2).xx = pl.x - (dist - ct2 * d2): qd(ct2).yy = pl.y + (dist - ct2 * d2)
                    Case 4
                        qd(ct2).xx = pl.x - (dist - ct2 * d2): qd(ct2).yy = pl.y - (dist - ct2 * d2)
                End Select

                qd(ct2).dir = qd(ct2).dir + (PI / 2)
                x = Cos(qd(ct2).dir) * qd(ct2).len1
                y = Sin(qd(ct2).dir) * qd(ct2).len1
                qd(ct2).x1 = qd(ct2).xx + x: qd(ct2).x2 = qd(ct2).xx - x
                qd(ct2).y1 = qd(ct2).yy - y: qd(ct2).y2 = qd(ct2).yy + y
                Line (qd(ct2).x1, qd(ct2).y1)-(qd(ct2).x2, qd(ct2).y2), c(1)
            Next ct3
        Next ct2


        _Display
        _Delay .04
    Next ct



    _Delay 1.
    sdinprocess = 0
    fdinprocess = 0
    pl.x = drawoldx: pl.y = drawoldy

End Sub
Reply


Messages In This Thread
QIX - by james2464 - 11-29-2022, 02:36 AM
RE: QIX - by bplus - 11-29-2022, 03:47 AM
RE: QIX - by mnrvovrfc - 11-29-2022, 04:00 AM
RE: QIX - by bplus - 11-29-2022, 04:29 AM
RE: QIX - by james2464 - 11-29-2022, 05:25 AM
RE: QIX - by mnrvovrfc - 11-29-2022, 05:39 AM
RE: QIX - by james2464 - 11-29-2022, 06:12 AM
RE: QIX - by bplus - 11-29-2022, 12:38 PM
RE: QIX - by james2464 - 11-29-2022, 02:50 PM
RE: QIX - by bplus - 11-29-2022, 03:29 PM
RE: QIX - by james2464 - 11-29-2022, 04:28 PM
RE: QIX - by bplus - 11-29-2022, 04:40 PM
RE: QIX - by james2464 - 11-29-2022, 04:50 PM
RE: QIX - by james2464 - 12-06-2022, 06:20 PM



Users browsing this thread: 4 Guest(s)