docs: def step(self, viewer=None):
          "This method evolves one step in time"
          if not self.is_completed(self.state):
              for agent in self.agents:
                  action = agent.program(self.percept(agent, self.state))
                  next_state = self.do_action(self.state, action, agent)
                  if viewer:
                      viewer.event(self.state, action, next_state, agent)
                  self.state = next_state
                  if self.is_completed(self.state):
                      return