Untitled
unknown
plain_text
a year ago
7.7 kB
5
Indexable
package com.mycompany.memorytest; import javax.swing.*; import javax.sound.sampled.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.text.SimpleDateFormat; import java.io.File; import java.io.IOException; public class MemoryTestApp extends JFrame { private final JPanel testArea; private ArrayList<Integer> numbers; private final ArrayList<JLabel> numberLabels; private final Map<JLabel, Integer> labelNumberMap; private int currentNumberIndex; private final JLabel timeLabel; private final JLabel dateTimeLabel; private final javax.swing.Timer timer; private long startTime; private final int numberCount = 9; // Default count 9 public MemoryTestApp() { setTitle("Memory Test Application"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); testArea = new JPanel(); testArea.setLayout(new GridLayout(10, 10, 2, 2)); // 10x10 grid with 2px gaps add(testArea, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JButton newTestButton = new JButton("New Test"); newTestButton.addActionListener((ActionEvent e) -> { playSound("click.wav"); startNewTest(); }); buttonPanel.add(newTestButton); JButton hintButton = new JButton("Hint"); hintButton.addActionListener((var e) -> { playSound("click.wav"); showHint(); }); buttonPanel.add(hintButton); add(buttonPanel, BorderLayout.SOUTH); timeLabel = new JLabel("Time: 0 seconds"); dateTimeLabel = new JLabel(); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.add(timeLabel, BorderLayout.WEST); topPanel.add(dateTimeLabel, BorderLayout.EAST); add(topPanel, BorderLayout.NORTH); javax.swing.Timer dateTimeTimer = new javax.swing.Timer(1000, e -> { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateTimeLabel.setText(sdf.format(new Date())); }); dateTimeTimer.start(); numbers = new ArrayList<>(); numberLabels = new ArrayList<>(); labelNumberMap = new HashMap<>(); currentNumberIndex = 0; timer = new javax.swing.Timer(1000, e -> { long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; timeLabel.setText("Time: " + elapsedTime + " seconds"); }); } private void startNewTest() { numbers.clear(); numberLabels.clear(); labelNumberMap.clear(); testArea.removeAll(); currentNumberIndex = 0; // Default range 1-9 int numberRange = 9; for (int i = 1; i <= numberRange; i++) { numbers.add(i); } Collections.shuffle(numbers); numbers = new ArrayList<>(numbers.subList(0, numberCount)); JLabel[] allLabels = new JLabel[100]; for (int i = 0; i < 100; i++) { JLabel emptyLabel = new JLabel(); emptyLabel.setSize(50, 50); emptyLabel.setOpaque(true); emptyLabel.setBackground(Color.LIGHT_GRAY); emptyLabel.setHorizontalAlignment(SwingConstants.CENTER); emptyLabel.setVerticalAlignment(SwingConstants.CENTER); emptyLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); allLabels[i] = emptyLabel; testArea.add(emptyLabel); } Random random = new Random(); for (int i = 0; i < numberCount; i++) { int randomIndex; do { randomIndex = random.nextInt(100); } while (labelNumberMap.containsKey(allLabels[randomIndex])); JLabel numberLabel = allLabels[randomIndex]; numberLabel.setText(String.valueOf(numbers.get(i))); numberLabel.setBackground(Color.YELLOW); numberLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { handleBlockClick(numberLabel); } @Override public void mouseEntered(MouseEvent e) { numberLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } @Override public void mouseExited(MouseEvent e) { numberLabel.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } }); numberLabels.add(numberLabel); labelNumberMap.put(numberLabel, numbers.get(i)); } startTime = System.currentTimeMillis(); timer.start(); testArea.repaint(); } private void handleBlockClick(JLabel numberLabel) { if (numberLabel.isVisible()) { int clickedNumber = labelNumberMap.get(numberLabel); playSound("click.wav"); if (clickedNumber == currentNumberIndex + 1) { currentNumberIndex++; if (clickedNumber == 1) { for (JLabel label : numberLabels) { if (label != numberLabel) { label.setText(""); } } } numberLabel.setVisible(false); if (currentNumberIndex == numberCount) { timer.stop(); playSound("congrats.wav"); long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; JOptionPane.showMessageDialog(null, "Congratulations! You've completed the test in " + elapsedTime + " seconds!"); } } else { playSound("sad.wav"); numberLabel.setBackground(Color.RED); JOptionPane.showMessageDialog(null, "Sorry! You pressed the wrong number. Try again."); startNewTest(); } } } private void showHint() { if (currentNumberIndex < numberCount) { JLabel nextLabel = null; for (Map.Entry<JLabel, Integer> entry : labelNumberMap.entrySet()) { if (entry.getValue() == currentNumberIndex + 1) { nextLabel = entry.getKey(); break; } } if (nextLabel != null) { final JLabel finalNextLabel = nextLabel; finalNextLabel.setText(labelNumberMap.get(finalNextLabel).toString()); javax.swing.Timer t = new javax.swing.Timer(3000, (ActionEvent e1) -> finalNextLabel.setText("")); t.setRepeats(false); t.start(); } } } private void playSound(String soundFileName) { try { File soundFile = new File(soundFileName); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile); Clip clip = AudioSystem.getClip(); clip.open(audioInputStream); clip.start(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { e.printStackTrace(); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { MemoryTestApp app = new MemoryTestApp(); app.setVisible(true); }); } }
Editor is loading...
Leave a Comment