############################################################################# # SMART CORNER # # # # This robot demonstrates the ability to learn over a match. This robot # # changes its behavior from one game to the next depending upon how it did # # in the previous game. An even smarter robot might modify its behavior by # # tracking all of the games it has played in during a match. There are many # # other statistical functions available that this robot does not even use! # # # ############################################################################# Init { Name( "Smart Corner" ) # Figure out how many robots are in the game! GetOthers( ) others = result # Set detection section to "Travel Mode" RegDtcRobot( TrvFoundRobot, 1 ) RegCore( MyCore ) RegAScan( AutoScan, 3 ) Gosub( GoCorner ) # Don't want to shot cookies on our way to the # corner so register the detection handler here RegDtcCookie( FoundCookie, 2 ) } MyCore { Scan() GunLeft( guninc ) } GoCorner { LockAll( ON ) # Go to the corner determined by our stored value. # Will always be upper left for first game of match. # Hitting a wall will stop the robot, but causes no damage BodyRight( corner ) Ahead( 400 ) BodyLeft( 90 ) Ahead( 400 ) # Change robot detection section to "Corner Mode" RegDtcRobot( CrnFoundRobot, 1 ) LockAll( OFF ) LockGun( ON ) GunLeft( 90 ) # Calculate the "ends" of the robot's radar sweep gun_start = gunaim if( gunaim == 0 ) gun_end = 270 else gun_end = gunaim - 90 endif # Registering event may seem a bit over-kill. This could be # done with if statements in MyCore, but this is more interesting! # Notice that having two events with the same priority produces # unknow results only when it is possible for both events to occur # at the same time. RegCustom( GunAtStart, 3, gunaim == gun_start ) RegCustom( GunAtEnd, 3, gunaim == gun_end ) } GunAtStart { # Event is called when we hit gun_start. # scan() now so we check along the gun_start angle. Scan() # Since we used == in our events above, the guninc value # must causes us to hit gun_start and gun_end exactly! guninc = 3 # If we don't change our gunaim, this event will never end! GunLeft( 3 ) } GunAtEnd { Scan() guninc = -3 GunRight( 3 ) } AutoScan { Scan( ) } # This section is used while sitting in a corner # If another robot is detected fire until we don't see it. CrnFoundRobot { Gosub( Fire ) Scan( ) } # This section is used while traveling to a corner # If another robot is detected, stop, fire until gone, # then finish moving to the wall TrvFoundRobot { # Calling stop may times does not over-write continue info. stop( ) Gosub( Fire ) Scan( ) if( dtcrobot == 0 ) # Since the command moves us all the way to the wall, # we will not be able to detect another robot. Check # out the blocking() command for a better solution. Continue( ) endif } FoundCookie { Fire( 1 ) } Fire { if( scandist > 200 OR energy < 15 ) Fire( 1 ) elseif( scandist > 100 ) Fire( 3 ) elseif( scandist > 50 ) Fire( 5 ) else( ) Fire( 7 ) endif } Dead { GetOthers( ) # Lets see how we did. This allows the robot to adapt # to its enemies. If we were not in the top 75 percent, # switch to another corner. The first if() is needed to prevent # division by zero when we are the only player in a game. if( others ) if( (others - result) / others < 0.75 ) corner = corner + 90 if( corner == 270 ) corner = -90 endif endif endif Store( corner ) }