Created
April 12, 2019 12:22
-
-
Save ssaurel/62822111d32336d390a4e03fb5333213 to your computer and use it in GitHub Desktop.
TwentyQuestions Game implementation on the SSaurel's Channel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.ssaurel.twentyquestions; | |
import java.awt.BorderLayout; | |
import java.awt.Container; | |
import java.awt.Dimension; | |
import java.awt.Toolkit; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import javax.swing.JButton; | |
import javax.swing.JFrame; | |
import javax.swing.JPanel; | |
import javax.swing.JTextPane; | |
import javax.swing.SwingUtilities; | |
import javax.swing.text.SimpleAttributeSet; | |
import javax.swing.text.StyleConstants; | |
import javax.swing.text.StyledDocument; | |
// Main class for our Twenty Questions game with a Swing UI | |
public class TwentyQuestions { | |
private Tree tree; | |
private TreeNode currentNode; | |
private JButton yesButton, noButton, restartButton; | |
private JTextPane textPane; // for displaying the question | |
private boolean started = false; | |
// btns listener | |
private ActionListener btnsListener = new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent e) { | |
Object source = e.getSource(); | |
if (source == yesButton) | |
yes(); | |
else if (source == noButton) | |
no(); | |
else if (source == restartButton) | |
restart(); | |
} | |
}; | |
public static void main(String[] args) { | |
TwentyQuestions twentyQuestions = new TwentyQuestions(); | |
twentyQuestions.tree = new Tree(); | |
twentyQuestions.tree.loadTree("/Users/ssaurel/eworkspace/TwentyQuestions/animals_questions.txt"); | |
SwingUtilities.invokeLater(new Runnable() { | |
@Override | |
public void run() { | |
twentyQuestions.buildUI(); | |
} | |
}); | |
} | |
private void buildUI() { | |
// we build the UI | |
JFrame frame = new JFrame("Twenty Questions on SSaurel"); | |
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
Container contentPane = frame.getContentPane(); | |
// add buttons | |
JPanel buttonsPanel = new JPanel(); | |
yesButton = new JButton("Yes"); | |
yesButton.addActionListener(btnsListener); | |
buttonsPanel.add(yesButton, BorderLayout.LINE_START); | |
restartButton = new JButton("Start"); | |
restartButton.addActionListener(btnsListener); | |
buttonsPanel.add(restartButton, BorderLayout.LINE_START); | |
noButton = new JButton("No"); | |
noButton.addActionListener(btnsListener); | |
buttonsPanel.add(noButton, BorderLayout.LINE_END); | |
contentPane.add(buttonsPanel, BorderLayout.PAGE_END); | |
// add text area | |
textPane = new JTextPane(); | |
textPane.setEditable(false); | |
updateText("Think to an animal, then click on Start"); | |
// we define some style for the text pane | |
SimpleAttributeSet bSet = new SimpleAttributeSet(); | |
StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER); | |
StyleConstants.setFontSize(bSet, 22); | |
StyledDocument doc = textPane.getStyledDocument(); | |
doc.setParagraphAttributes(0, doc.getLength(), bSet, false); | |
contentPane.add(textPane, BorderLayout.CENTER); | |
frame.setMinimumSize(new Dimension(500, 250)); | |
// we center the JFrame | |
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize(); | |
int coordX = (objDimension.width - frame.getWidth()) / 2; | |
int coordY = (objDimension.height - frame.getHeight()) / 2; | |
frame.setLocation(coordX, coordY); | |
// we display the window | |
frame.pack(); | |
frame.setVisible(true); | |
} | |
// we need to write code for callbacks methods yes, no and restart | |
private void yes() { | |
// we navigate in the tree by moving the current node on the yes branch | |
if (started && currentNode != null) { | |
currentNode = currentNode.yes; | |
if (currentNode != null) { | |
if (currentNode.isQuestion()) { | |
updateText(currentNode.data); | |
} else { | |
updateText("Would you think to " + currentNode.data + "?"); | |
} | |
} else { | |
updateText("I found :)"); | |
} | |
} | |
} | |
private void no() { | |
// we navigate in the tree by moving the current node on the no branch | |
if (started && currentNode != null) { | |
currentNode = currentNode.no; | |
if (currentNode != null) { | |
if (currentNode.isQuestion()) { | |
updateText(currentNode.data); | |
} else { | |
updateText("Would you think to " + currentNode.data + "?"); | |
} | |
} else { | |
updateText("I lose :("); | |
} | |
} | |
} | |
private void restart() { | |
if (started) { | |
started = false; | |
updateText("Think to an animal, then click on Start"); | |
} else { | |
started = true; | |
updateText("Think to an animal, then click on Start"); | |
currentNode = tree.root; | |
updateText(currentNode.data); | |
} | |
} | |
private void updateText(String txt) { | |
textPane.setText("\n" + txt); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment