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 (504.74 KiB) Viewed 4960 times
- image.jpg (530.34 KiB) Viewed 4960 times
- image.jpg (592.23 KiB) Viewed 4960 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.
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
- duck.png (458.14 KiB) Viewed 4885 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.
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.
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"