Create: Computing AgesDoc Brass
Programmes intégrés

traffic

un cycle de feu tricolore

Tourne sur Tous Tous les ordinateurs · 20 lignes
Tapez ceci à l'invite d'un ordinateur pour le copier sur le support :
Terminal
> examples traffic
> edit traffic

Fait passer un Feu tricolore par son vrai cycle : vert, orange, rouge, puis rouge et orange ensemble avant le vert. Avec une Boucle de détection, le feu reste vert jusqu'à ce qu'un véhicule attende sur la boucle. C'est le programme de la scène Ponder du Microcontrôleur.

Quoi construire

  • Un Feu tricolore qui touche la gauche de l'ordinateur (vue face à l'écran).
  • Si vous voulez, une Boucle de détection qui touche la face droite. Elle sent les joueurs, les créatures, les wagonnets, les bateaux et les véhicules de Create Aeronautics jusqu'à deux blocs au-dessus d'elle.

Un Microcontrôleur, entraîné par le dessous, se loge bien dans un poteau au bord de la route. Sans rien à gauche, le programme s'arrête avec pas de feu tricolore à gauche.

Comment il marche

Brass
local light = peripheral.wrap("left")
local loop = peripheral.wrap("right")

Les deux blocs sont enveloppés. La boucle est facultative : quand rien n'est à droite, loop vaut nil.

Brass
light.set("green")
if loop then
  repeat sleep(0.5) until loop.detected()
end
sleep(3)

traffic_light.set() allume un aspect : "off" (éteint), "red" (rouge), "red_amber" (rouge et orange), "amber" (orange), "green" (vert) ou "flashing" (orange clignotant). Tant qu'un ordinateur pilote le feu, c'est l'ordinateur qui décide, quoi que dise la redstone (traffic_light.release() rend la main à la redstone). if loop then saute l'attente quand il n'y a pas de boucle. repeat ... until interroge la boucle deux fois par seconde jusqu'à ce que inductive_loop.detected() réponde true, puis le feu reste encore vert 3 secondes.

Brass
light.set("amber")
sleep(2)
light.set("red")
sleep(8)
light.set("red_amber")
sleep(1)

La suite du cycle : un aspect après l'autre, chacun avec sa durée. Puis while true repart sur le vert.

Idées

  • Rangez le cycle dans une table, comme dans le sequencer : facile à lire et à régler.

    Brass
    local cycle = {
      {"green", 3}, {"amber", 2}, {"red", 8}, {"red_amber", 1},
    }
    local total = 0
    for _, phase in ipairs(cycle) do
      print(phase[1], phase[2] .. " s")
      total = total + phase[2]
    end
    print("cycle : " .. total .. " s")
    Écran
    green   3 s
    amber   2 s
    red 8 s
    red_amber   1 s
    cycle : 14 s

    La boucle devient alors for _, phase in ipairs(cycle) do light.set(phase[1]) sleep(phase[2]) end.

  • Orange clignotant la nuit : light.set("flashing") quand os.day_time() dépasse 13 000.
  • Comptez les véhicules avec inductive_loop.count() et donnez un vert plus long à la route la plus chargée.
  • Un bouton pour piétons : un bouton à l'arrière qui écourte le vert.
  • Deux feux pour un carrefour, toujours opposés : la recette carrefour à feux.

Le programme

traffic
-- Contrôleur de feu : un feu tricolore à gauche, et si vous
-- voulez une boucle de détection à droite pour attendre les voitures.
local light = peripheral.wrap("left")
local loop = peripheral.wrap("right")
if light == nil then
  error("pas de feu tricolore à gauche")
end
while true do
  light.set("green")
  if loop then
    repeat sleep(0.5) until loop.detected()
  end
  sleep(3)
  light.set("amber")
  sleep(2)
  light.set("red")
  sleep(8)
  light.set("red_amber")
  sleep(1)
end