diff --git a/src/robotwar/core.clj b/src/robotwar/core.clj index b287af1..d00e4b9 100644 --- a/src/robotwar/core.clj +++ b/src/robotwar/core.clj @@ -12,7 +12,7 @@ (def progs - (repeat 3 (:mover source-programs/programs))) + (repeat 3 (:mover source-programs/dev-programs))) (def world (world/init-world progs)) (defn combined-worlds [] diff --git a/src/robotwar/source_programs.clj b/src/robotwar/source_programs.clj index bf6c0b0..a305981 100644 --- a/src/robotwar/source_programs.clj +++ b/src/robotwar/source_programs.clj @@ -1,137 +1,156 @@ (ns robotwar.source-programs) (def programs - {:multi-use - " START - 0 TO A - TEST - IF A > 2 GOTO START - GOSUB INCREMENT - GOTO TEST - 100 TO A - INCREMENT - A + 1 TO A - ENDSUB - 200 TO A " + { + :speedy + " + 140 TO SPEEDX + 250 TO SPEEDY + " - :index-data - ; to test the INDEX/DATA pair of registers - " 300 TO A - 1 TO INDEX - DATA TO B" + :mover + " + ; Note: # means != - :random - ; to test the RANDOM register - " 1000 TO RANDOM - RANDOM TO A - RANDOM TO A - RANDOM TO A - RANDOM TO A - RANDOM TO A " + 360 TO RANDOM + RANDOM TO AIM ; Set a random direction to aim the gun + + 256 TO RANDOM ; All random numbers will now have as their maximum + ; the width and height of the arena (in meters). + + LOOP + 0 TO SPEEDX ; STOP THE ROBOT! + 0 TO SPEEDY + RANDOM TO A ; Store a random X-coordinate in the arena. + RANDOM TO B ; Store a random Y-coordinate in the arena. + + MOVE + AIM + 5 TO AIM + IF A # X GOSUB MOVEX ; If we're moving in the X direction, recalibrate SPEEDX. + TO N ; N is for no-op. (needed because there's no ELSE command). + IF B # Y GOSUB MOVEY ; If we're moving in the Y direction, recalibrate SPEEDY. + IF A = X GOTO LOOP ; A = X and B = Y, so we've stopped moving, so start over. + GOTO MOVE ; Continue to move. + + MOVEX + A - X TO SPEEDX ; Take distance from destination in meters and use + ; it to set SPEEDX, which is measured in decimeters/second. + ENDSUB + + MOVEY + B - Y TO SPEEDY ; Take distance from destination in meters and use + ; it to set SPEEDY, which is measured in decimeters/second. + ENDSUB + " - :speedy - " 140 TO SPEEDX - 250 TO SPEEDY " - - :mover - " - ; Note: # means != - - 360 TO RANDOM - RANDOM TO AIM ; Set a random direction to aim the gun - - 256 TO RANDOM ; All random numbers will now have as their maximum - ; the width and height of the arena (in meters). + :left-shooter + " + ; Note: # means != - LOOP - 0 TO SPEEDX ; STOP THE ROBOT! - 0 TO SPEEDY - RANDOM TO A ; Store a random X-coordinate in the arena. - RANDOM TO B ; Store a random Y-coordinate in the arena. + 90 TO AIM ; Set the gun to shoot right - MOVE - AIM + 5 TO AIM - IF A # X GOSUB MOVEX ; If we're moving in the X direction, recalibrate SPEEDX. - TO N ; N is for no-op. (needed because there's no ELSE command). - IF B # Y GOSUB MOVEY ; If we're moving in the Y direction, recalibrate SPEEDY. - IF A = X GOTO LOOP ; A = X and B = Y, so we've stopped moving, so start over. - GOTO MOVE ; Continue to move. - - MOVEX - A - X TO SPEEDX ; Take distance from destination in meters and use - ; it to set SPEEDX, which is measured in decimeters/second. - ENDSUB + 15 TO A ; Set the coordinates for the left side. + 128 TO B + + MOVE + IF A # X GOSUB MOVEX ; If we're moving in the X direction, recalibrate SPEEDX. + TO N ; N is for no-op. (needed because there's no ELSE command). + IF B # Y GOSUB MOVEY ; If we're moving in the Y direction, recalibrate SPEEDY. + IF A = X GOTO SHOOT ; A = X and B = Y, so we've stopped moving, so shoot. + GOTO MOVE ; Continue to move. + + MOVEX + A - X TO SPEEDX ; Take distance from destination in meters and use + ; it to set SPEEDX, which is measured in decimeters/second. + ENDSUB + + MOVEY + B - Y TO SPEEDY ; Take distance from destination in meters and use + ; it to set SPEEDY, which is measured in decimeters/second. + ENDSUB + + SHOOT + 200 TO SHOT + GOTO MOVE + " - MOVEY - B - Y TO SPEEDY ; Take distance from destination in meters and use - ; it to set SPEEDY, which is measured in decimeters/second. - ENDSUB " + :top-shooter + " + ; Note: # means != + + 180 TO AIM ; Set the gun to shoot down + + 128 TO A ; Set the coordinates for the top. + 15 TO B + + MOVE + IF A # X GOSUB MOVEX ; If we're moving in the X direction, recalibrate SPEEDX. + TO N ; N is for no-op. (needed because there's no ELSE command). + IF B # Y GOSUB MOVEY ; If we're moving in the Y direction, recalibrate SPEEDY. + IF A = X GOTO SHOOT ; A = X and B = Y, so we've stopped moving, so shoot. + GOTO MOVE ; Continue to move. + + MOVEX + A - X TO SPEEDX ; Take distance from destination in meters and use + ; it to set SPEEDX, which is measured in decimeters/second. + ENDSUB + + MOVEY + B - Y TO SPEEDY ; Take distance from destination in meters and use + ; it to set SPEEDY, which is measured in decimeters/second. + ENDSUB + + SHOOT + 200 TO SHOT + GOTO MOVE + " + + :shooter + " + 90 TO AIM + 200 - Y TO S + SHOOT + S TO SHOT + GOTO SHOOT + " +}) - :left-shooter - " - ; Note: # means != - - 90 TO AIM ; Set the gun to shoot right - - 15 TO A ; Set the coordinates for the left side. - 128 TO B +(def dev-programs + (merge + programs + { + :multi-use + " + START + 0 TO A + TEST + IF A > 2 GOTO START + GOSUB INCREMENT + GOTO TEST + 100 TO A + INCREMENT + A + 1 TO A + ENDSUB + 200 TO A + " - MOVE - IF A # X GOSUB MOVEX ; If we're moving in the X direction, recalibrate SPEEDX. - TO N ; N is for no-op. (needed because there's no ELSE command). - IF B # Y GOSUB MOVEY ; If we're moving in the Y direction, recalibrate SPEEDY. - IF A = X GOTO SHOOT ; A = X and B = Y, so we've stopped moving, so shoot. - GOTO MOVE ; Continue to move. - - MOVEX - A - X TO SPEEDX ; Take distance from destination in meters and use - ; it to set SPEEDX, which is measured in decimeters/second. - ENDSUB + :index-data + ; to test the INDEX/DATA pair of registers + " + 300 TO A + 1 TO INDEX + DATA TO B + " - MOVEY - B - Y TO SPEEDY ; Take distance from destination in meters and use - ; it to set SPEEDY, which is measured in decimeters/second. - ENDSUB + :random + ; to test the RANDOM register + " + 1000 TO RANDOM + RANDOM TO A + RANDOM TO A + RANDOM TO A + RANDOM TO A + RANDOM TO A + " - SHOOT - 200 TO SHOT - GOTO MOVE " - - :top-shooter - " - ; Note: # means != - - 180 TO AIM ; Set the gun to shoot down - - 128 TO A ; Set the coordinates for the top. - 15 TO B - - MOVE - IF A # X GOSUB MOVEX ; If we're moving in the X direction, recalibrate SPEEDX. - TO N ; N is for no-op. (needed because there's no ELSE command). - IF B # Y GOSUB MOVEY ; If we're moving in the Y direction, recalibrate SPEEDY. - IF A = X GOTO SHOOT ; A = X and B = Y, so we've stopped moving, so shoot. - GOTO MOVE ; Continue to move. - - MOVEX - A - X TO SPEEDX ; Take distance from destination in meters and use - ; it to set SPEEDX, which is measured in decimeters/second. - ENDSUB - - MOVEY - B - Y TO SPEEDY ; Take distance from destination in meters and use - ; it to set SPEEDY, which is measured in decimeters/second. - ENDSUB - - SHOOT - 200 TO SHOT - GOTO MOVE " - - :shooter - " - 90 TO AIM - 200 - Y TO S - SHOOT - S TO SHOT - GOTO SHOOT " - }) +})) diff --git a/test/robotwar/brain_test.clj b/test/robotwar/brain_test.clj index 6c35b2b..2a7776b 100644 --- a/test/robotwar/brain_test.clj +++ b/test/robotwar/brain_test.clj @@ -7,7 +7,7 @@ [robotwar.source-programs :as source-programs])) (def initial-world - (world/init-world [(:multi-use source-programs/programs)])) + (world/init-world [(:multi-use source-programs/dev-programs)])) (def combined-worlds (world/build-combined-worlds initial-world))