20 questions assignment intro james wei professor peck march 19, 2014 slides by james wei
TRANSCRIPT
20 QuestionsAssignment Intro
James Wei
Professor Peck
March 19, 2014
Slides by James Wei
Outline• A look at the game of 20Q• Classes of 20Q/Model-View design• Implementation• Reading a file• Building a tree• Playing the game• Adding to the tree• Saving a file
A look at 20Q• We want to create a simplified version of 20Q• Here are the features we implement:• Can play 20Q• Can create game trees from files• Can improve tree when computer loses• Can save improved game trees to files
• Sample playthrough
Classes of 20Q• The classes of 20Q:• GameMain – runs 20Q• IAnimalModel – defines the methods and
behaviors available to the model• AnimalGameModel – implements IAnimalModel• AnimalGameViewer – handles display logic• AnimalNode – represents a node on the tree• WebGameInfo – don’t worry about this one
Model-View Design• Code is split between model and view• You write the model• Know how to interact with the view• Nothing new here…
Model-View Design
Implementation -- Overview
• A few parts to this assignment:• Reading a file: initialize()• Building a tree: initialize()• Playing the game: newGame(), processYesNo()• Adding to the tree: addNewQuestion(),
addNewKnowledge()• Saving a file: write()
• Also consider while you’re coding—what instance variables do we need in the model?
Implementation -- Overview
• View methods you will need to use:• void update(String) – displays text in main pane• void showMessage(String) – displays text in
message pane• void showDialog(String) – displays a popup with
the given text• void getNewInfoLeaf() – tells view to ask for a
new tree leaf• void getDifferentiator() – tells view to ask for a
new question node
Implementation -- Overview
Implementation – File I/O• Reading a file• Need to start by building the 20Q tree from a file• Implement this method:
void initialize(Scanner)• initialize must do the following:• Use the scanner to read the file line by line• Use each line to build one node of the tree (in
preorder)• Strip the “#Q:” from each question before creating its
internal node• Call myView.setEnabled(true)• Call newGame() at the very end to start a game
Implementation – File I/O
Implementation – File I/O• Your life will be much easier if you write a
recursive helper method• Some pseudo-code to get you started:
private AnimalNode readHelper(Scanner s){
String line = s.nextLine();if (line is leaf) {
// create new leaf}// recursively create left (yes) subtree// recursively create right (no) subtree// create internal node from subtrees
}
Implementation – File I/O• Writing a file• Need to be able to save trees to file• Implement this method:
void write(FileWriter)• write must do the following:• Write one line in the file for each node using the
FileWriter write() method• Write a preorder traversal• Prepend “#Q:” for each question (internal node)• Append “\n” to the end of each line to signify new line
Implementation -- Overview
• A few parts to this assignment:• Reading a file: initialize()• Building a tree: initialize()• Playing the game: newGame(), processYesNo()• Adding to the tree: processYesNo(),
addNewQuestion(), addNewKnowledge()• Saving a file: write()
Implementation – Playing 20Q
• Playing the game• Begins when the player clicks “New Game”, or
when the player loads a file, both of which call the model method newGame()
• First implement this method:
void newGame()• newGame must do the following:• Set all instance variables to their initial state• Ask the first question
Implementation – Playing 20Q
• Playing the game• As you ask questions, the user responds with YES or
NO by clicking a button in the view—those buttons call processYesNo(boolean)
• Next implement this method:
void processYesNo(boolean)• processYesNo must do the following:
• Update the current position on the game tree according to the user’s response
• Ask the next question – remember this varies depending on if we are at an internal or a leaf!
• Display a WIN or LOSE message if game has ended• Few more things which we’ll discuss in the next part…
Implementation -- Overview
• A few parts to this assignment:• Reading a file: initialize()• Building a tree: initialize()• Playing the game: newGame(), processYesNo()• Adding to the tree: processYesNo(),
addNewQuestion(), addNewKnowledge()• Saving a file: write()
Implementation – Improving
• Improving the tree• If the computer loses, it’s time to add to our tree!• Go back and add to this method:
void processYesNo(boolean)• processYesNo must also do the following:• Ask for the answer (what were you thinking of?)• Call getNewInfoLeaf() – this will tell the view to
popup a dialog box where the user can type a response
Implementation – Improving
• Improving the tree• getNewInfoLeaf will call another model method• Implement this method:
void addNewQuestion(String)• addNewQuestion must do the following:• Display a list of all of the user’s answers up to that
point, e.g. “You answered YES to <QUESTION>, You answered NO to <QUESTION>, etc.”
• Create a new leaf node for the correct answer• Ask for a differentiator question• Call getDifferentiator()
Implementation – Improving
• Improving the tree• addNewQuestion will call the final method• Implement this method:
void addNewKnowledge(String)• addNewKnowledge must do the following:• Create a new internal node for the differentiator• Set the differentiator’s YES answer to the existing,
incorrect answer that the computer guessed, and the differentiator’s NO answer to the new, correct answer
• Add the internal node to the game tree• Start a new game
Implementation – Improving
• Example – here’s the tree before playing:
For reference ->
Implementation – Improving
• Example – here’s the tree after playing:
For reference ->
Wrapping Up• So you slept through this whole thing and now
you just want to know what to do, eh?• My recommended course of action:• Implement file I/O, aka initialize() and write()• Test by opening a file and saving it • Implement newGame() and processYesNo(),
leaving out improving the tree for now• Play the game – try winning and losing• Implement addNewQuestion() and
addNewKnowledge()• Test it – open a file, play several times (win/lose),
improve the tree, play with new tree, save file
Good luck!
I didn’t have time to find a witty tree or 20Q related cartoon…