На рисунке справа приведен граф переходов состояний конечного автомата. Овалами обозначены состояния автомата, а стрелкой — единственная команда, соответствующая переключению светофора. Функция выходов автомата сопоставляет каждому состоянию цвет лампы, которая загорается, когда автомат переходит в данное состояние.
Слева представлены собственно светофор и кнопка, щелчок на которой переводит светофор в состояние согласно графу переходов.
<div class="svetofor" id="red"></div> <div class="svetofor" id="yellow"></div> <div class="svetofor" id="green"></div> <button onclick="auto.input('com')">Переключить<br> светофор</button>
/* "com" - команда переключения светофора "red","yellow1","yellow2","green" - состояния автомата */ var trans=[]; // массив переходов состояний автомата trans['red']=[]; trans['red']["com"]="yellow1"; trans['yellow1']=[]; trans["yellow1"]["com"]="green"; trans['yellow2']=[]; trans["yellow2"]["com"]="red"; trans['green']=[]; trans["green"]["com"]="yellow2"; /*********************************************************/ var out=[]; // массив выходов автоамата содержит функции назначения цвета элементам светофора out["red"]=function() { document.getElementById("red").style.background="#ff0000"; document.getElementById("yellow").style.background="#606000"; document.getElementById("green").style.background="#006000"; } out["yellow1"]=function() { document.getElementById("yellow").style.background="#ffff00"; document.getElementById("red").style.background="#600000"; document.getElementById("green").style.background="#006000"; } out["yellow2"]=function() { document.getElementById("yellow").style.background="#ffff00"; document.getElementById("red").style.background="#600000"; document.getElementById("green").style.background="#006000"; } out["green"]=function() { document.getElementById("yellow").style.background="#606000"; document.getElementById("red").style.background="#600000"; document.getElementById("green").style.background="#00ff00"; }
function automat(trans,out,stat){ // движок автомата Мура this.trans=trans; // массив переходов this.out=out; // массив выходов this.stat=stat; // текущее состояние this.input=function(inp){ // ввод команд if (inp&&this.trans[this.stat][inp]){ this.stat=this.trans[this.stat][inp]; this.output=out[this.stat]; // выход this.output() // вычисление выхода } return this.stat } this.output=out[this.stat];// выход }
var auto=new automat(trans,out,"red");