Page 1 of 1

Walking duck

Posted: Sat Nov 14, 2015 8:38 pm
by Melle
Hi all,

Here a program of a walking duck on a 50x50 grid.

Rules are:
When cell has no color:
Duck will color cell yellow and move right.
When cell has yellow:
Duck will color red and move left.
When color has red:
Duck will color yellow and move right.

It turns out the grid is coloured quite frantic.
image.jpg
image.jpg (504.74 KiB) Viewed 4864 times
image.jpg
image.jpg (530.34 KiB) Viewed 4864 times
image.jpg
image.jpg (592.23 KiB) Viewed 4864 times

Code: Select all



graphics
maxx = screen_width()
maxy = screen_height()
circlex = maxx / 50
circley = maxy /50

dim field(51,51)
gosub fieldclear

gosub drawfield

duckx = 24
ducky = 24

xr =1
yr=0
padr=1

field(duckx, ducky) = 1
gosub drawfield

for walk = 1 to 10000
  
  gosub drawcell
  gosub move
  if field(duckx, ducky)= 0 then
    vulkleur = 1
  end if
  if field(duckx, ducky)= 1 then
    vulkleur=2
  end if
   if field(duckx, ducky)= 2 then
    vulkleur=1
  end if
  field(duckx, ducky) = vulkleur
  gosub drawcell
  gosub newr
 pause 0.02
next walk

gosub drawfield
end

drawcell:
   if field(duckx, ducky) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(duckx, ducky) = 1 then
     fill color 0.7, 0.7, 0
    end if
   if field(duckx, ducky) = 2 then
     fill color 0.8, 0.2, 0.2
    end if

   
   posx = circlex * duckx -6
   posy = circley * ducky -6
   
    fill circle posx, posy size 6
return


drawfield:
for i=1 to 50
  for j=1 to 50
   if field(i,j) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(i,j) = 1 then
     fill color 0.7, 0.4, 0
    end if
if field(i,j) = 2 then
     fill color 0.8, 0.2, 0.5
    end if

   
   posx = circlex * i -6
   posy = circley * j -6
   
    fill circle posx, posy size 6
   
  next j
next i
return

fieldclear:
for i=1 to 50
  for j=1 to 50
   field(i,j)=0
  next j
next i
return


move:
duckx = duckx + xr
ducky = ducky + yr
return

newr:
r = field(duckx,ducky)
if r=1 then
gosub left
else
gosub right
end if
return

left:
padr=0
if xr=1 then
  xr=0
  yr=-1
  return
end if
if xr=-1 then
  xr=0
  yr=1
  return
end if
if yr=-1 then
  yr=0
  xr=-1
  return
end if
if yr=1 then
  yr=0
  xr=1
  return
end if


right:
padr=1
if xr=1 then
  xr=0
  yr=1
  return
end if
if xr = -1 then
let xr=0
yr=-1
return
end if
if yr =-1 then
  yr=0
  xr=1
  return
end if
if yr=1 then
  yr=0
  xr=-1
  return
end if
return

Re: Walking duck

Posted: Sun Nov 15, 2015 8:34 am
by Henko
Quit amazing that the pattern shows randomness without the random function beiing used.
There are no fences at the borders of the field. The duck wants to leave the field and causes an "out of bound" error. :D

Re: Walking duck

Posted: Sun Nov 15, 2015 11:12 am
by Melle
Yes indeed very random! I was hoping to see some symmetry.

I now have a slightly improved version, because it shows where the action is.
Colouring the actual position of the duck white makes it more clear.

Also changed the rules which leads to a duck that seem to want to 'grow' its playground!

I would call this one the yellow fence builder :-)

Code: Select all

graphics
maxx = screen_width()
maxy = screen_height()
circlex = maxx / 50
circley = maxy /50

dim field(51,51)
gosub fieldclear

gosub drawfield

duckx = 24
ducky = 24

xr =1
yr=0
padr=1

field(duckx, ducky) = 0
gosub drawfield

for walk = 1 to 10000
  
  
  
  
  gosub whitecircle
  pause .1
  if field(duckx, ducky)= 0 then
    vulkleur = 1
  end if
  if field(duckx, ducky)= 1 then
    vulkleur=2
  end if
   if field(duckx, ducky)= 2 then
    vulkleur=2
  end if
  
  field(duckx, ducky) = vulkleur
gosub drawcell
  gosub removecircle
  gosub move
gosub newr
  
  
  
  
 
