Jump to content

Recommended Posts

Posted

@JamesBrooks

No I mean :

CLEAR
COLOR 0xFFFFFF
FORWARD 150

COLOR 0x0000FF
FORWARD 50
TURN 90
WAIT 1000]oÝ÷ Ù«­¢+Ù
1H)
=1=HÁá)=I]IÄÔÀ)

Cheers, FireFox.

  • Replies 74
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted (edited)

Oh it's the code that Andreik sent me, I haven't been able to test it yet.

Just test the code that you post and don't work.

Maybe I sent you something wrong :lmao: or you forgot some lines :) .

Try this, for me work fine:

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <String.au3>
#include <Array.au3>

Global $arrDic[7] = ["FORWARD", "COLOR", "CLEAR", "WAIT", "DO", "SIZE", "TURN"]
Global $arrCols[4][2] = [["BLACK", "0x000000"],["RED", "0xFF0000"],["BLUE", "0x0000FF"],["GREEN", "0x00FF00"]]
Global $turtle = @ScriptDir & '\turtle.gif', $Count = 0, $picDraw
Global Const $Pi = 3.14159265358979323846264338328
Global $oldX = 228, $oldY = 300, $oldA = 90, $penColor = 0x000000, $penSize = 1
Global Const $degToRad = $Pi / 180

