/** * The details of how knock-knock jokes work. * * @author Matt Boutell, taken directly from The Java Tutorial, java.sun.com. * Created Oct 15, 2006. */ public class KnockKnockProtocol { private static final int WAITING = 0; private static final int SENTKNOCKKNOCK = 1; private static final int SENTCLUE = 2; private static final int ANOTHER = 3; private static final int NUMJOKES = 5; private int state = WAITING; private int currentJoke = 0; private String[] clues = { "Turnip", "Little Old Lady", "Atch", "Who", "Who" }; private String[] answers = { "Turnip the heat, it's cold in here!", "I didn't know you could yodel!", "Bless you!", "Is there an owl in here?", "Is there an echo in here?" }; /** * Generates knock-knock output, given a client's input. * * @param theInput Input from the user. * @return The next line of the knock-knock joke. */ public String processInput(String theInput) { String theOutput = null; if (this.state == WAITING) { theOutput = "Knock! Knock!"; this.state = SENTKNOCKKNOCK; } else if (this.state == SENTKNOCKKNOCK) { if (theInput.equalsIgnoreCase("Who's there?")) { theOutput = this.clues[this.currentJoke]; this.state = SENTCLUE; } else { theOutput = "You're supposed to say \"Who's there?\"! " + "Try again. Knock! Knock!"; } } else if (this.state == SENTCLUE) { if (theInput.equalsIgnoreCase(this.clues[this.currentJoke] + " who?")) { theOutput = this.answers[this.currentJoke] + " Want another? (y/n)"; this.state = ANOTHER; } else { theOutput = "You're supposed to say \"" + this.clues[this.currentJoke] + " who?\"" + "! Try again. Knock! Knock!"; this.state = SENTKNOCKKNOCK; } } else if (this.state == ANOTHER) { if (theInput.equalsIgnoreCase("y")) { theOutput = "Knock! Knock!"; if (this.currentJoke == (NUMJOKES - 1)) this.currentJoke = 0; else this.currentJoke++; this.state = SENTKNOCKKNOCK; } else { theOutput = "Bye."; this.state = WAITING; } } return theOutput; } }