20 Questions Assignment 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…