next walk

gosub drawfield
end

drawcell:
   if field(duckx, ducky) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(duckx, ducky) = 1 then
     fill color 0.7, 0.7, 0
    end if
   if field(duckx, ducky) = 2 then
     fill color 0.8, 0.2, 0.2
    end if

   
   posx = circlex * duckx -6
   posy = circley * ducky -6
   
    fill circle posx, posy size 6
return

removecircle:
gosub determinexy
draw color 0.1, 0.1, 0.1
draw circle posx, posy size 6
return

whitecircle:
gosub determinexy
draw color 1, 1, 1
draw circle posx, posy size 6
return


determinexy:
posx = circlex * duckx -6
   posy = circley * ducky -6
return

drawfield:
for i=1 to 50
  for j=1 to 50
   if field(i,j) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(i,j) = 1 then
     fill color 0.7, 0.4, 0
    end if
if field(i,j) = 2 then
     fill color 0.8, 0.2, 0.5
    end if

   
   posx = circlex * i -6
   posy = circley * j -6
   
    fill circle posx, posy size 6
   
  next j
next i
return

fieldclear:
for i=1 to 50
  for j=1 to 50
   field(i,j)=0
  next j
next i
return


move:
duckx = duckx + xr
ducky = ducky + yr
return

newr:
r = field(duckx,ducky)
if r=0 then
gosub left
end if
if r=1 then
gosub right
end if
return

right:
padr=0
if xr=1 then
  xr=0
  yr=-1
  return
end if
if xr=-1 then
  xr=0
  yr=1
  return
end if
if yr=-1 then
  yr=0
  xr=-1
  return
end if
if yr=1 then
  yr=0
  xr=1
  return
end if


left:
padr=1
if xr=1 then
  xr=0
  yr=1
  return
end if
if xr = -1 then
let xr=0
yr=-1
return
end if
if yr =-1 then
  yr=0
  xr=1
  return
end if
if yr=1 then
  yr=0
  xr=-1
  return
end if
return




Re: Walking duck

Posted: Sat Nov 21, 2015 9:10 am
by Dutchman
I extended the previous version with some randomness and a finish function.

Code: Select all

/*
Walking duck 2
by Melle » Sat Nov 14, 2015
Hi all,
Here a program of a walking duck on a 50x50 grid.
Rules are:
When cell has no color:
Duck will color cell yellow and move right.
When cell has yellow:
Duck will color red and move left.
When color has red:
Duck will color yellow and move right.
It turns out the grid is coloured quite frantic.
Version 2:
Extended by Dutchman with randomness and finish-function
*/
noise=0.05 'determines randomness
break=10 ' determines interval in milliseconds
graphics
maxx = screen_width()
maxy = screen_height()
circlex = maxx / 50
circley = maxy /50

dim field(51,51) ' initialises with zeros

gosub drawfield

duckx = 24
ducky = 24

xr =1
yr=0
padr=1

field(duckx, ducky) = 1
gosub drawfield

DO
  gosub drawcell
  gosub move
  if field(duckx, ducky)= 0 then
    vulkleur = 1
  end if
  if field(duckx, ducky)= 1 then
    vulkleur=2
  end if
   if field(duckx, ducky)= 2 then
    vulkleur=1
  end if
  IF RND(1)<noise THEN vulkleur=RND(3)
  field(duckx, ducky) = vulkleur
  gosub drawcell
  gosub newr
 pause break/1000
UNTIL forever
end

drawcell:
   if field(duckx, ducky) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(duckx, ducky) = 1 then
     fill color 0.7, 0.7, 0
    end if
   if field(duckx, ducky) = 2 then
     fill color 0.8, 0.2, 0.2
    end if

   
   posx = circlex * duckx -6
   posy = circley * ducky -6
   
    fill circle posx, posy size 6
return


drawfield:
for i=1 to 50
  for j=1 to 50
   if field(i,j) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(i,j) = 1 then
     fill color 0.7, 0.4, 0
    end if
if field(i,j) = 2 then
     fill color 0.8, 0.2, 0.5
    end if

   
   posx = circlex * i -6
   posy = circley * j -6
   
    fill circle posx, posy size 6
   
  next j
next i
return

move:
duckx = duckx + xr
ducky = ducky + yr
IF MIN(duckx,ducky)=0 OR MAX(duckx,ducky)=51 THEN Finish
return

newr:
r = field(duckx,ducky)
if r=1 then
gosub left
else
gosub right
end if
return

