# Note: this file was automatically converted to Python from the # original steve-language source code. Please see the original # file for more detailed comments and documentation. import breve class CaptureTheFlagController( breve.Control ): def __init__( self ): breve.Control.__init__( self ) self.blueFlag = None self.blueJail = None self.Flags = [] self.CaptureTheFlagPlayers = [] self.Jails = [] self.blueP = 0 self.firstClass = '' self.idCounter1 = 0 self.idCounter2 = 0 self.iterations = 0 self.left = None self.redFlag = None self.redJail = None self.redP = 0 self.right = None self.totalBlueP = 0 self.totalRedP = 0 CaptureTheFlagController.init( self ) def changeBluePrisoners( self, n ): self.blueP = ( self.blueP + n ) def changeRedPrisoners( self, n ): self.redP = ( self.redP + n ) def getBlueJailLocation( self ): return self.blueJail.getLocation() def getJailedBlueCount( self ): return self.blueP def getJailedRedCount( self ): return self.redP def getNextIdNumber( self, agent ): if ( self.firstClass == '' ): self.firstClass = agent.getType() if ( agent.getType() == self.firstClass ): self.idCounter1 += 1 return self.idCounter1 self.idCounter2 += 1 return self.idCounter2 def getRedJailLocation( self ): return self.redJail.getLocation() def init( self ): self.left = breve.createInstances( breve.Stationary, 1 ).register( breve.createInstances( breve.Cube, 1 ).initWith( breve.vector( ( 50 / 2.000000 ), 0.200000, 50 ) ), breve.vector( ( ( -50 ) / 4.000000 ), 0, 0 ) ) self.left.setColor( breve.vector( 0.700000, 0.700000, 1.000000 ) ) self.right = breve.createInstances( breve.Stationary, 1 ).register( breve.createInstances( breve.Cube, 1 ).initWith( breve.vector( ( 50 / 2.000000 ), 0.200000, 50 ) ), breve.vector( ( 50 / 4.000000 ), 0, 0 ) ) self.right.setColor( breve.vector( 1.000000, 0.700000, 0.700000 ) ) self.setIntegrationStep( 0.200000 ) self.enableLighting() self.moveLight( breve.vector( 0, 10, 0 ) ) self.enableShadowVolumes() self.pointCamera( breve.vector( 0, 0, 0 ), breve.vector( 0, 60, 60 ) ) self.blueJail = breve.createInstances( breve.Jail, 1 ) self.blueJail.move( breve.vector( ( ( 50 / 2.000000 ) - 5 ), 0, ( ( 50 / 2.000000 ) - 5 ) ) ) self.blueJail.setTeam( 0 ) self.redJail = breve.createInstances( breve.Jail, 1 ) self.redJail.move( breve.vector( ( ( ( -50 ) / 2.000000 ) + 5 ), 0, ( ( ( -50 ) / 2.000000 ) + 5 ) ) ) self.redJail.setTeam( 1 ) self.blueFlag = breve.createInstances( breve.Flag, 1 ) self.blueFlag.setTeam( 0 ) self.blueFlag.move( breve.vector( ( ( ( -50 ) / 2.000000 ) + 5 ), 1.000000, 0 ) ) self.redFlag = breve.createInstances( breve.Flag, 1 ) self.redFlag.setTeam( 1 ) self.redFlag.move( breve.vector( ( ( 50 / 2.000000 ) - 5 ), 1.000000, 0 ) ) def iterate( self ): bAve = 0 rAve = 0 if ( self.redP == 10 ): self.winForBlue() if ( self.blueP == 10 ): self.winForRed() if self.blueFlag.checkIfOffsides(): self.winForRed() if self.redFlag.checkIfOffsides(): self.winForBlue() if self.blueFlag.getCarrier(): self.totalRedP += 1 if self.redFlag.getCarrier(): self.totalBlueP += 1 self.iterations = ( self.iterations + 1 ) if ( self.getTime() >= 500 ): rAve = ( self.totalRedP / self.iterations ) bAve = ( self.totalBlueP / self.iterations ) if ( rAve == bAve ): print rAve, bAve self.tie() if ( rAve > bAve ): self.winForRed() if ( rAve < bAve ): self.winForBlue() breve.Control.iterate( self ) def report( self ): self.totalRedP = ( self.totalRedP / self.iterations ) self.totalBlueP = ( self.totalBlueP / self.iterations ) self.totalRedP = ( self.totalRedP * 10 ) self.totalBlueP = ( self.totalBlueP * 10 ) if ( self.blueP == 10 ): print '''All of the Blue players were captured.''' if ( self.redP == 10 ): print '''All of the Red players were captured.''' if self.blueFlag.checkIfOffsides(): print '''The Blue flag was captured.''' if self.redFlag.checkIfOffsides(): print '''The Red flag was captured.''' print '''The Blue had posession for %s percent of the game.''' % ( self.totalBlueP ) print '''The Red had posession for %s percent of the game.''' % ( self.totalRedP ) def setText( self, t ): self.setDisplayText( t, -0.950000, -0.950000 ) def tie( self ): self.report() raise Exception( '''TIE game.''' ) def winForBlue( self ): print '''*** The Blue team wins! ***''' self.report() raise Exception( '''The Blue team wins!''' ) def winForRed( self ): print '''*** The Red team wins! ***''' self.report() raise Exception( '''The Red team wins!''' ) breve.CaptureTheFlagController = CaptureTheFlagController class CTFMobile( breve.Mobile ): def __init__( self ): breve.Mobile.__init__( self ) self.team = 0 def checkIfOffsides( self ): o = 0 if ( ( self.team == 1 ) and ( self.getLocation().x < 0.000000 ) ): o = 1 if ( ( self.team == 0 ) and ( self.getLocation().x > 0.000000 ) ): o = 1 return o def getTeam( self ): return self.team def setTeam( self, t ): self.team = t if ( self.team == 1 ): print '''%s is on the red team''' % ( self ) else: print '''%s is on the blue team''' % ( self ) if ( self.team == 1 ): self.setColor( breve.vector( 1, 0, 0 ) ) else: self.setColor( breve.vector( 0, 0, 1 ) ) breve.CTFMobile = CTFMobile class Jail( breve.CTFMobile ): def __init__( self ): breve.CTFMobile.__init__( self ) Jail.init( self ) def init( self ): self.controller.Jails.append(self) self.setShape( breve.createInstances( breve.Cube, 1 ).initWith( breve.vector( 3, 1, 3 ) ) ) self.setColor( breve.vector( 0, 1, 0 ) ) self.setTransparency( 0.100000 ) def jailBreak( self ): item = None for item in self.controller.CaptureTheFlagPlayers: if ( item.getTeam() == self.team ): item.getFreed() breve.Jail = Jail class CaptureTheFlagPlayer( breve.CTFMobile ): def __init__( self ): breve.CTFMobile.__init__( self ) self.angle = 0 self.atEdge = 0 self.carrying = None self.heading = breve.vector() self.idNumber = 0 self.inJail = 0 self.jailedLocation = breve.vector() self.shape = None self.teamHome = breve.vector() self.turningLeft = 0 self.turningRight = 0 self.velocity = 0 CaptureTheFlagPlayer.init( self ) def accelerate( self ): self.setSpeed( ( self.velocity + 0.100000 ) ) def decelerate( self ): self.setSpeed( ( self.velocity - 0.100000 ) ) def detectEdge( self ): return self.atEdge def drop( self ): if self.carrying: self.carrying.setCarrier( 0 ) self.carrying = 0 def getAngle( self, v ): a = 0 toO = breve.vector() toO = ( v - self.getLocation() ) a = breve.breveInternalFunctionFinder.angle( self, self.heading, toO ) if ( ( breve.breveInternalFunctionFinder.transpose( self, self.getRotation() ) * toO ).x < 0.000000 ): return ( -a ) return a def getClosestOpponent( self ): bestDistance = 0 item = None best = None bestDistance = 200 for item in self.senseOtherTeam(): if ( breve.length( ( self.getLocation() - item.getLocation() ) ) < bestDistance ): best = item bestDistance = breve.length( ( self.getLocation() - item.getLocation() ) ) return best def getFreed( self ): if ( self.inJail == 0 ): return self.moveToHomeside() self.inJail = 0 if ( self.team == 1 ): self.controller.changeRedPrisoners( -1 ) else: self.controller.changeBluePrisoners( -1 ) def getHeading( self ): return self.heading def getIdNumber( self ): return self.idNumber def getInJail( self ): return self.inJail def getMyHomeLocation( self ): location = breve.vector() location = self.getLocation() if ( not self.checkIfOffsides() ): return location location.x = 0 return location def getObjectAngle( self, o ): return self.getAngle( o.getLocation() ) def getOtherHomeLocation( self ): location = breve.vector() location = self.getLocation() if self.checkIfOffsides(): return location location.x = 0 return location def goToJail( self ): if ( self.inJail == 1 ): return self.inJail = 1 if ( self.team == 1 ): self.jailedLocation = ( ( self.controller.getRedJailLocation() + breve.randomExpression( breve.vector( 1, 0, 1 ) ) ) - breve.vector( 0.500000, -0.500000, 0.500000 ) ) self.controller.changeRedPrisoners( 1 ) else: self.jailedLocation = ( ( self.controller.getBlueJailLocation() + breve.randomExpression( breve.vector( 1, 0, 1 ) ) ) - breve.vector( 0.500000, -0.500000, 0.500000 ) ) self.controller.changeBluePrisoners( 1 ) self.move( self.jailedLocation ) def hasFlag( self ): if self.carrying: return 1 return 0 def init( self ): i = 0 item = None type = '' self.controller.CaptureTheFlagPlayers.append(self) self.heading = breve.vector( 1, 0, 0 ) self.idNumber = self.controller.getNextIdNumber( self ) self.shape = breve.createInstances( breve.AgentShape, 1 ) self.setShape( self.shape ) self.handleCollisions( 'Flag', 'pickUp' ) self.handleCollisions( 'Jail', 'jailBreak' ) for item in self.controller.CaptureTheFlagPlayers: if ( item.getType() != self.getType() ): type = item.getType() item.handleCollisions( self.getType(), 'tag' ) if type: self.handleCollisions( type, 'tag' ) self.setAngle( breve.randomExpression( 6.290000 ) ) def iterate( self ): myrot = breve.matrix() myvel = breve.vector() myloc = breve.vector() if self.inJail: self.move( self.jailedLocation ) return if self.carrying: self.carrying.move( self.getLocation() ) if self.turningLeft: self.turnLeft() if self.turningRight: self.turnRight() myloc = self.getLocation() myvel = self.getHeading() if ( ( myloc.x > ( 50 / 2 ) ) and ( myvel.x > 0.000000 ) ): self.setSpeed( 0 ) self.atEdge = 1 else: if ( ( myloc.z > ( 50 / 2 ) ) and ( myvel.z > 0.000000 ) ): self.setSpeed( 0 ) self.atEdge = 1 else: if ( ( myloc.x < ( -( 50 / 2 ) ) ) and ( myvel.x < 0.000000 ) ): self.setSpeed( 0 ) self.atEdge = 1 else: if ( ( myloc.z < ( -( 50 / 2 ) ) ) and ( myvel.z < 0.000000 ) ): self.setSpeed( 0 ) self.atEdge = 1 else: self.atEdge = 0 myrot = self.getRotation() self.heading = ( myrot * breve.vector( 0, 1, 0 ) ) self.setVelocity( ( ( 0.500000 * self.velocity ) * self.heading ) ) myloc.y = 0.200000 self.move( myloc ) breve.CTFMobile.iterate( self ) def jailBreak( self, jail ): if ( ( not self.inJail ) and ( jail.getTeam() == self.team ) ): jail.jailBreak() def moveToHomeside( self ): o = breve.vector() r = breve.vector() if ( self.team == 1 ): r = breve.vector( ( 50 / 4.000000 ), 0, 50 ) o = breve.vector( ( 50 / 4.000000 ), 0, ( ( -50 ) / 2.000000 ) ) self.teamHome = breve.vector( -1, 0, 0 ) else: r = breve.vector( ( 50 / 4.000000 ), 0, 50 ) o = breve.vector( ( ( -50 ) / 2.000000 ), 0, ( ( -50 ) / 2.000000 ) ) self.teamHome = breve.vector( 1, 0, 0 ) self.move( ( breve.randomExpression( r ) + o ) ) def pickUp( self, f ): if ( f.getTeam() == self.team ): return if f.getCarrier(): return if self.inJail: return if ( not self.carrying ): self.carrying = f f.setCarrier( self ) def senseMyFlag( self ): result = breve.objectList() item = None for item in self.controller.Flags: if ( ( item.getTeam() == self.team ) and ( breve.length( ( self.getLocation() - item.getLocation() ) ) < 20 ) ): return item return 0 def senseMyJail( self ): result = breve.objectList() item = None for item in self.controller.Jails: if ( ( item.getTeam() == self.team ) and ( breve.length( ( self.getLocation() - item.getLocation() ) ) < 20 ) ): return item return 0 def senseMyTeam( self ): result = breve.objectList() item = None for item in self.controller.CaptureTheFlagPlayers: if ( ( ( item.getTeam() == self.team ) and ( not item.getInJail() ) ) and ( breve.length( ( self.getLocation() - item.getLocation() ) ) < 20 ) ): result.append( item ) return result def senseOtherFlag( self ): result = breve.objectList() item = None for item in self.controller.Flags: if ( ( item.getTeam() != self.team ) and ( breve.length( ( self.getLocation() - item.getLocation() ) ) < 20 ) ): return item return 0 def senseOtherJail( self ): result = breve.objectList() item = None for item in self.controller.Jails: if ( ( item.getTeam() != self.team ) and ( breve.length( ( self.getLocation() - item.getLocation() ) ) < 20 ) ): return item return 0 def senseOtherTeam( self ): result = breve.objectList() item = None for item in self.controller.CaptureTheFlagPlayers: if ( ( ( item.getTeam() != self.team ) and ( not item.getInJail() ) ) and ( breve.length( ( self.getLocation() - item.getLocation() ) ) < 20 ) ): result.append( item ) return result def setAngle( self, a ): self.angle = a self.rotate( breve.vector( -1, 0, 0 ), 1.570000 ) self.relativeRotate( breve.vector( 0, -1, 0 ), self.angle ) def setSpeed( self, value ): self.velocity = value if ( self.velocity > 1.000000 ): self.velocity = 1.000000 if ( self.velocity < 0.000000 ): self.velocity = 0.000000 def setTeam( self, t ): breve.CTFMobile.setTeam( self , t ) if ( self.team == 1 ): self.setColor( breve.vector( 1, 0, 0 ) ) else: self.setColor( breve.vector( 0, 0, 1 ) ) self.moveToHomeside() def setTurningLeft( self, i ): self.turningLeft = i def setTurningRight( self, i ): self.turningRight = i def tag( self, a ): if ( a.getTeam() == self.team ): return if a.checkIfOffsides(): a.drop() a.goToJail() if self.checkIfOffsides(): self.drop() self.goToJail() def turnLeft( self ): self.setAngle( ( self.angle - 0.030000 ) ) def turnRight( self ): self.setAngle( ( self.angle + 0.030000 ) ) breve.CaptureTheFlagPlayer = CaptureTheFlagPlayer class Flag( breve.CTFMobile ): def __init__( self ): breve.CTFMobile.__init__( self ) self.carrier = None Flag.init( self ) def getCarrier( self ): return self.carrier def init( self ): self.controller.Flags.append(self) self.setShape( breve.createInstances( breve.Sphere, 1 ).initWith( 1.500000 ) ) self.setBitmap( self.controller.loadImage( 'images/star.png' ) ) self.move( ( breve.randomExpression( breve.vector( 50, 0, 50 ) ) - breve.vector( ( 50 / 2 ), -0.500000, ( 50 / 2 ) ) ) ) def move( self, l ): if ( l.x > ( 50 / 2.000000 ) ): l.x = ( 50 / 2.000000 ) if ( l.x < ( ( -50 ) / 2.000000 ) ): l.x = ( ( -50 ) / 2.000000 ) if ( l.z > ( 50 / 2.000000 ) ): l.z = ( 50 / 2.000000 ) if ( l.z < ( ( -50 ) / 2.000000 ) ): l.z = ( ( -50 ) / 2.000000 ) breve.CTFMobile.move( self , l ) def setCarrier( self, c ): self.carrier = c breve.Flag = Flag class AgentShape( breve.CustomShape ): def __init__( self ): breve.CustomShape.__init__( self ) AgentShape.init( self ) def init( self ): d = breve.vector() c = breve.vector() b = breve.vector() a = breve.vector() a = breve.vector( 0, 1, 0 ) b = breve.vector( 0.250000, 0, 0 ) c = breve.vector( -0.250000, 0, 0 ) d = breve.vector( 0, -0.100000, 0.500000 ) self.addFace( [ a, b, c ] ) self.addFace( [ a, b, d ] ) self.addFace( [ a, c, d ] ) self.addFace( [ d, c, b ] ) self.finishShape( 1.000000 ) breve.AgentShape = AgentShape class Perceptron( breve.Abstract ): def __init__( self ): breve.Abstract.__init__( self ) self.FIRING_ACTIVATION = 0 self.INPUT_INITIALIZATION = 0 self.RESTING_ACTIVATION = 0 self.inputs = breve.objectList() self.output = 0 self.threshold = 0 self.weights = breve.objectList() Perceptron.init( self ) def addWeightedInput( self, w ): '''Adds a value to the weight list, and returns it's index.''' self.weights.append( w ) self.inputs.append( self.INPUT_INITIALIZATION ) return ( breve.length( self.weights ) - 1 ) def getOutput( self ): return self.output def getThreshold( self ): return self.threshold def getWeights( self ): return self.weights def init( self ): self.RESTING_ACTIVATION = 0.000000 self.FIRING_ACTIVATION = 1.000000 self.INPUT_INITIALIZATION = 0.000000 self.reInit() def reInit( self ): self.output = 0.000000 self.inputs = [] self.weights = [] def run( self ): i = 0 activationLevel = 0 i = 0 while ( i < self.inputs ): activationLevel = ( activationLevel + ( self.inputs[ i ] * self.weights[ i ] ) ) i = ( i + 1 ) if ( activationLevel > self.threshold ): self.output = self.FIRING_ACTIVATION else: self.output = self.RESTING_ACTIVATION def setInput( self, i, f ): if ( i >= breve.length( self.inputs ) ): print '''Input number out of range.''' return else: self.inputs[ i ] = f def setInputs( self, inputList ): if ( breve.length( self.inputs ) != breve.length( inputList ) ): print '''Input mismatch.''' return else: self.inputs = inputList def setThreshold( self, newThreshold ): self.threshold = newThreshold def setWeight( self, i, f ): if ( i >= breve.length( self.inputs ) ): print '''Weight number out of range.''' return else: self.weights[ i ] = f def setWeights( self, weightList ): if ( breve.length( self.weights ) != breve.length( weightList ) ): print '''Weight mismatch.''' return else: self.weights = weightList breve.Perceptron = Perceptron # Add our newly created classes to the breve namespace breve.Jails = Jail