QB64 Phoenix Edition
Bad Life - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Code and Stuff (https://qb64phoenix.com/forum/forumdisplay.php?fid=3)
+---- Forum: Programs (https://qb64phoenix.com/forum/forumdisplay.php?fid=7)
+---- Thread: Bad Life (/showthread.php?tid=772)



Bad Life - James D Jarvis - 08-16-2022

Ever code anything with a poor recollection of how it's been done before? 
Well this is what you get.
Bad Life.

Play with the variables and you are getting a whole different set of results.

Code: (Select All)
'bad life
'by James D. Jarvis
'I was knocking out a quick version of life seeded by mouse doodles and something went wrong
'eventually the program mutated into what you see now
'change the values and what emerges will vary

maxx = 600 'screen x
maxy = 500 'screen y
agelimit = 8 'the oldest a cell can be, any positivetve value, you want it higher than weaklim
growthboost = 2 'how much a cell grows each cycle
weaklim = 5 'the point at which cells are too weak to go on
merger = 1.71 ' the factor for merging cells some of the largest differences come from changing this value, any value except 0 will work
logic = 9 ' 0 to 9
pointer = 1 '1 to 3 , 1 is the only sensible one


Screen _NewImage(maxx, maxy, 256)
_Title "Bad Life"
Dim cell(0 To maxx - 1, 0 To maxy - 1)
Dim ncell(0 To maxx - 1, 0 To maxy - 1)

biglooplimit = (maxx + maxy) * 10
For x = 1 To maxx - 1
    For y = 1 To maxy - 1
        cell(x, y) = 0
    Next y
Next x
Print "Bad Life"
Print "Doodle on the screen with the mouse. Press any key when ready."
'you can keep placing points later in the program but it doesn't wait for you
Do
    _Limit 60
    Do While _MouseInput

        x = _MouseX
        y = _MouseY
        'check for the mouse pointer in the image drawing area

        If _MouseButton(1) Then
            PSet (x, y), 1
            cell(x, y) = 4
            If pointer > 1 Then
                Select Case pointer
                    Case 2
                        For px = x - 1 To x + 1
                            For py = y - 1 To y + 1
                                cell(px, py) = cell(px, py) + 4
                                PSet (px, py), cell(px, py)
                            Next py
                        Next px
                    Case 3
                        For px = x - 2 To x + 2
                            For py = y - 2 To y + 2
                                cell(px, py) = cell(px, py) + Int((Abs(px) + Abs(py)) / 2)
                                PSet (px, py), cell(px, py)
                            Next py
                        Next px


                End Select
            End If
        End If
    Loop
    a$ = InKey$
Loop Until a$ <> ""

g = 0
Do

    Cls
    _Limit 60
    For x = 2 To maxx - 2
        _Limit biglooplimit
        For y = 2 To maxy - 2
            ncell(x, y) = 0
            If logic > -1 Then
                If cell(x - 1, y) > 0 Then ncell(x, y) = Int((cell(x - 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y) > 0 Then ncell(x, y) = Int((cell(x + 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x, y - 1) > 0 Then ncell(x, y) = Int((cell(x, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x, y + 1) > 0 Then ncell(x, y) = Int((cell(x, y + 1) + cell(x, y)) / merger) + growthboost
            End If
            If logic > 0 Then If cell(x, y) > 0 Then ncell(x, y) = cell(x, y) + growthboost
            If logic > 1 Then
                If cell(x - 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x - 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y + 1) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y + 1) + cell(x, y)) / merger) + growthboost
            End If
            If logic > 2 Then
                If cell(x - 1, y) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x, y - 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x, y + 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
            End If
            If logic > 3 Then
                If cell(x - 1, y - 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x - 1, y + 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y - 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y + 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
            End If
            If logic > 4 Then
                If cell(x - 1, y - 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x - 1, y + 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y - 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y + 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
            End If
            If logic > 5 Then
                If cell(x - 1, y) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x - 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x + 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x, y - 1) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x, y + 1) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x, y + 1) + cell(x, y)) / merger) + growthboost
            End If
            If logic > 7 Then
                If cell(x - 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y - 1) + ncell(x, y)) / merger) + growthboost
                If cell(x - 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y + 1) + ncell(x, y)) / merger) + growthboost
                If cell(x + 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y - 1) + ncell(x, y)) / merger) + growthboost
                If cell(x + 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y + 1) + ncell(x, y)) / merger) + growthboost
            End If
            If logic > 8 Then
                If cell(x - 1, y) > cell(x, y) / 2 Then ncell(x, y) = 0
                If cell(x + 1, y) > cell(x, y) / 2 Then ncell(x, y) = 0
                If cell(x, y - 1) > cell(x, y) / 2 Then ncell(x, y) = 0
                If cell(x, y + 1) > cell(x, y) / 2 Then ncell(x, y) = 0
            End If


        Next y
    Next x
    For y = 2 To maxy - 2
        _Limit biglooplimit
        For x = 2 To maxx - 2

            cell(x, y) = ncell(x, y)
            If cell(x, y) > agelimit Or cell(x, y) < weaklim Then cell(x, y) = 0
            PSet (x, y), cell(x, y)

        Next x
    Next y

    Locate 1, 1: Print g
    _Display
    g = g + 1
    If B$ = "m" Then merger = merger + 1
    If B$ = "n" Then
        merger = merger - 1
        If merger = 0 Then merger = -1
    End If
    If B$ = "," Then
        weaklim = weaklim - 1
        If weaklim < 1 Then weaklim = 1
    End If
    If B$ = "." Then
        weaklim = weaklim + 1
        If weaklim > agelimit - 1 Then weaklim = agelimit - 1
    End If

    If B$ = "a" Then agelimit = agelimit + 1
    If B$ = "z" Then
        agelimit = agelimit - 1
        If agelimit < wealim + growth Then agelimit = wealim + growth
    End If
    If B$ = "g" Then growthboost = growthboost + 1
    If B$ = "f" Then
        growthboost = growthboost - 1
        If growthboost < 1 Then growthboost = 1
    End If

    If B$ = "l" Then
        logic = logic + 1
        If logic > 9 Then logic = 0
    End If

    B$ = InKey$
    Do While _MouseInput

        x = _MouseX
        y = _MouseY
        'check for the mouse pointer in the image drawing area

        If _MouseButton(1) Then
            PSet (x, y), 1
            cell(x, y) = 4
            If pointer > 1 Then
                Select Case pointer
                    Case 2
                        For px = x - 1 To x + 1
                            For py = y - 1 To y + 1
                                If px > 1 And py > 1 And px < maxx - 1 And py < maxy - 1 Then
                                    cell(px, py) = cell(px, py) + 4
                                    PSet (px, py), cell(px, py)
                                End If
                            Next py
                        Next px
                    Case 3
                        For px = x - 2 To x + 2
                            For py = y - 2 To y + 2
                                If px > 2 And py > 2 And px < maxx - 2 And py < maxy - 2 Then
                                    cell(px, py) = cell(px, py) + Int((Abs(px) + Abs(py)) / 2)
                                    PSet (px, py), cell(px, py)
                                End If
                            Next py
                        Next px
                    Case 4
                        For px = x - 1 To x + 1
                            For py = y - 1 To y + 1
                                cell(px, py) = 0
                                PSet (px, py), 0
                            Next py
                        Next px


                End Select
            End If

        End If
    Loop


