The goal of the game is to define a strategy such that the particles collect all objectives and reach the exit, without colliding with walls or each other; as fast as possible.
A particle is a little moving thing that follows a strategy. If two particles touch, they both perish. If a particle touches a wall, it perishes.
A strategy defines the behavior of the particle, based on the position of other particles, its own position and velocity, the positions of exits, objectives, the pointer, and walls.
Particles have to reach the exit to successfully complete the level. The exit will only open once all objectives are collected. If a particle touches a closed exit, it perishes.
Objectives are little things that have to be collected by particles. When each objective was reached by a particle, the exits will open.
Walls are obstacles. If a particle touches a wall, it perishes.
The pointer is controlled by your finger/mouse and can be used as part of the strategy to guide the particles.
The goal is to bring all particles to the exit, as fast as possible, using an autonomous strategy.
The score of a round is how many percent of particles successfully made it to the exit. For each high score, the round time is also recorded.
The time of a round is measured from the start until there are no more particles (i.e. they all exited or perished). For each fastest time, the score of the round is also recorded.
Strategies are composed of blocks.
Each block produces a value from the blocks it contains and passes that value to the enclosing block. Double-tap a block to clone it.
The values that are produced by blocks can be of three different types: numbers, vectors (two-dimensional), and booleans. Numbers are values such as 1.23 or -567 and can represent distances, scale factors, etc.. Vectors are pairs of numbers such as (1.2, 3.4) and can represent positions, velocities, forces, etc.. Booleans can only either be True or False.
The library contains all available blocks. Drag and drop a block from the library into your strategy.
Name | Description | Pseudo code |
|---|---|---|
Add | Adds two numbers. | |
Subtract | Subtracts the second number from the first number. | |
Multiply | For numbers, this acts as multiplication and for vectors it acts as the dot product. | |
Scale | Scale the vector by the number. | |
Exponentiate | Raise the magnitude (norm) of the first number or vector to the power of the second number. The sign/direction is not changed. | |
And | Logical and between two booleans. | |
Or | Logical or between two booleans. | |
Not | Logical not of a boolean. | |
Less than | Whether or not the first number is smaller than the second one. | |
Greater than | Whether or not the first number is greater than the second one. | |
Minimum | Take the value with smaller magnitude. | | Maximum | Take the value with larger magnitude. | |
Norm | The 'length' of a vector. | |
Rotate | Rotate the vector by the number (interpreted as degrees), counter-clockwise. | |
Null Vector | A vector with magnitude zero. | |
Constant | A constant number that can be entered. | |
Def ... Var | Define the variable to have the value produced by the first block and then evaluate the second block (which can use that variable). | |
Get ... Var | The value of the variable. | |
Velocity | The velocity of the particle for which the strategy is evaluated. | |
If / Else | If the value of the first block is True, use the value of the second block, else use the value of the third block. | |
Aggregate | This block makes it possible to obtain the position of the current particle, relative to other objects. The variable will be defined as the vector that goes from the current particle to the selected type of object (e.g. another particle, an objective, etc.). The block will be evaluated for each other object of the selected type and aggregated according to the selected method. | |
Section | This block just propagates the value it contains. The value of this block is the free-form text that can be added and the ability to collapse the entire block. This can be useful to organize the logic more clearly. | |
The clipboard contains three slots. If a block is dropped into a slot it is stored there and can be retrieved as often as you want. This is useful to duplicate blocks or move them over long distances.