$guiMain = GUICreate("A3 LOGO Interpreter", 474, 445)
GUICtrlCreateGroup("", 8, 336, 457, 105)
$strCmd = GUICtrlCreateEdit("", 16, 352, 377, 81, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL,$ES_AUTOHSCROLL))
$btnRun = GUICtrlCreateButton("&Run", 400, 352, 57, 81, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$picDraw = GUICtrlCreateGraphic(8, 8, 457, 330)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetGraphic(-1, $GUI_GR_MOVE, $oldX, $oldY)
$picTurt = GUICtrlCreatePic($turtle, 228, 300, 20, 24)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $btnRun
            ControlDisable("A3 LOGO Interpreter","",$btnRun)
            Command()
            ControlEnable("A3 LOGO Interpreter","",$btnRun)
    EndSwitch
WEnd

Func Turtle($x, $y, $color = $penColor, $size = $penSize)
    GUICtrlSetGraphic($picDraw, $GUI_GR_MOVE, $oldX, $oldY)
    GUICtrlSetGraphic($picDraw, $GUI_GR_PENSIZE, $size)
    GUICtrlSetGraphic($picDraw, $GUI_GR_COLOR, $color)
    GUICtrlSetGraphic($picDraw, $GUI_GR_LINE, $x, $y)
    GUICtrlSetGraphic($picDraw, $GUI_GR_REFRESH)
    $oldY = $y
    $oldX = $x
    GUICtrlSetPos($picTurt, $x, $y)
EndFunc ;==>Turtle

Func Command()
    $Line = StringSplit(StringStripCR(GUICtrlRead($strCmd)), @LF)
    For $i = 1 To $Line[0]
        If $Line[$i] = "" Then
            ContinueLoop
        EndIf

        If StringInStr($Line[$i], " ") Then
            $ThisThing = StringLeft($Line[$i], StringInStr($Line[$i], " ") - 1)
        Else
            $ThisThing = $Line[$i]
        EndIf

        Switch StringUpper($ThisThing)
            Case $arrDic[0]; FORWARD
                Call("FORWARD",$Line[$i])
            Case $arrDic[1]; COLOR
                Call("COLOR",$Line[$i])
            Case $arrDic[2]; CLEAR
                ClearGraphic()
            Case $arrDic[3]; WAIT
                Call("WAIT",$Line[$i])
            Case $arrDic[4]; DO (Loop)
               Call("DoLoop",$Line[$i])
            Case $arrDic[5]; SIZE
                Call("SIZE",$Line[$i])
            Case $arrDic[6]; TURN
                Call("TURN",$Line[$i])
            Case Else
                MsgBox(0, "LOGO", "Error: Unexpected command: " & $ThisThing)
        EndSwitch
    Next
EndFunc ;==>Command

Func FORWARD($Line)
    $ThisY = StringSplit($Line, " ")
    If IsArray($ThisY) Then Turtle($oldX + ( Cos($oldA * $degToRad) * $ThisY[2]) , $oldY - ( Sin($oldA * $degToRad) * $ThisY[2]))
EndFunc

Func Color($Line)
    $getPen = StringSplit($Line, " ")
    If IsArray($getPen) Then $penColor = $getPen[2]
EndFunc

Func WAIT($Line)
    $Time = StringSplit($Line, " ")
    If IsArray($Time) Then Sleep($Time[2])
EndFunc

Func SIZE($Line)
    $getSize = StringSplit($Line, " ")
    If IsArray($getSize) Then $penSize = $getSize[2]
EndFunc

Func TURN($Line)
    $ThisTurn = StringSplit($Line, " ")
    If Not IsArray($ThisTurn) Then
        MsgBox(0, "LOGO", "Error: TURN requires a degree.")
    Else
        $oldA += Number($ThisTurn[2])
        While ($oldA > 360)
            $oldA -= 360
        WEnd
        While ($oldA < 0)
            $oldA += 360
        WEnd
;Turtle($oldX - $ThisTurn[2], $oldY)
    EndIf
EndFunc

Func ClearGraphic()
    For $INDEX = 0 To $Count
        GUICtrlDelete($picDraw)
        GUICtrlCreateGraphic(8, 8, 457, 330)
        GUICtrlSetBkColor(-1, 0xFFFFFF)
        GUICtrlSetGraphic(-1, $GUI_GR_MOVE, $oldX, $oldY)
        $oldX = 228
        $oldY = 300
        $oldA = 90
        Turtle(228, 300)
    Next
    $Count = 0
EndFunc ;==>ClearGraphic

Func DoLoop($LINE)
    Local $WORK = _StringBetween($LINE,"[","]")
    Local $LOOP = StringLeft($LINE,StringInStr($LINE,"[")-2)
    Local $LOOPS = StringSplit($LOOP," ")
    If IsArray($LOOPS) Then
        Local $COMMANDS = StringSplit($WORK[0],"  ",1)
        If IsArray($COMMANDS) Then
            For $INDEX = 1 To $LOOPS[2]
                For $COMMAND_INDEX = 1 To $COMMANDS[0]
                    If StringLeft($COMMANDS[$COMMAND_INDEX],7) = "FORWARD" Then
                        Call("FORWARD",$COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX],5) = "COLOR" Then
                        Call("COLOR",$COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX],5) = "CLEAR" Then
                        Call("ClearGraphic")
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX],4) = "WAIT" Then
                        Call("WAIT",$COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX],4) = "SIZE" Then
                        Call("SIZE",$COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX],4) = "TURN" Then
                        Call("TURN",$COMMANDS[$COMMAND_INDEX])
                    EndIf
                Next
            Next
        EndIf
    EndIf
EndFunc
Edited by Andreik
Posted

@JamesBrooks

You can modify COLOR function to be more useful.

Something like random color or a random color in a range would be very nice.

I tried to modify little, hope you like:

Func Color($Line)
    $getPen = StringSplit($Line, " ")
    If IsArray($getPen) Then 
        If StringLeft($getPen[2],6) = "RANDOM" Then
            If StringLen($getPen[2]) > 6 Then
                Local $RANGE = _StringBetween(StringTrimLeft($getPen[2],6),"{","}")
                If IsArray($RANGE) Then
                    Local $SPLIT = StringSplit($RANGE[0],"-")
                    If IsArray($SPLIT) Then
                        $penColor = Random($SPLIT[1],$SPLIT[2],1)
                    EndIf
                EndIf
            Else
                $penColor = Random(0x000000,0xFFFFFF,1)
            EndIf
        Else
            $penColor = $getPen[2]
        EndIf
    EndIf
EndFunc

Now should be possible code like:

CLEAR
COLOR 0xFFFFFF
FORWARD 150
DO 4 [COLOR RANDOM  FORWARD 50  TURN 90  WAIT 1000]

or