Loop Until B$ = Chr$(27)



RE: Bad Life - mnrvovrfc - 08-16-2022

I modified this program to try to prevent repeated tedious compilation for changing one value.
Now at the command line, provide the name of a text file which has settings.
Because this program reads the whole graphics screen, there isn't an easy way to speed up the iterations.

Code: (Select All)
'bad life
'by James D. Jarvis
''QB64 phoenix forums, modified by mnrvovrfc gc16
'I was knocking out a quick version of life seeded by mouse doodles and something went wrong
'eventually the program mutated into what you see now
'change the values and what emerges will vary

dim ff as long, kount as integer, biglooplimit as long, dolimitorig as _byte, value as single

a$ = command$(1)
if a$ = "" then
    print "Please give the name of a text file at the command line."
    end
end if
if not _fileexists(a$) then
    print "File not found: "; a$
    end
end if

kount = 0
ff = freefile
open a$ for input as ff
do until eof(ff)
    line input #ff, b$
    if not (b$ = "" or left$(b$, 1) = "'") then
        kount = kount + 1
        if kount > 9 then exit do
        select case kount
            case 1
                value = val(b$)
                if value < 320 or value > 1280 then maxx = 600 else maxx = int(value)
            case 2
                value = val(b$)
                if value < 200 or value > 768 then maxy = 500 else maxy = int(value)
            case 3
                value = val(b$)
                if value > 0 then agelimit = int(value) else agelimit = 8
            case 4
                value = val(b$)
                if value > 0 then growthboost = int(value) else growthboost = 2
            case 5
                value = val(b$)
                if value > 0 then weaklim = int(value) else weaklim = 5
            case 6
                value = val(b$)
                if value > 0 then merger = value else merger = 1.71
            case 7
                value = val(b$)
                if value >= 0 and value < 10 then logic = int(value) else logic = 9
            case 8
                value = val(b$)
                if value > 0 and value < 4 then pointer = int(value) else pointer = 1
            case 9
                value = val(b$)
                if value > 10 and value <= 1e+6 then biglooplimit = int(value) else biglooplimit = 0
        end select
    end if
