Questions 20
<< ConsoleApplet | OtherProjectsTrailIndex | Basic Pong >>

questions.txt
-1 1 6 Is it an animal? 0 3 4 Is it a mineral? 10 -1 -1 Is it a whale? 1 -1 5 Is it a vegetable? 1 -1 -1 Is it a diamond? 3 -1 -1 Is it a rose 0 10 8 Does it have 4 legs? 8 -1 -1 Is it a dog? 6 9 7 Does it bark? 8 -1 -1 Is it a cat? 6 12 2 Does it spend most of its time in the water? 12 -1 -1 Is it a human? 10 11 13 is it a bird? 12 -1 -1 Is it a chicken?
Quesiton.java
public class Question {
private int parent;
private int noLink;
private int yesLink;
private String quest;
public Question(){
setParent(-1);
setNoLink(-1);
setYesLink(-1);
setQuest("");
}
public Question(String[] s){
setParent(Integer.parseInt(s[0]));
setNoLink(Integer.parseInt(s[1]));
setYesLink(Integer.parseInt(s[2]));
setQuest(s[3]);
}
public void setParent(int parent) {
this.parent = parent;
}
public int getParent() {
return parent;
}
public void setNoLink(int noLink) {
this.noLink = noLink;
}
public int getNoLink() {
return noLink;
}
public void setYesLink(int yesLink) {
this.yesLink = yesLink;
}
public int getYesLink() {
return yesLink;
}
public void setQuest(String quest) {
this.quest = quest;
}
public String getQuest() {
return quest;
}
public String toString(){
return parent+"\t"+noLink+"\t"+yesLink+"\t"+quest;
}
public String lastWord(){
String lastThing=quest.substring(quest.lastIndexOf(" "),quest.lastIndexOf("?"));
//lastThing=lastThing.substring(0, lastThing.length()-1);
return lastThing;
}
}
Questions20.java (The Applet version, which is not normally allowed to write files)
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.URL;
import java.util.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Questions20 extends Applet implements ActionListener
{
private ArrayList<Question> questions;
private Question currentQuestion;
private int count;
private TextArea t;
private Button yesButton,noButton, restartButton;
public void init(){
//Init the user interface objects
t=new TextArea();
t.setFont(new Font("Helvetica", Font.BOLD,20));
t.setForeground(new Color(251,182,0));
t.setBackground(new Color(44,23,0));
t.setEditable(false);
yesButton=new Button("Yes");
yesButton.addActionListener(this);
noButton=new Button("No");
noButton.addActionListener(this);
restartButton=new Button("Start Over");
restartButton.addActionListener(this);
//Add objects to Applet
this.setLayout(new BorderLayout());
this.add(t, BorderLayout.CENTER);
Panel buttonPanel=new Panel(new FlowLayout());
buttonPanel.add(yesButton);
buttonPanel.add(noButton);
buttonPanel.add(restartButton);
this.add(buttonPanel, BorderLayout.NORTH);
startOver();
}
private void startOver() {
questions=readQuestionFile();
currentQuestion=questions.get(0);
count=1;
t.append("Twenty Questions!\n1. "+currentQuestion.getQuest());
}
@Override
public void actionPerformed(ActionEvent e) {
Object buttonPressed=e.getSource();
if (buttonPressed==yesButton){
if (currentQuestion.getYesLink() <0){
//computer guessed it
t.append(" YES !!!! I Guessed it with "+count+" questions!!\n");
}else{
currentQuestion=questions.get(currentQuestion.getYesLink());
count++;
t.append(" YES\n"+count+". "+currentQuestion.getQuest());
}
} else if (buttonPressed==noButton){
if (currentQuestion.getNoLink()<0){
//Make a new Question
t.append(" NO\nAfter "+count+" questions, I have no idea! What is it?");
getInfoDialog(currentQuestion.lastWord());
}else{
currentQuestion=questions.get(currentQuestion.getNoLink());
count++;
t.append(" NO\n"+count+". "+currentQuestion.getQuest());
}
} if (buttonPressed==restartButton) {
t.setText("");
startOver();
}
}
public void writeQuestionFile(ArrayList<Question> q){
//PrintWriter outFile;
try {
//outFile = new PrintWriter("questions.txt");
File f=new File("questions.txt");
BufferedWriter out = new BufferedWriter(new FileWriter(f,false));
for (int i=0; i<q.size(); i++){
out.write(q.get(i).toString()+"\r\n");
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<Question> readQuestionFile() {
ArrayList<Question> result=new ArrayList<Question>();
try{
InputStream is=this.getClass().getResourceAsStream("questions.txt");
Scanner in = new Scanner(is);
String line = null;
while (in.hasNextLine()) {
line = in.nextLine();
result.add(new Question(line.split("\t")));
}
in.close();
} catch(Exception e){
e.printStackTrace();
}
return result;
}
public void getInfoDialog(String lastThing){
JTextField thing=new JTextField();
final JComponent[] newQ = new JComponent[] {
new JLabel("I have no idea! What is it?"),
thing
};
JOptionPane.showMessageDialog(this, newQ, "New Object Found!", JOptionPane.PLAIN_MESSAGE);
thing.requestFocusInWindow();
try{
t.append(" A "+thing.getText());
getInfoDialog(lastThing, thing.getText());
}catch( Exception exception){
t.append("\nI can't deal with this. Try again\n");
}
}
public void getInfoDialog(String lastThing, String thing){
JTextField q=new JTextField();
final JComponent[] newQ = new JComponent[] {
new JLabel("Type a yes/no question that would distinguish between a "+lastThing+" and a "+thing),
q
};
q.requestFocus();
JOptionPane.showMessageDialog(this, newQ, "Tell me about It", JOptionPane.PLAIN_MESSAGE);
q.requestFocus();
try{
confirmDialog(thing, q.getText());
}catch( Exception exception){
t.append("\nI can't deal with this. Try again\n");
}
}
public void confirmDialog(String thing, String quest){
final JComponent[] newQ = new JComponent[] {
new JLabel("And for a "+thing+", what is the answer to the question "),
new JLabel("\""+quest+"\"") ,
new JLabel("(Press CANCEL if you are unsure)")
};
int resp=JOptionPane.showConfirmDialog(this, newQ, "Tell me about It", JOptionPane.YES_NO_CANCEL_OPTION);
try{
if (resp==JOptionPane.CANCEL_OPTION) {
t.append("\nDatabase unchanged\n");
return;
}
String newQuestAnswer="y";
if (resp==JOptionPane.YES_OPTION){
t.append("\nAdding the question \""+quest+"\" \n(\"Yes\" for a "+thing+")\n");
} else if (resp==JOptionPane.NO_OPTION){
t.append("\nAdding the question \""+quest+"\" \n(\"No\" for a "+thing+")\n");
newQuestAnswer="n";
}
update(questions, currentQuestion, thing, quest, newQuestAnswer);
}catch( Exception exception){
t.append("\nI can't deal with this. Try again\n");
}
}
private void update(ArrayList<Question> list, Question currentQuestion, String thing,
String newQuest, String newQuestAnswer) {
int n=list.size(); // New Question's index
//Now have the previous question point to the question:
Question currentQuestionRoot=list.get(currentQuestion.getParent());
if (list.indexOf(currentQuestion)==currentQuestionRoot.getYesLink()){
currentQuestionRoot.setYesLink(n);
} else {
currentQuestionRoot.setNoLink(n);
}
//Make New stuff
Question q=new Question();
q.setQuest(newQuest);
q.setParent(currentQuestion.getParent());
//New Question is the parent of the thing it wasn't
currentQuestion.setParent(n);
newQuestAnswer=newQuestAnswer.toLowerCase();
if (newQuestAnswer.startsWith("y")){
q.setYesLink(n+1);
q.setNoLink(list.indexOf(currentQuestion));
} else {
q.setYesLink(list.indexOf(currentQuestion));
q.setNoLink(n+1);
}
Question t=new Question();
t.setParent(n);
t.setNoLink(-1);
t.setYesLink(-1);
t.setQuest("Is it a "+thing+"?");
list.add(q);
list.add(t);
writeQuestionFile(list);
}
}
Questions20App.java (This is the GUI Application which can update the questions.txt file)
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Questions20App extends JFrame implements ActionListener
{
private ArrayList<Question> questions;
private Question currentQuestion;
private int count;
private TextArea t;
private Button yesButton,noButton, restartButton;
public Questions20App()
{
//Init the user interface objects
t=new TextArea();
t.setFont(new Font("Helvetica", Font.BOLD,20));
t.setForeground(new Color(251,182,0));
t.setBackground(new Color(44,23,0));
t.setEditable(false);
yesButton=new Button("Yes");
yesButton.addActionListener(this);
noButton=new Button("No");
noButton.addActionListener(this);
restartButton=new Button("Start Over");
restartButton.addActionListener(this);
//Add objects to Applet
this.setLayout(new BorderLayout());
this.add(t, BorderLayout.CENTER);
Panel buttonPanel=new Panel(new FlowLayout());
buttonPanel.add(yesButton);
buttonPanel.add(noButton);
buttonPanel.add(restartButton);
this.add(buttonPanel, BorderLayout.NORTH);
startOver();
setSize(800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void startOver() {
questions=readQuestionFile();
currentQuestion=questions.get(0);
count=1;
t.append("Twenty Questions!\n1. "+currentQuestion.getQuest());
}
@Override
public void actionPerformed(ActionEvent e) {
Object buttonPressed=e.getSource();
if (buttonPressed==yesButton){
if (currentQuestion.getYesLink() <0){
//computer guessed it
t.append(" YES !!!! I Guessed it with "+count+" questions!!\n");
}else{
currentQuestion=questions.get(currentQuestion.getYesLink());
count++;
t.append(" YES\n"+count+". "+currentQuestion.getQuest());
}
} else if (buttonPressed==noButton){
if (currentQuestion.getNoLink()<0){
//Make a new Question
t.append(" NO\nAfter "+count+" questions, I have no idea! What is it?");
getInfoDialog(currentQuestion.lastWord());
}else{
currentQuestion=questions.get(currentQuestion.getNoLink());
count++;
t.append(" NO\n"+count+". "+currentQuestion.getQuest());
}
} if (buttonPressed==restartButton) {
t.setText("");
startOver();
}
}
public void writeQuestionFile(ArrayList<Question> q){
//PrintWriter outFile;
try {
//outFile = new PrintWriter("questions.txt");
File f=new File("questions.txt");
BufferedWriter out = new BufferedWriter(new FileWriter(f,false));
for (int i=0; i<q.size(); i++){
out.write(q.get(i).toString()+"\r\n");
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<Question> readQuestionFile() {
ArrayList<Question> result=new ArrayList<Question>();
try{
InputStream is=this.getClass().getResourceAsStream("questions.txt");
Scanner in = new Scanner(is);
String line = null;
while (in.hasNextLine()) {
line = in.nextLine();
result.add(new Question(line.split("\t")));
}
in.close();
} catch(Exception e){
e.printStackTrace();
}
return result;
}
public void getInfoDialog(String lastThing){
JTextField thing=new JTextField();
final JComponent[] newQ = new JComponent[] {
new JLabel("I have no idea! What is it?"),
thing
};
JOptionPane.showMessageDialog(this, newQ, "New Object Found!", JOptionPane.PLAIN_MESSAGE);
thing.requestFocusInWindow();
try{
t.append(" A "+thing.getText());
getInfoDialog(lastThing, thing.getText());
}catch( Exception exception){
t.append("\nI can't deal with this. Try again\n");
}
}
public void getInfoDialog(String lastThing, String thing){
JTextField q=new JTextField();
final JComponent[] newQ = new JComponent[] {
new JLabel("Type a yes/no question that would distinguish between a "+lastThing+" and a "+thing),
q
};
q.requestFocus();
JOptionPane.showMessageDialog(this, newQ, "Tell me about It", JOptionPane.PLAIN_MESSAGE);
q.requestFocus();
try{
confirmDialog(thing, q.getText());
}catch( Exception exception){
t.append("\nI can't deal with this. Try again\n");
}
}
public void confirmDialog(String thing, String quest){
final JComponent[] newQ = new JComponent[] {
new JLabel("And for a "+thing+", what is the answer to the question "),
new JLabel("\""+quest+"\"") ,
new JLabel("(Press CANCEL if you are unsure)")
};
int resp=JOptionPane.showConfirmDialog(this, newQ, "Tell me about It", JOptionPane.YES_NO_CANCEL_OPTION);
try{
if (resp==JOptionPane.CANCEL_OPTION) {
t.append("\nDatabase unchanged\n");
return;
}
String newQuestAnswer="y";
if (resp==JOptionPane.YES_OPTION){
t.append("\nAdding the question \""+quest+"\" \n(\"Yes\" for a "+thing+")\n");
} else if (resp==JOptionPane.NO_OPTION){
t.append("\nAdding the question \""+quest+"\" \n(\"No\" for a "+thing+")\n");
newQuestAnswer="n";
}
update(questions, currentQuestion, thing, quest, newQuestAnswer);
}catch( Exception exception){
t.append("\nI can't deal with this. Try again\n");
}
}
private void update(ArrayList<Question> list, Question currentQuestion, String thing,
String newQuest, String newQuestAnswer) {
int n=list.size(); // New Question's index
//Now have the previous question point to the question:
Question currentQuestionRoot=list.get(currentQuestion.getParent());
if (list.indexOf(currentQuestion)==currentQuestionRoot.getYesLink()){
currentQuestionRoot.setYesLink(n);
} else {
currentQuestionRoot.setNoLink(n);
}
//Make New stuff
Question q=new Question();
q.setQuest(newQuest);
q.setParent(currentQuestion.getParent());
//New Question is the parent of the thing it wasn't
currentQuestion.setParent(n);
newQuestAnswer=newQuestAnswer.toLowerCase();
if (newQuestAnswer.startsWith("y")){
q.setYesLink(n+1);
q.setNoLink(list.indexOf(currentQuestion));
} else {
q.setYesLink(list.indexOf(currentQuestion));
q.setNoLink(n+1);
}
Question t=new Question();
t.setParent(n);
t.setNoLink(-1);
t.setYesLink(-1);
t.setQuest("Is it a "+thing+"?");
list.add(q);
list.add(t);
writeQuestionFile(list);
}
public static void main(String[] args)
{
Questions20App app= new Questions20App();
app.setVisible(true);
}
}