CLEAR
COLOR 0xFFFFFF
FORWARD 150
DO 4 [COLOR RANDOM{0x80FF00-0xCDFFFF}  FORWARD 50  TURN 90  WAIT 1000]
Posted

@JamesBrooks

What about this one :)

Note : No more includes (only String.au3), Added picture choice !

;~ #include <EditConstants.au3>
;~ #include <GUIConstantsEx.au3>
;~ #include <WindowsConstants.au3>
#include <String.au3>
;~ #include <Array.au3>

Global $arrDic[7] = ['FORWARD', 'COLOR', 'CLEAR', 'WAIT', 'DO', 'SIZE', 'TURN']
Global $arrCols[4][2] = [['BLACK', '0x000000'],['RED', '0xFF0000'],['BLUE', '0x0000FF'],['GREEN', '0x00FF00']]
Global $Count = 0, $picDraw
Global Const $Pi = 3.14159265358979323846264338328
Global $oldA = 90, $penColor = 0x000000, $penSize = 1
Global Const $degToRad = $Pi / 180

#Region Start
$pic = FileOpenDialog('Browse for picture...', @ScriptDir, 'gif (*.gif)|bmp (*.bmp)|png (*.png)|jpg (*.jpg)', 1 + 2, 'turtle.gif')
If @error Then
    Global $turtle = @ScriptDir & '\turtle.gif'
    Global $Width = 22
    Global $Height = 24
    Global $oldX = 228, $oldY = 300
Else
    Global $turtle = $pic
    Global $Width = StringTrimRight(_GetExtProperty($pic, 27), 7)
    Global $Height = StringTrimRight(_GetExtProperty($pic, 28), 7)
    Global $oldX = 237 - ($Width / 2), $oldY = 200 - ($Height / 2)
EndIf