left:
padr=0
if xr=1 then
  xr=0
  yr=-1
  return
end if
if xr=-1 then
  xr=0
  yr=1
  return
end if
if yr=-1 then
  yr=0
  xr=-1
  return
end if
if yr=1 then
  yr=0
  xr=1
  return
end if


right:
padr=1
if xr=1 then
  xr=0
  yr=1
  return
end if
if xr = -1 then
let xr=0
yr=-1
return
end if
if yr =-1 then
  yr=0
  xr=1
  return
end if
if yr=1 then
  yr=0
  xr=-1
  return
end if
return

DEF Finish
T$="Duck is gone!"
width=TEXT_WIDTH(T$)
fontsize=.maxx/2/width*FONT_SIZE()
DRAW FONT SIZE fontsize
width=TEXT_WIDTH(T$)
height=TEXT_HEIGHT(T$)
DRAW COLOR 0.3,1,1
DRAW TEXT T$ AT (.maxx-width)/2,(.maxy-height)/2
STOP
END DEF
finished duck
finished duck
duck.png (458.14 KiB) Viewed 4789 times

Re: Walking duck

Posted: Sun Nov 22, 2015 8:44 am
by Henko
And with some other minor modifications...

Code: Select all

/*
Walking duck 2
by Melle » Sat Nov 14, 2015
Hi all,
Here a program of a walking duck on a 50x50 grid.
Rules are:
When cell has no color:
Duck will color cell yellow and move right.
When cell has yellow:
Duck will color red and move left.
When color has red:
Duck will color yellow and move right.
It turns out the grid is coloured quite frantic.
Version 2:
Extended by Dutchman with randomness and finish-function
*/
noise=0.05 'determines randomness
break=10 ' determines interval in milliseconds
graphics
maxx = screen_width()
maxy = screen_height()
circlex = maxx / 50
circley = maxy /64

dim field(51,65) ' initialises with zeros

' gosub drawfield

duckx = 24
ducky = 24

xr =1
yr=0
padr=1

field(duckx, ducky) = 1
' gosub drawfield

DO
  gosub drawcell
  gosub move
  if field(duckx, ducky)= 0 then
    vulkleur = 1
  end if
  if field(duckx, ducky)= 1 then
    vulkleur=2
  end if
   if field(duckx, ducky)= 2 then
    vulkleur=1
  end if
  IF RND(1)<noise THEN vulkleur=RND(3)
  field(duckx, ducky) = vulkleur
  gosub drawcell
  gosub newr
'  pause break/1000
UNTIL forever
end

drawcell:
   if field(duckx, ducky) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(duckx, ducky) = 1 then
     fill color 0.7, 0.7, 0
    end if
   if field(duckx, ducky) = 2 then
     fill color 0.8, 0.2, 0.2
    end if

   
   posx = circlex * duckx -6
   posy = circley * ducky -6
   
    fill rect posx, posy size 7
return


drawfield:
for i=1 to 50
  for j=1 to 50
   if field(i,j) = 0 then
     fill color 0.1, 0.1, 0.1
   end if
   if field(i,j) = 1 then
     fill color 0.7, 0.4, 0
    end if
if field(i,j) = 2 then
     fill color 0.8, 0.2, 0.5
    end if

   
   posx = circlex * i -6
   posy = circley * j -6
   
    fill circle posx, posy size 6
   
  next j
next i
return

move:
duckx = duckx + xr
ducky = ducky + yr
IF MIN(duckx,ducky)=0 OR duckx=51 or ducky=65 THEN Finish
return

newr:
r = field(duckx,ducky)
if r=1 then
gosub left
else
gosub right
end if
return

left:
padr=0
if xr=1 then
  xr=0
  yr=-1
  return
end if
if xr=-1 then
  xr=0
  yr=1
  return
end if
if yr=-1 then
  yr=0
  xr=-1
  return
end if
if yr=1 then
  yr=0
  xr=1
  return
end if


right:
padr=1
if xr=1 then
  xr=0
  yr=1
  return
end if
if xr = -1 then
let xr=0
yr=-1
return
end if
if yr =-1 then
  yr=0
  xr=1
  return
end if
if yr=1 then
  yr=0
  xr=-1
  return
end if
return

