# Langton ant (Rule 2) moving in a Truchet-tiled torus world # rule: enter cell, follow grey border, change cell, repeat # Wolfgang.Urban@schule.at from xturtle import * SPEED = 3 # build 'truchet tile' turtleshapes def buildtiles(dd): d = dd/2 e = d/2**0.5 i = 1 s = Shape("compound") poly0 = ((-d,-d),(d,-d),(d,d),(-d,d),(-d,-d)) s.addComponent(poly0,"grey","black") poly = ((d-i,-d+i),(i,-d+i),(d-e,-d+e),(d-i,i),(d-i,-d+i)) s.addComponent(poly,"white",None) poly = ((-d+i,d-i),(i,d-i),(-d+e,d-e),(-d+i,i),(-d+i,d-i)) s.addComponent(poly,"white",None) addshape("VR",s) s = Shape("compound") s.addComponent(poly0,"white","black") poly = ((d-i,d-i),(i,d-i),(d-e,d-e),(d-i,i),(d-i,d-i)) s.addComponent(poly,"grey",None) poly = ((-d+i,-d+i),(i,-d+i),(-d+e,-d+e),(-d+i,i),(-d+i,-d+i)) s.addComponent(poly,"grey",None) addshape("VL",s) s = Shape("compound") s.addComponent(poly0,"white","black") poly = ((d-i,-d+i),(i,-d+i),(d-e,-d+e),(d-i,i),(d-i,-d+i)) s.addComponent(poly,"grey",None) poly = ((-d+i,d-i),(i,d-i),(-d+e,d-e),(-d+i,i),(-d+i,d-i)) s.addComponent(poly,"grey",None) addshape("HL",s) s = Shape("compound") s.addComponent(poly0,"grey","black") poly = ((d-i,d-i),(i,d-i),(d-e,d-e),(d-i,i),(d-i,d-i)) s.addComponent(poly,"white",None) poly = ((-d+i,-d+i),(i,-d+i),(-d+e,-d+e),(-d+i,i),(-d+i,-d+i)) s.addComponent(poly,"white",None) addshape("HR",s) class World: # n = side length of world, D = size of single tile def __init__(self,n=6,D=50): self.x0 = self.y0 = -D*n/2 # left bottom self.n,self.D = n,D self.MIN,self.MAX = self.x0+2,self.x0+n*D-2 # boundaries winsize(n*D+D,n*D+D) # screen without scrolls screensize(n*D+D-50,n*D+D-50) reset() mode("logo") buildtiles(D) tracer(100,0) # tile floor with left tiles self.world = {} for y in range(n): for x in range(n): if (x+y)%2==0: self.world[(x,y)] = Tile("HL",-1,self.x0+x*D+D/2,self.y0+y*D+D/2) else: self.world[(x,y)] = Tile("VL",-1,self.x0+x*D+D/2,self.y0+y*D+D/2) # ants starting position self.xx,self.yy = n//2,n//2 # Cell coordinates self.x,self.y = self.x0+self.xx*D+D/2,self.y0+self.yy*D # Screen coordinates tracer(1,50) width(2) color("red") shape("turtle") penup() setpos(self.x,self.y) self.direction = 0 # up speed(SPEED) delay(20) def walk(self): # cell to enter t = self.world[self.xx,self.yy] self.direction = (self.direction+t.typ)%4 if self.direction == 0: self.yy = (self.yy+1)%self.n elif self.direction == 2: self.yy = (self.yy-1)%self.n elif self.direction == 1: self.xx = (self.xx+1)%self.n elif self.direction == 3: self.xx = (self.xx-1)%self.n r = -t.typ*self.D/2 circle(r,90,3) # connect boundaries if not ((self.MIN<=xcor()