;===============================================================================
; Function Name: _GetExtProperty
; Author(s): Simucal
;===============================================================================
Func _GetExtProperty($sPath, $iProp)
    Local $iExist, $sFile, $sDir, $oShellApp, $oDir, $oFile, $aProperty, $sProperty
    $sFile = StringTrimLeft($sPath, StringInStr($sPath, '\', 0, -1))
    $sDir = StringTrimRight($sPath, (StringLen($sPath) - StringInStr($sPath, '\', 0, -1)))
    $oShellApp = ObjCreate('shell.application')
    $oDir = $oShellApp.NameSpace($sDir)
    $oFile = $oDir.Parsename($sFile)
    If $iProp = -1 Then
        Local $aProperty[35]
        For $i = 0 To 34
            $aProperty[$i] = $oDir.GetDetailsOf($oFile, $i)
        Next
        Return $aProperty
    Else
        $sProperty = $oDir.GetDetailsOf($oFile, $iProp)
        If $sProperty = '' Then
            Return 'None'
        Else
            Return $sProperty
        EndIf
    EndIf
EndFunc   ;==>_GetExtProperty
#EndRegion Start
;

#Region GUI
$guiMain = GUICreate('A3 LOGO Interpreter', 474, 445)
GUICtrlCreateGroup('', 8, 336, 457, 105)
$strCmd = GUICtrlCreateEdit('', 16, 352, 377, 81, 3150016)
$btnRun = GUICtrlCreateButton('&Run', 400, 352, 57, 81, 0)
GUICtrlCreateGroup('', -99, -99, 1, 1)

$picDraw = GUICtrlCreateGraphic(8, 8, 457, 330)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetGraphic(-1, 6, $oldX, $oldY)
$picTurt = GUICtrlCreatePic($pic, $oldX, $oldY, $Width, $Height)
GUISetState(@SW_SHOW)
#EndRegion GUI


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case - 3
            Exit
        Case $btnRun
            ControlDisable('A3 LOGO Interpreter', '', $btnRun)
            Command()
            ControlEnable('A3 LOGO Interpreter', '', $btnRun)
    EndSwitch
WEnd

#include <GuiConstantsEx.au3>
Func Turtle($x, $y, $color = $penColor, $size = $penSize)
    GUICtrlSetGraphic($picDraw, 6, $oldX, $oldY)
    GUICtrlSetGraphic($picDraw, 24, $size)
    GUICtrlSetGraphic($picDraw, 8, $color)
    GUICtrlSetGraphic($picDraw, 2, $x, $y)
    GUICtrlSetGraphic($picDraw, 22)
    $oldY = $y
    $oldX = $x
    GUICtrlSetPos($picTurt, $x, $y)
EndFunc   ;==>Turtle

Func Command()
    $Line = StringSplit(StringStripCR(GUICtrlRead($strCmd)), @LF)
    For $i = 1 To $Line[0]
        If $Line[$i] = '' Then
            ContinueLoop
        EndIf

        If StringInStr($Line[$i], ' ') Then
            $ThisThing = StringLeft($Line[$i], StringInStr($Line[$i], ' ') - 1)
        Else
            $ThisThing = $Line[$i]
        EndIf

        Switch StringUpper($ThisThing)
            Case $arrDic[0]; FORWARD
                Call('FORWARD', $Line[$i])
            Case $arrDic[1]; COLOR
                Call('COLOR', $Line[$i])
            Case $arrDic[2]; CLEAR
                ClearGraphic()
            Case $arrDic[3]; WAIT
                Call('WAIT', $Line[$i])
            Case $arrDic[4]; DO (Loop)
                Call('DoLoop', $Line[$i])
            Case $arrDic[5]; SIZE
                Call('SIZE', $Line[$i])
            Case $arrDic[6]; TURN
                Call('TURN', $Line[$i])
            Case Else
                MsgBox(0, 'LOGO', 'Error: Unexpected command: ' & $ThisThing)
        EndSwitch
    Next
EndFunc   ;==>Command

Func FORWARD($Line)
    $ThisY = StringSplit($Line, ' ')
    If IsArray($ThisY) Then Turtle($oldX + (Cos($oldA * $degToRad) * $ThisY[2]), $oldY - (Sin($oldA * $degToRad) * $ThisY[2]))
EndFunc   ;==>FORWARD

Func Color($Line)
    $getPen = StringSplit($Line, ' ')
    If IsArray($getPen) Then $penColor = $getPen[2]
EndFunc   ;==>Color

Func WAIT($Line)
    $Time = StringSplit($Line, ' ')
    If IsArray($Time) Then Sleep($Time[2])
EndFunc   ;==>WAIT

Func SIZE($Line)
    $getSize = StringSplit($Line, ' ')
    If IsArray($getSize) Then $penSize = $getSize[2]
EndFunc   ;==>SIZE

Func TURN($Line)
    $ThisTurn = StringSplit($Line, ' ')
    If Not IsArray($ThisTurn) Then
        MsgBox(0, 'LOGO', 'Error: TURN requires a degree.')
    Else
        $oldA += Number($ThisTurn[2])
        While ($oldA > 360)
            $oldA -= 360
        WEnd
        While ($oldA < 0)
            $oldA += 360
        WEnd
        ;Turtle($oldX - $ThisTurn[2], $oldY)
    EndIf
EndFunc   ;==>TURN

Func ClearGraphic()
    For $INDEX = 0 To $Count
        GUICtrlDelete($picDraw)
        GUICtrlCreateGraphic(8, 8, 457, 330)
        GUICtrlSetBkColor(-1, 0xFFFFFF)
        GUICtrlSetGraphic(-1, 6, $oldX, $oldY)
        $oldX = 228
        $oldY = 300
        $oldA = 90
        Turtle(228, 300)
    Next
    $Count = 0
EndFunc   ;==>ClearGraphic

Func DoLoop($Line)
    Local $WORK = _StringBetween($Line, '[', ']')
    Local $LOOP = StringLeft($Line, StringInStr($Line, '[') - 2)
    Local $LOOPS = StringSplit($LOOP, ' ')
    If IsArray($LOOPS) Then
        Local $COMMANDS = StringSplit($WORK[0], '  ', 1)
        If IsArray($COMMANDS) Then
            For $INDEX = 1 To $LOOPS[2]
                For $COMMAND_INDEX = 1 To $COMMANDS[0]
                    If StringLeft($COMMANDS[$COMMAND_INDEX], 7) = 'FORWARD' Then
                        Call('FORWARD', $COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX], 5) = 'COLOR' Then
                        Call('COLOR', $COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX], 5) = 'CLEAR' Then
                        Call('ClearGraphic')
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX], 4) = 'WAIT' Then
                        Call('WAIT', $COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX], 4) = 'SIZE' Then
                        Call('SIZE', $COMMANDS[$COMMAND_INDEX])
                    ElseIf StringLeft($COMMANDS[$COMMAND_INDEX], 4) = 'TURN' Then
                        Call('TURN', $COMMANDS[$COMMAND_INDEX])
                    EndIf
                Next
            Next
        EndIf
    EndIf
