// Robert Bradshaw 11/98import java.awt.*;public class TuringMachine {    TuringTape tape;  private int state;  private TuringRule[] rules;    public TuringMachine(String tapeS, String rulesS) {    this(tapeS, 0, rulesS);  }  public TuringMachine(String tapeS, int index, String rulesS) {    tape=new TuringTape(tapeS, index);    rules=TuringRule.parseRules(rulesS);  }    public int step() {    int i;    for(i=0; i<rules.length; i++) {      if (rules[i].apply(this)) break;    }    //System.out.println(this);    if (i==rules.length) return -1;    else return i;  }    public int getState() { return state; }  public void setState(int s) { state=s; }  public TuringTape getTape() { return tape; }   public void setTape(TuringTape t) { tape=t; }  public TuringRule getRule(int i) { return rules[i]; }  public void setRules(TuringRule[] rules) {this.rules=rules; }  public TuringRule[] getRules() { return rules; }    public void draw(Graphics g, Rectangle r) {    g.setColor(Color.white);    g.fillRect(r.x, r.y+10, r.width, 20);    g.setColor(Color.black);    g.drawRect(r.x, r.y+10, r.width, 20);    g.drawRect(r.x+r.width/2-10, r.y+9, 20, 22);    g.drawRect(r.x+r.width/2-11, r.y+8, 22, 24);    g.drawString(""+state, r.x+r.width/2-3, r.y+45);    int sideLen=r.width/30;    char[] tapeData=tape.getData(-sideLen,sideLen);    for(int i=-sideLen; i<sideLen; i++) {      g.drawChars(tapeData, i+sideLen, 1, r.x+r.width/2+15*i-3, r.y+24);    }  }    public String toString() {    return toString(79);   // edited 4/2006  }    // added 4/2006  String spaces;     public String toString(int size) {    int tapeSize = (size - 10)/2;    if (spaces==null || spaces.length() < tapeSize) {      char[] cs = new char[tapeSize];      java.util.Arrays.fill(cs, ' ');      spaces = new String(cs);    }    return tape.toString(tapeSize)+"  State: "+state+"\n"+spaces.substring(0, tapeSize)+"^";  }  }