import io import BinaryTreeIO import BinaryTree type BinaryStringTree = { setLeft(_:BinaryStringTree)->Void setRight(_:BinaryStringTree)->Void clear->Void isEmpty->Boolean isLeaf->Boolean isLeftChild->Boolean isRightChild->Boolean isRoot->Boolean height->Number depth->Number getString->String getLeftChild->BinaryStringTree getRightChild->BinaryStringTree getParent->BinaryStringTree getRoot->BinaryStringTree setParent(_:BinaryStringTree)->Void ==(_:BinaryStringTree)->Boolean} //================================================ // access to standard output and input var ostream is public, readable:= io.output var istream is public, readable:= io.input // helper method to read line of text from standard input method getLine->String is confidential{ var line:String := "" var nxt := istream.next while{nxt != "\n"} do { line := line ++ nxt nxt := istream.next} return line} // plays one round of the animal game // @post @return updated binary tree of quetsions and answers // @param animalTree is the binary tree read from the file method playRound(animalTree:BinaryStringTree)->BinaryStringTree is confidential{ var answer:String := "" // goes through tree until it hits an answer // if user responds "y" to question, goes right // otherwise goes left while{!animalTree.isLeaf} do{ ostream.write("{animalTree.getString}\n") answer := getLine if(answer == "y") then {animalTree := animalTree.getRightChild} else{animalTree := animalTree.getLeftChild} } ostream.write("Were you thinking of a {animalTree.getString}?\n") var finalAnswer:String := getLine // user's answer is already in tree, return animal tree // without modifications if(finalAnswer == "y") then{ ostream.write("Great!\n") return animalTree.getRoot} // user is thinking of animal not yet in tree // prompts user to enter question & answer to specify animal // inserts new question and answer into tree and returns // modified tree else{ ostream.write("What was the animal?\n") var animal:String := getLine ostream.write("What question separates {animal} from {animalTree.getString}?\n") var question:String := getLine ostream.write("What is the correct answer for this animal?\n") var correctAnswer:String := getLine var parent:BinaryStringTree := animalTree.getParent var newTree:BinaryStringTree if(correctAnswer == "y") then{ newTree := BinaryTree.withValue(question)left(animalTree) right(BinaryTree.withValue(animal))} else{newTree := BinaryTree.withValue(question) left(BinaryTree.withValue(animal))right(animalTree)} if(answer == "y") then {parent.setRight(newTree)} else{parent.setLeft(newTree)} return newTree.getRoot} } // reads in animal tree from file & continues to play rounds while user // inputs "y" // writes updated tree to file at end of game method play->Void is public{ var animalTree:BinaryStringTree := BinaryTreeIO.readTree("animals.tree") ostream.write("Welcome to the Animals game!\n") ostream.write("Shall we play a game? (y/n)\n") var ans:String := getLine while{ans == "y"} do{ animalTree := playRound(animalTree) ostream.write("Shall we play a game?(y/n)\n") ans := getLine} ostream.write("Bye!\n") BinaryTreeIO.writeTree("animals.tree", animalTree)} play