EndFunc   ;==>DoLoop
Posted (edited)

@JamesBrooks

You can modify COLOR function to be more useful.

Something like random color or a random color in a range would be very nice.

I tried to modify little, hope you like:

Func Color($Line)
    $getPen = StringSplit($Line, " ")
    If IsArray($getPen) Then 
        If StringLeft($getPen[2],6) = "RANDOM" Then
            If StringLen($getPen[2]) > 6 Then
                Local $RANGE = _StringBetween(StringTrimLeft($getPen[2],6),"{","}")
                If IsArray($RANGE) Then
                    Local $SPLIT = StringSplit($RANGE[0],"-")
                    If IsArray($SPLIT) Then
                        $penColor = Random($SPLIT[1],$SPLIT[2],1)
                    EndIf
                EndIf
            Else
                $penColor = Random(0x000000,0xFFFFFF,1)
            EndIf
        Else
            $penColor = $getPen[2]
        EndIf
    EndIf
EndFunc

Now should be possible code like:

CLEAR
COLOR 0xFFFFFF
FORWARD 150
DO 4 [COLOR RANDOM  FORWARD 50  TURN 90  WAIT 1000]

or

CLEAR
COLOR 0xFFFFFF
FORWARD 150
DO 4 [COLOR RANDOM{0x80FF00-0xCDFFFF}  FORWARD 50  TURN 90  WAIT 1000]
Wow brilliant addition!

Next is PROC:

PROC SQUARE
COLOR RANDOM
FORWARD 20
TURN 45
}

I am sure I an get that one down :)

Edited by JamesBrooks
Posted (edited)

Wow brilliant addition!

Next is PROC:

PROC SQUARE
COLOR RANDOM
FORWARD 20
TURN 45
}

I am sure I an get that one down :)

I create a Square function:

Func SQUARE($Line)
    Local $SPLIT = StringSplit($Line," ")
    If IsArray($SPLIT) Then
        If $SPLIT[0] = 3 Then
            DoLoop("DO 4 [COLOR " & $SPLIT[2] & "  FORWARD " & $SPLIT[3] & "  TURN 90]")
        ElseIf $SPLIT[0] = 2 Then
            DoLoop("DO 4 [FORWARD " & $SPLIT[2] & "  TURN 90]")
        EndIf
    EndIf
EndFunc

It`s very easy to use:

SQUARE COLOR SIDE_LEN

or

SQUARE SIDE_LEN

Second syntax when you want to use default color.

Example:

CLEAR
COLOR 0xFFFFFF
FORWARD 150
DO 4 [SQUARE RANDOM 40  TURN 90  COLOR 0xFFFFFF  FORWARD 20]
Edited by Andreik
Posted (edited)

It's fun. I suggest looking at this. I need to change some command names to make it compatible though.

And DO function as well, because between parameters are 2 spaces and on mathsnet is only one.

And I suggest to rewrite all script again to be a little more aesthetic and remove all useless code and write efficient code (some functions could be write a more simple).

Edited by Andreik
Posted

And DO function as well, because between parameters are 2 spaces and on mathsnet is only one.

And I suggest to rewrite all script again to be a little more aesthetic and remove all useless code and write efficient code (some functions could be write a more simple).

I plan too, with the help you guys have been giving me and a possible snow day tomorrow... I hope to get it done.
Posted (edited)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...