DEF Finish
T$="Duck is gone!"
width=TEXT_WIDTH(T$)
fontsize=.maxx/2/width*FONT_SIZE()
DRAW FONT SIZE fontsize
width=TEXT_WIDTH(T$)
height=TEXT_HEIGHT(T$)
DRAW COLOR 0.3,1,1
DRAW TEXT T$ AT (.maxx-width)/2,(.maxy-height)/2
STOP
END DEF

Re: Walking duck

Posted: Sun Nov 22, 2015 11:22 am
by Dutchman
These 'minor modifications' are for portrait mode only :?:

Re: Walking duck

Posted: Sun Nov 22, 2015 11:47 am
by Henko
Portrait mode? May be the case, i didn't care. I'm a sloppy programmer.
Here is another modification: a high voltage fence is added, throwing the duck back into the field if it tries to escape.

Code: Select all

' Walking duck 3
' by Melle (org), Dutchman, and Henko » Sat Nov 14, 2015
'
noise=0.05 'determines randomness
break=10 ' determines interval in milliseconds
graphics
maxx = screen_width() ! maxy = screen_height()
circlex = maxx / 50 ! circley = maxy /64

dim field(51,65) ' initialises with zeros
duckx = 24 ! ducky = 24 ! xr =1 ! yr=0
field(duckx, ducky) = 1
DO
  gosub drawcell ! gosub move
  if field(duckx, ducky)%2= 0 then vulkleur = 1
  if field(duckx, ducky)= 1 then vulkleur=2
  IF RND(1)<noise THEN vulkleur=RND(3)
  field(duckx, ducky) = vulkleur
  gosub drawcell
  if field(duckx,ducky)=1 then gosub left else gosub right
UNTIL forever
end

drawcell:
if field(duckx,ducky)=0 then fill color 0.1, 0.1, 0.1
if field(duckx,ducky)=1 then fill color 0.7, 0.7, 0
if field(duckx,ducky)=2 then fill color 0.8, 0.2, 0.2
posx=circlex*duckx-6 ! posy=circley*ducky-6
fill rect posx, posy size 7
return

move:
duckx=duckx+xr ! ducky=ducky+yr
IF duckx=0 OR duckx=51 then duckx=1+rnd(50)
IF ducky=0 OR ducky=65 then ducky=1+rnd(64)
return

left:
if xr=1 then  ! xr=0 ! yr=-1 ! return ! end if
if xr=-1 then ! xr=0 ! yr=1  ! return ! end if
if yr=-1 then ! yr=0 ! xr=-1 ! return ! end if
if yr=1 then  ! yr=0 ! xr=1  ! return ! end if

right:
if xr=1 then  ! xr=0 ! yr=1  ! return ! end if
if xr=-1 then ! xr=0 ! yr=-1 ! return ! end if
if yr=-1 then ! yr=0 ! xr=1  ! return ! end if
if yr=1 then  ! yr=0 ! xr=-1 ! return ! end if

Re: Walking duck

Posted: Sun Nov 22, 2015 7:05 pm
by rbytes
Here is my contribution. I kept the enhancements by Dutchman, but restored the white circle (now filled) to show exactly where the duck Is moving. And now the duck has a quack, which fades away once he escapes. I really feel sorry for this little duck, as he seems to be in a real panic. Sometimes I feel like cheering when he escapes!

You will need the duck.mp3 attachment to make it quack. :P

Code: Select all

/*
Walking duck 2.1
by Melle » Sat Nov 14, 2015
Hi all,
Here a program of a walking duck on a 50x50 grid.
Rules are:
When cell has no color:
Duck will color cell yellow and move right.
When cell has yellow:
Duck will color red and move left.
When color has red:
Duck will color yellow and move right.
It turns out the grid is coloured quite frantic.
Version 2.1:
Modified by ricardobytes to restore white circle and add sound
Version 2:
Extended by Dutchman with randomness and finish-function
*/
f$="duck.mp3"
c$="player"
MUSIC c$ LOAD f$
noise=0.05 'determines randomness
BREAK=10 ' determines interval in milliseconds
GRAPHICS
maxx = SCREEN_WIDTH()
maxy = SCREEN_HEIGHT()
circlex = maxx / 50
circley = maxy /50

DIM FIELD(51,51) ' initialises with zeros

GOSUB drawfield

duckx = 24
ducky = 24

xr =1
yr=0
padr=1

FIELD(duckx, ducky) = 1
GOSUB drawfield