loop
close ff


Screen _NewImage(maxx, maxy, 256)
_Title "Bad Life"
Dim cell(0 To maxx - 1, 0 To maxy - 1)
Dim ncell(0 To maxx - 1, 0 To maxy - 1)

if biglooplimit = 0 then
    dolimitorig = 1
    biglooplimit = (maxx + maxy) * 10
end if
For x = 1 To maxx - 1
    For y = 1 To maxy - 1
        cell(x, y) = 0
    Next y
Next x
Print "Bad Life"
Print "Doodle on the screen with the mouse. Press any key when ready."
'you can keep placing points later in the program but it doesn't wait for you
Do
    _Limit 60
    Do While _MouseInput

        x = _MouseX
        y = _MouseY
        'check for the mouse pointer in the image drawing area

        If _MouseButton(1) Then
            PSet (x, y), 1
            cell(x, y) = 4
            If pointer > 1 Then
                Select Case pointer
                    Case 2
                        For px = x - 1 To x + 1
                            For py = y - 1 To y + 1
                                cell(px, py) = cell(px, py) + 4
                                PSet (px, py), cell(px, py)
                            Next py
                        Next px
                    Case 3
                        For px = x - 2 To x + 2
                            For py = y - 2 To y + 2
                                cell(px, py) = cell(px, py) + Int((Abs(px) + Abs(py)) / 2)
                                PSet (px, py), cell(px, py)
                            Next py
                        Next px


                End Select
            End If
        End If
    Loop
    a$ = InKey$
Loop Until a$ <> ""

