#---------------------------------------------------------------------- # William T. Verts - Fish Tank problem in Object-Oriented form # # Copyright (C) April 28, 2017 -- Dr. William T. Verts #---------------------------------------------------------------------- import random,time #---------------------------------------------------------------------- # Standard functions given as part of the assignment #---------------------------------------------------------------------- def INT(N): return int(round(N)) def addCircle(Canvas,Xc,Yc,R,NewColor=black): Diameter = INT(2*R+1) addOval(Canvas,INT(Xc-R),INT(Yc-R),Diameter,Diameter,NewColor) return def addCircleFilled(Canvas,Xc,Yc,R,NewColor=black): Diameter = INT(2*R+1) addOvalFilled(Canvas,INT(Xc-R),INT(Yc-R),Diameter,Diameter,NewColor) return def Circles(Canvas,Xc,Yc,R,FillColor=white,EdgeColor=black): addCircleFilled(Canvas,Xc,Yc,R,FillColor) addCircle(Canvas,Xc,Yc,R,EdgeColor) return def addEllipse(Canvas,Xc,Yc,Xr,Yr,NewColor=black): addOval(Canvas,INT(Xc-Xr),INT(Yc-Yr),INT(2*Xr+1),INT(2*Yr+1),NewColor) return def addEllipseFilled(Canvas,Xc,Yc,Xr,Yr,NewColor=black): addOvalFilled(Canvas,INT(Xc-Xr),INT(Yc-Yr),INT(2*Xr+1),INT(2*Yr+1),NewColor) return def Ellipses(Canvas,Xc,Yc,Xr,Yr,FillColor=white,EdgeColor=black): addEllipseFilled(Canvas,Xc,Yc,Xr,Yr,FillColor) addEllipse(Canvas,Xc,Yc,Xr,Yr,EdgeColor) return def Line (Canvas,X1,Y1,X2,Y2,NewColor=black): addLine(Canvas,INT(X1),INT(Y1),INT(X2),INT(Y2),NewColor) return def FishLeft (Canvas,Xc,Yc,NewColor,Scale=1.0): def F(N): return N*Scale Ellipses(Canvas,Xc+F(14),Yc,F(3),F(14),white, black) # Tail Ellipses(Canvas,Xc,Yc,F(17),F(9),NewColor,black) # Body Circles(Canvas,Xc-F(10),Yc-F(2),F(3),white, black) # Eye Line(Canvas,Xc-F(15),Yc+F(4),Xc-F(7),Yc+F(4),white) # Mouth Line(Canvas,Xc-F(5),Yc+F(6),Xc-F(5),Yc-F(6),white) # Gill return def FishRight (Canvas,Xc,Yc,NewColor,Scale=1.0): def F(N): return N*Scale Ellipses(Canvas,Xc-F(14),Yc,F(3),F(14),white, black) # Tail Ellipses(Canvas,Xc,Yc,F(17),F(9),NewColor, black) # Body Circles(Canvas,Xc+F(10),Yc-F(2),F(3),white, black) # Eye Line(Canvas,Xc+F(15),Yc+F(4),Xc+F(7),Yc+F(4),white) # Mouth Line(Canvas,Xc+F(5),Yc+F(6),Xc+F(5),Yc-F(6),white) # Gill return #---------------------------------------------------------------------- # Object-Oriented Fish definition #---------------------------------------------------------------------- class Fish(object): def __init__ (self, NewX, NewY, NewXDir, NewYDir, NewColor, NewScale=1.0): self.X = NewX self.Y = NewY self.XDir = NewXDir self.YDir = NewYDir self.BodyColor = NewColor self.Scale = NewScale return def Paint (self, Canvas): if self.XDir < 0: FishLeft(Canvas, self.X, self.Y, self.BodyColor, self.Scale) else: FishRight(Canvas, self.X, self.Y, self.BodyColor, self.Scale) return def Update (self, XMin, YMin, XMax, YMax): self.X = self.X + self.XDir self.Y = self.Y + self.YDir if (self.X < XMin): self.XDir = +1 elif (self.X > XMax): self.XDir = -1 if (self.Y < YMin): self.YDir = +1 elif (self.Y > YMax): self.YDir = -1 if random.randrange(10) == 0: self.XDir = random.randrange(-1,+2) if random.randrange(20) == 0: self.YDir = random.randrange(-1,+2) return #---------------------------------------------------------------------- # Main program #---------------------------------------------------------------------- def FishTank(Canvas, TotalFish=20): TankColor = makeColor(0,0,128) Colors = [black,blue,green,cyan,red,magenta,yellow] Scales = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0] W = getWidth(Canvas) H = getHeight(Canvas) AllFish = [] for I in range(TotalFish): NewX = W/2 + random.randrange(-25,+26) NewY = H/2 + random.randrange(-25,+26) NewXDir = random.randrange(-1,2) NewYDir = random.randrange(-1,2) NewColor = random.choice(Colors) NewScale = random.choice(Scales) AllFish = AllFish + [Fish(NewX,NewY,NewXDir,NewYDir,NewColor,NewScale)] while True: setAllPixelsToAColor(Canvas,TankColor) for AFish in AllFish: AFish.Paint(Canvas) # Same as: Fish.Paint(AFish,Canvas) AFish.Update(0,0,W,H) # Same as: Fish.Update(AFish,0,0,W,H) repaint(Canvas) time.sleep(0.05) return def Run(): TotalFish = requestIntegerInRange("Enter Number of Fish", 1, 1000) FishTank(makeEmptyPicture(640,480), TotalFish) return