DO
  IF NOT MUSIC_PLAYING(c$) THEN
    MUSIC c$ PLAY
  ENDIF
  GOSUB drawcell
  GOSUB removecircle
  GOSUB move
  IF FIELD(duckx, ducky)= 0 THEN
    vulkleur = 1
  END IF
  IF FIELD(duckx, ducky)= 1 THEN
    vulkleur=2
  END IF
   IF FIELD(duckx, ducky)= 2 THEN
    vulkleur=1
  END IF
  IF RND(1)<noise THEN vulkleur=RND(3)
  FIELD(duckx, ducky) = vulkleur
  GOSUB drawcell
  GOSUB whitecircle
  GOSUB newr
 PAUSE BREAK/1000
UNTIL forever
END

drawcell:
   IF FIELD(duckx, ducky) = 0 THEN
     FILL COLOR 0.1, 0.1, 0.1
   END IF
   IF FIELD(duckx, ducky) = 1 THEN
     FILL COLOR 0.7, 0.7, 0
    END IF
   IF FIELD(duckx, ducky) = 2 THEN
     FILL COLOR 0.8, 0.2, 0.2
    END IF

   
   posx = circlex * duckx -6
   posy = circley * ducky -6
   
    FILL CIRCLE posx, posy SIZE 6
RETURN

removecircle:
GOSUB determinexy
DRAW COLOR 0.1, 0.1, 0.1
DRAW CIRCLE posx, posy SIZE 6
RETURN

whitecircle:
GOSUB determinexy
FILL COLOR 1, 1, 1
FILL CIRCLE posx, posy SIZE 6
RETURN

determinexy:
posx = circlex * duckx -6
   posy = circley * ducky -6
RETURN

drawfield:
FOR i=1 TO 50
  FOR j=1 TO 50
   IF FIELD(i,j) = 0 THEN
     FILL COLOR 0.1, 0.1, 0.1
   END IF
   IF FIELD(i,j) = 1 THEN
     FILL COLOR 0.7, 0.4, 0
    END IF
IF FIELD(i,j) = 2 THEN
     FILL COLOR 0.8, 0.2, 0.5
    END IF

   
   posx = circlex * i -6
   posy = circley * j -6
   
    FILL CIRCLE posx, posy SIZE 6
   
  NEXT j
NEXT i
RETURN

move:
duckx = duckx + xr
ducky = ducky + yr
IF MIN(duckx,ducky)=0 OR MAX(duckx,ducky)=51 THEN Finish
RETURN

newr:
r = FIELD(duckx,ducky)
IF r=1 THEN
GOSUB LEFT
ELSE
GOSUB RIGHT
END IF
RETURN

LEFT:
padr=0
IF xr=1 THEN
  xr=0
  yr=-1
  RETURN
END IF
IF xr=-1 THEN
  xr=0
  yr=1
  RETURN
END IF
IF yr=-1 THEN
  yr=0
  xr=-1
  RETURN
END IF
IF yr=1 THEN
  yr=0
  xr=1
  RETURN
END IF


RIGHT:
padr=1
IF xr=1 THEN
  xr=0
  yr=1
  RETURN
END IF
IF xr = -1 THEN
LET xr=0
yr=-1
RETURN
END IF
IF yr =-1 THEN
  yr=0
  xr=1
  RETURN
END IF
IF yr=1 THEN
  yr=0
  xr=-1
  RETURN
END IF
RETURN

DEF Finish
T$="Duck is gone!"
width=TEXT_WIDTH(T$)
fontsize=.maxx/2/width*FONT_SIZE()
DRAW FONT SIZE fontsize
width=TEXT_WIDTH(T$)
height=TEXT_HEIGHT(T$)
DRAW COLOR 0.3,1,1
DRAW TEXT T$ AT (.maxx-width)/2,(.maxy-height)/2
FOR n=1 TO 100
  IF NOT MUSIC_PLAYING(.c$) THEN
    MUSIC .c$ PLAY
  ENDIF
  MUSIC .c$ VOLUME (100-n)/100
  PAUSE .06
NEXT n
STOP
END DEF

Re: Walking duck

Posted: Mon Nov 23, 2015 9:27 am
by Dutchman
@Henko: maybe sloppy, but efficient

@Ricardobytes, a programmer with a heart for animals. :D :lol:
Thanks to bring the duck to life. And indeed, I feel like cheering too when he escapes!
(sob and sigh)

Re: Walking duck

Posted: Mon Nov 23, 2015 11:47 pm
by Henko
When turning this into a game, name it "The lost duckdom"