g = 0
Do

    Cls
    if dolimitorig then _Limit 60
    For x = 2 To maxx - 2
        _Limit biglooplimit
        For y = 2 To maxy - 2
            ncell(x, y) = 0
            If logic > -1 Then
                If cell(x - 1, y) > 0 Then ncell(x, y) = Int((cell(x - 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y) > 0 Then ncell(x, y) = Int((cell(x + 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x, y - 1) > 0 Then ncell(x, y) = Int((cell(x, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x, y + 1) > 0 Then ncell(x, y) = Int((cell(x, y + 1) + cell(x, y)) / merger) + growthboost
            End If
            If logic > 0 Then If cell(x, y) > 0 Then ncell(x, y) = cell(x, y) + growthboost
            If logic > 1 Then
                If cell(x - 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x - 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y + 1) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y + 1) + cell(x, y)) / merger) + growthboost
            End If
            If logic > 2 Then
                If cell(x - 1, y) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x, y - 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x, y + 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
            End If
            If logic > 3 Then
                If cell(x - 1, y - 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x - 1, y + 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y - 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y + 1) > 0 Then ncell(x, y) = cell(x, y) + growthboost
            End If
            If logic > 4 Then
                If cell(x - 1, y - 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x - 1, y + 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y - 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
                If cell(x + 1, y + 1) > cell(x, y) Then ncell(x, y) = cell(x, y) + growthboost
            End If
            If logic > 5 Then
                If cell(x - 1, y) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x - 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x + 1, y) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x + 1, y) + cell(x, y)) / merger) + growthboost
                If cell(x, y - 1) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x, y - 1) + cell(x, y)) / merger) + growthboost
                If cell(x, y + 1) > cell(x, y) / 2 Then ncell(x, y) = Int((cell(x, y + 1) + cell(x, y)) / merger) + growthboost
            End If
            If logic > 7 Then
                If cell(x - 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y - 1) + ncell(x, y)) / merger) + growthboost
                If cell(x - 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x - 1, y + 1) + ncell(x, y)) / merger) + growthboost
                If cell(x + 1, y - 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y - 1) + ncell(x, y)) / merger) + growthboost
                If cell(x + 1, y + 1) > 0 Then ncell(x, y) = Int((cell(x + 1, y + 1) + ncell(x, y)) / merger) + growthboost
            End If
            If logic > 8 Then
                If cell(x - 1, y) > cell(x, y) / 2 Then ncell(x, y) = 0
                If cell(x + 1, y) > cell(x, y) / 2 Then ncell(x, y) = 0
                If cell(x, y - 1) > cell(x, y) / 2 Then ncell(x, y) = 0
                If cell(x, y + 1) > cell(x, y) / 2 Then ncell(x, y) = 0
            End If


        Next y
    Next x
    For y = 2 To maxy - 2
        _Limit biglooplimit
        For x = 2 To maxx - 2

            cell(x, y) = ncell(x, y)
            If cell(x, y) > agelimit Or cell(x, y) < weaklim Then cell(x, y) = 0
            PSet (x, y), cell(x, y)

        Next x
    Next y

    Locate 1, 1: Print g
    _Display
    g = g + 1
    If B$ = "m" Then merger = merger + 1
    If B$ = "n" Then
        merger = merger - 1
        If merger = 0 Then merger = -1
    End If
    If B$ = "," Then
        weaklim = weaklim - 1
        If weaklim < 1 Then weaklim = 1
    End If
    If B$ = "." Then
        weaklim = weaklim + 1
        If weaklim > agelimit - 1 Then weaklim = agelimit - 1
    End If

    If B$ = "a" Then agelimit = agelimit + 1
    If B$ = "z" Then
        agelimit = agelimit - 1
        If agelimit < wealim + growth Then agelimit = wealim + growth
    End If
    If B$ = "g" Then growthboost = growthboost + 1
    If B$ = "f" Then
        growthboost = growthboost - 1
        If growthboost < 1 Then growthboost = 1
    End If

    If B$ = "l" Then
        logic = logic + 1
        If logic > 9 Then logic = 0
    End If

    B$ = InKey$
    Do While _MouseInput

        x = _MouseX
        y = _MouseY
        'check for the mouse pointer in the image drawing area

        If _MouseButton(1) Then
            PSet (x, y), 1
            cell(x, y) = 4
            If pointer > 1 Then
                Select Case pointer
                    Case 2
                        For px = x - 1 To x + 1
                            For py = y - 1 To y + 1
                                If px > 1 And py > 1 And px < maxx - 1 And py < maxy - 1 Then
                                    cell(px, py) = cell(px, py) + 4
                                    PSet (px, py), cell(px, py)
                                End If
                            Next py
                        Next px
                    Case 3
                        For px = x - 2 To x + 2
                            For py = y - 2 To y + 2
                                If px > 2 And py > 2 And px < maxx - 2 And py < maxy - 2 Then
                                    cell(px, py) = cell(px, py) + Int((Abs(px) + Abs(py)) / 2)
                                    PSet (px, py), cell(px, py)
                                End If
                            Next py
                        Next px
                    Case 4
                        For px = x - 1 To x + 1
                            For py = y - 1 To y + 1
                                cell(px, py) = 0
                                PSet (px, py), 0
                            Next py
                        Next px


                End Select
            End If

        End If
    Loop


Loop Until B$ = Chr$(27)

Now will require this file (edit as you want):
Code: (Select All)
'screen x
600
'screen y
500
'the oldest a cell can be, any positive value, you want it higher than weaklim
8
'how much a cell grows each cycle
2
'the point at which cells are too weak to go on
5
' the factor for merging cells some of the largest differences come from changing this value, any value except 0 will work
1.71
' 0 to 9
9
'1 to 3, 1 is the only sensible one
1
'"biglooplimit", up to a million, set to zero so it behaves like original program, set as slow as ten to go to sleep LOL
50000



RE: Bad Life - James D Jarvis - 08-16-2022

Neato. I haven't used the command prompt in ages for program input.