Как создать таймер обратного отсчета в NetLogo? - PullRequest
2 голосов
/ 28 ноября 2010

Я пытаюсь сделать игру, похожую на Frogger, в NetLogo, и мне нужно создать таймер обратного отсчета.Тем не менее, я посмотрел в Frogger и использовал те же процедуры, которые создают таймер, но он не работает.Пожалуйста, порекомендуйте.

1 Ответ

6 голосов
/ 20 января 2012

Как создать таймер обратного отсчета в NetLogo

Это общая схема реализации таймера обратного отсчета.Это относится как к обратному отсчету в реальном времени, так и к обратному отсчету времени моделирования.

  1. Реализация переменной, содержащей оставшееся время или прошедшее время.

    • Переменная обычно является глобальной переменной, если только у каждого агента нет собственного обратного отсчета.Тогда переменная будет переменной -own'd агента.

      globals [ count-down ]
      ;; or
      turtles-own [ count-down ]
      
    • Я думаю, что лучше всего отслеживать оставшееся время.Переменная обратного отсчета инициализируется с продолжительностью обратного отсчета.Это позволяет (в игре) легко реализовывать бонусы, которые увеличивают обратный отсчет, и штрафы, которые его уменьшают, просто добавляя или отбирая из оставшегося времени.Отслеживание «фактического» времени, когда истекает обратный отсчет (с использованием timer + duration или чего-то подобного), как правило, менее полезно, особенно если ваша игра может быть приостановлена.Могут возникнуть нежелательные эффекты, которые вам придется кодировать.

  2. Реализуйте процедуру для инициализации обратного отсчета.

    to setup-timer
       set count-down 30 ;; a 30 tick timer
       ;; if you have a display of the remaining time, 
       ;; you might want to initialize it here, for example:
       ask patch max-pxcor max-pycor
       [ set plabel-color white 
         set plabel count-down
       ]
    end
    ;; this example is for global count-down.
    ;; for a per-agent count-down, each agent would need
    ;; to initialize its own count-down variable
    
  3. Внедрить процедуру для уменьшения оставшегося времени.

    to decrement-timer
       set count-down count-down - 1
    end
    
  4. Внедрить процедуру, чтобы проверить, истек ли обратный отсчет.

    to-report timer-expired?
       report ( count-down <= 0 )
    end
    
  5. Реализовать способ отображения оставшегося или прошедшего времени.Например:

    • Используйте метку патча, чтобы показать время:

      to update-timer-display
         ask patch max-pxcor max-pycor [ set plabel count-down ]
      end
      
    • используйте специально определенную черепаху с формой часов, чтобы показатьвремя истекает.Примеры этого существуют в библиотеке моделей NetLogo

  6. Реализация действия, которое происходит, когда истекает таймер.

    • Этополностью зависит от вас.

    • Это может включать сброс таймера для другого обратного отсчета.

Для использованиятаймер обратного отсчета в вашей программе:

  1. При необходимости инициализируйте таймер обратного отсчета (например, когда начинается игра или раунд игры).

  2. Измените и проверьте таймер.

    • Это может быть один раз за "тик" или расчет на основе реального времени.

      1. Уменьшите обратный отсчет для любого расписания.
      2. Обновите отображение таймера, если необходимо.
      3. Проверьте таймер, чтобы увидеть, истек ли он.
      4. Действовать по истекшему таймеру.

        ;; a "once-per-tick" count-down
        decrement-timer
        update-timer-display
        if timer-expired? [ act-on-expired-timer ]
        ;; rest of the go procedure, then... 
        tick
        
        ;; a "once-per-second" count-down
        every 1 ;; this block runs only once per second
        [ decrement-timer
          update-timer-display
          if timer-expired? [ act-on-expired-timer ]
        ]
        ;; the rest of the go procedure
        tick
        

Повторяющиеся события

Есливам нужен способ вызывать повторяющиеся события каждые N тиков, вы можете просто использовать оператор mod со счетчиком ticks в своей процедуре go:

if ticks mod 30 = 0 [ perform-recurring-event ]

Вышестрока кода заставит процедуру perform-recurring-event запускаться каждый раз, когда счетчик ticks достигнет 0 или кратен 30. Другими словами, он будет запускаться каждые 30 ticks.

...