virtual_pet
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| virtual_pet [2026/03/01 14:26] – [GUI Based Runner for Activity 4] frchris | virtual_pet [2026/03/01 15:02] (current) – [Part C] frchris | ||
|---|---|---|---|
| Line 126: | Line 126: | ||
| </ | </ | ||
| ===== Activity 4 ===== | ===== Activity 4 ===== | ||
| + | ==== Part A: Food ==== | ||
| <file java Food.java> | <file java Food.java> | ||
| /** | /** | ||
| Line 132: | Line 132: | ||
| * @author (your name) | * @author (your name) | ||
| * @version (a version number or a date) | * @version (a version number or a date) | ||
| + | | ||
| + | * A Food object is created with parameters that define the name of the food, | ||
| + | * the increase in energy level, the increase in happiness level, | ||
| + | * and the amount of weight gained if the food is consumed by a | ||
| + | * VirtualPet object. | ||
| + | | ||
| + | * The Food class provides a constructor with the following header: | ||
| + | * public Food(String name, int energyIncrease, | ||
| + | * The Food class also has accessor methods for all instance variables. | ||
| */ | */ | ||
| public class Food | public class Food | ||
| Line 140: | Line 149: | ||
| } | } | ||
| </ | </ | ||
| + | ==== Part B: Game ==== | ||
| <file java Game.java> | <file java Game.java> | ||
| /** | /** | ||
| Line 172: | Line 181: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| Line 333: | Line 343: | ||
| } | } | ||
| </ | </ | ||
| - | ==== GUI Based Runner for Activity 4 ==== | + | ==== Part C Putting it all together ==== |
| + | |||
| + | Now that we have a Game and Food class, let’s revise the VirtualPet class to include interactions with these classes. | ||
| + | - Write the class VirtualPet4. You may copy your code implementation of VirtualPet from Activity 3 but be sure to modify the class header and constructor to match the new class name. | ||
| + | |||
| + | - Modify the '' | ||
| + | |||
| + | - Modify the '' | ||
| + | |||
| + | === GUI Based Runner for Activity 4 === | ||
| - [[https:// | - [[https:// | ||
| Line 726: | Line 745: | ||
| ===== Activity 5 ===== | ===== Activity 5 ===== | ||
| - | ==== Try this GUI Runner | + | ==== Adding Your Own Features |
| - | <file java VirtualPetGUIRunner.java> | + | Copy your code from '' |
| - | /** | + | |
| - | * A GUI class to run the Virtual Pet Lab | + | |
| - | * Requires javax.swing | + | |
| - | * @author Kim Hermans | + | |
| - | * Image Credit: J.P. O'Hara & Jamie O'Hara | + | |
| - | * @November 2024 | + | |
| - | */ | + | |
| - | import java.awt.BorderLayout; | + | |
| - | import | + | |
| - | import java.awt.Dimension; | + | |
| - | import java.awt.GridBagConstraints; | + | |
| - | import java.awt.GridBagLayout; | + | |
| - | import java.awt.GridLayout; | + | |
| - | import java.awt.event.ActionEvent; | + | |
| - | import java.awt.event.ActionListener; | + | |
| - | import java.io.IOException; | + | |
| - | import java.util.concurrent.Executors; | + | |
| - | import java.util.concurrent.ScheduledExecutorService; | + | |
| - | import java.util.concurrent.TimeUnit; | + | |
| - | import javax.swing.BorderFactory; | + | |
| - | import javax.swing.Box; | + | |
| - | import javax.swing.BoxLayout; | + | |
| - | import javax.swing.ImageIcon; | + | |
| - | import javax.swing.JButton; | + | |
| - | import javax.swing.JFrame; | + | |
| - | import javax.swing.JLabel; | + | |
| - | import javax.swing.JMenu; | + | |
| - | import javax.swing.JMenuBar; | + | |
| - | import javax.swing.JMenuItem; | + | |
| - | import javax.swing.JOptionPane; | + | |
| - | import javax.swing.JPanel; | + | |
| - | import javax.swing.Timer; | + | |
| - | + | ||
| - | public class VirtualPetGUIRunner | + | |
| - | { | + | |
| - | // CHANGE THIS VARIABLE VALUE TO TEST AT A DIFFERENT SPEED | + | |
| - | private final int INTERVAL_IN_SECONDS = 10; | + | |
| - | + | ||
| - | private String info; | + | |
| - | private int timerSeconds, | + | |
| - | private boolean isEating, isPlaying; | + | |
| - | private VirtualPet pet3; | + | |
| - | private ImageIcon imageHappy, imageSad, imageEat, imagePlay; | + | |
| - | private JFrame frame; | + | |
| - | private JPanel petPanel, menuPanel, mainPanel, statsPanel, timerPanel; | + | |
| - | private JLabel petLabel, | + | |
| - | private JButton foodButton, playButton; | + | |
| - | private JMenu newPetMenu; | + | |
| - | private JMenuItem petRunner3, petRunner4; | + | |
| - | private JMenuBar menuBar; | + | |
| - | + | ||
| - | public VirtualPetGUIRunner(String name) | + | |
| - | { | + | |
| - | pet3 = new VirtualPet(name); | + | |
| - | isPlaying = isEating = false; | + | |
| - | + | ||
| - | // Automatically calls update after INTERVAL_IN_SECONDS time | + | |
| - | ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); | + | |
| - | scheduler.scheduleAtFixedRate(() -> { pet3.updateStatus(); | + | |
| - | + | ||
| - | // Calls helper methods | + | |
| - | initPetDisplayPanel(); | + | |
| - | initTimerPanel(); | + | |
| - | initStatsPanel(); | + | |
| - | initButtons(); | + | |
| - | fillLayout(); | + | |
| - | initMenuBar(); | + | |
| - | + | ||
| - | // Initializes the frame | + | |
| - | frame = new JFrame(); | + | |
| - | frame.setPreferredSize(new Dimension(350, | + | |
| - | frame.setTitle(" | + | |
| - | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | + | |
| - | + | ||
| - | // Adds all components to the frame and makes visible | + | |
| - | frame.add(mainPanel); | + | |
| - | frame.setJMenuBar(menuBar); | + | |
| - | frame.pack(); | + | |
| - | frame.setVisible(true); | + | |
| - | } | + | |
| - | + | ||
| - | // Initializes the Feed and Play buttons and the panel that contains them | + | |
| - | public void initButtons() | + | |
| - | { | + | |
| - | GridBagConstraints c = new GridBagConstraints(); | + | |
| - | + | ||
| - | foodButton = new JButton(" | + | |
| - | foodButton.addActionListener(new FoodButtonListener()); | + | |
| - | foodButton.setPreferredSize(new Dimension(80, | + | |
| - | foodButton.setMaximumSize(new Dimension(80, | + | |
| - | + | ||
| - | playButton = new JButton(" | + | |
| - | playButton.addActionListener(new PlayButtonListener()); | + | |
| - | playButton.setPreferredSize(new Dimension(80, | + | |
| - | playButton.setMaximumSize(new Dimension(80, | + | |
| - | + | ||
| - | menuPanel = new JPanel(); | + | |
| - | menuPanel.setLayout(new BoxLayout(menuPanel, | + | |
| - | menuPanel.add(Box.createVerticalStrut(50)); | + | |
| - | menuPanel.add(foodButton, | + | |
| - | menuPanel.add(Box.createVerticalStrut(10)); | + | |
| - | menuPanel.add(playButton, | + | |
| - | menuPanel.add(Box.createVerticalStrut(10)); | + | |
| - | } | + | |
| - | + | ||
| - | // Initializes the panel that contains the information text | + | |
| - | public void initStatsPanel() | + | |
| - | { | + | |
| - | info = "" | + | |
| - | statsLabel = new JLabel(info); | + | |
| - | statsLabel.setBorder(BorderFactory.createEmptyBorder(0, | + | |
| - | + | ||
| - | messageLabel = new JLabel(" | + | |
| - | messageLabel.setForeground(Color.blue); | + | |
| - | messageLabel.setBorder(BorderFactory.createEmptyBorder(0, | + | |
| - | + | ||
| - | statsPanel = new JPanel(new GridLayout(2, | + | |
| - | statsPanel.add(messageLabel); | + | |
| - | statsPanel.add(statsLabel); | + | |
| - | } | + | |
| - | + | ||
| - | // Initializes the panel that displays the VirtualPet | + | |
| - | public void initPetDisplayPanel() | + | |
| - | { | + | |
| - | imageHappy = new ImageIcon(" | + | |
| - | imageSad = new ImageIcon(" | + | |
| - | imageEat = new ImageIcon(" | + | |
| - | imagePlay = new ImageIcon(" | + | |
| - | petLabel = new JLabel(imageHappy); | + | |
| - | + | ||
| - | petPanel = new JPanel(new BorderLayout()); | + | |
| - | petPanel.add(petLabel); | + | |
| - | } | + | |
| - | + | ||
| - | // Initializes the timer that is displayed | + | |
| - | public void initTimerPanel() | + | |
| - | { | + | |
| - | timerSeconds = 0; | + | |
| - | timerLabel = new JLabel(" | + | |
| - | Timer timer = new Timer(1000, new ActionListener() { | + | |
| - | @Override | + | |
| - | public void actionPerformed(ActionEvent e) { | + | |
| - | timerSeconds++; | + | |
| - | int minutes = timerSeconds / 60; | + | |
| - | int remainingSeconds = timerSeconds % 60; | + | |
| - | timerLabel.setText(String.format(" | + | |
| - | info = "" | + | |
| - | statsLabel.setText(info); | + | |
| - | if(!isPlaying && !isEating) | + | |
| - | { | + | |
| - | if((ImageIcon)petLabel.getIcon() != imageSad && (pet3.getEnergyLevel() < 5 || pet3.getHappinessLevel() < 5)) | + | |
| - | petLabel.setIcon(imageSad); | + | |
| - | else if((ImageIcon)petLabel.getIcon() != imageHappy && (pet3.getEnergyLevel() >= 5 && pet3.getHappinessLevel() >= 5)) | + | |
| - | petLabel.setIcon(imageHappy); | + | |
| - | } | + | |
| - | } | + | |
| - | }); | + | |
| - | timer.start(); | + | |
| - | timerPanel = new JPanel(); | + | |
| - | timerPanel.add(timerLabel); | + | |
| - | timerPanel.setLayout(new GridBagLayout()); | + | |
| - | } | + | |
| - | + | ||
| - | // Initializes the Menu Bar that allows you to create | + | |
| - | public void initMenuBar() | + | |
| - | { | + | |
| - | petRunner3 = new JMenuItem(" | + | |
| - | petRunner3.addActionListener(new NewPet3Listener()); | + | |
| - | petRunner4 = new JMenuItem(" | + | |
| - | petRunner4.addActionListener(new NewPet4Listener()); | + | |
| - | newPetMenu = new JMenu(" | + | |
| - | newPetMenu.add(petRunner3); | + | |
| - | newPetMenu.add(petRunner4); | + | |
| - | menuBar = new JMenuBar(); | + | |
| - | menuBar.add(newPetMenu); | + | |
| - | } | + | |
| - | + | ||
| - | // Organizes the layout for the main panel | + | |
| - | public void fillLayout() | + | |
| - | { | + | |
| - | mainPanel = new JPanel(); | + | |
| - | mainPanel.setLayout(new GridBagLayout()); | + | |
| - | GridBagConstraints c = new GridBagConstraints(); | + | |
| - | c.fill = GridBagConstraints.BOTH; | + | |
| - | c.weightx = 60; | + | |
| - | c.weighty = 70; | + | |
| - | c.gridx = 0; | + | |
| - | c.gridy = 0; | + | |
| - | mainPanel.add(petPanel, | + | |
| - | c.weightx = 40; | + | |
| - | c.gridx = 1; | + | |
| - | mainPanel.add(menuPanel, | + | |
| - | c.weightx = 60; | + | |
| - | c.weighty = 30; | + | |
| - | c.gridx = 0; | + | |
| - | c.gridy = 1; | + | |
| - | mainPanel.add(statsPanel, | + | |
| - | c.weightx = 40; | + | |
| - | c.gridx = 1; | + | |
| - | mainPanel.add(timerPanel, | + | |
| - | } | + | |
| - | + | ||
| - | // Defines the action when the Feed button is clicked | + | |
| - | class FoodButtonListener implements ActionListener | + | |
| - | { | + | |
| - | public void actionPerformed(ActionEvent e) | + | |
| - | { | + | |
| - | pet3.feed(); | + | |
| - | messageLabel.setText(" | + | |
| - | info = "" | + | |
| - | statsLabel.setText(info); | + | |
| - | animationTimerSeconds = 0; | + | |
| - | animationTimerSeconds = 0; | + | |
| - | isEating = true; | + | |
| - | petLabel.setIcon(imageEat); | + | |
| - | // Timer to show eating image for 2 seconds | + | |
| - | Timer animationTimer = new Timer(1000, new ActionListener() { | + | |
| - | @Override | + | |
| - | public void actionPerformed(ActionEvent e) { | + | |
| - | animationTimerSeconds++; | + | |
| - | if(animationTimerSeconds >= 2) | + | |
| - | { | + | |
| - | if(pet3.getEnergyLevel() < 5 || pet3.getHappinessLevel() < 5) | + | |
| - | petLabel.setIcon(imageSad); | + | |
| - | else | + | |
| - | petLabel.setIcon(imageHappy); | + | |
| - | isEating = false; | + | |
| - | ((Timer) e.getSource()).stop(); | + | |
| - | } | + | |
| - | } | + | |
| - | }); | + | |
| - | animationTimer.start(); | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | // Defines the action when the Play button is clicked | + | |
| - | | + | |
| - | { | + | |
| - | public void actionPerformed(ActionEvent e) | + | |
| - | { | + | |
| - | pet3.play(); | + | |
| - | messageLabel.setText(" | + | |
| - | info = "" | + | |
| - | statsLabel.setText(info); | + | |
| - | animationTimerSeconds = 0; | + | |
| - | isPlaying = true; | + | |
| - | petLabel.setIcon(imagePlay); | + | |
| - | // Timer to show playing image for 2 seconds | + | |
| - | Timer animationTimer = new Timer(1000, new ActionListener() { | + | |
| - | @Override | + | |
| - | public void actionPerformed(ActionEvent e) { | + | |
| - | animationTimerSeconds++; | + | |
| - | if(animationTimerSeconds >= 2) | + | |
| - | { | + | |
| - | if(pet3.getEnergyLevel() < 5 || pet3.getHappinessLevel() < 5) | + | |
| - | petLabel.setIcon(imageSad); | + | |
| - | else | + | |
| - | petLabel.setIcon(imageHappy); | + | |
| - | isPlaying = false; | + | |
| - | ((Timer) e.getSource()).stop(); | + | |
| - | } | + | |
| - | } | + | |
| - | }); | + | |
| - | animationTimer.start(); | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | // Defines | + | |
| - | class NewPet3Listener implements ActionListener | + | |
| - | { | + | |
| - | public void actionPerformed(ActionEvent e) | + | |
| - | { | + | |
| - | try | + | |
| - | { | + | |
| - | String input = JOptionPane.showInputDialog(" | + | |
| - | VirtualPetGUIRunner init = new VirtualPetGUIRunner(input); | + | |
| - | frame.dispose(); | + | |
| - | } | + | |
| - | catch(Exception err) | + | |
| - | { | + | |
| - | System.out.println(err); | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | // Defines the action when a New Pet from Activity 4 is clicked | + | |
| - | class NewPet4Listener implements ActionListener | + | |
| - | { | + | |
| - | public void actionPerformed(ActionEvent e) | + | |
| - | { | + | |
| - | // " | + | |
| - | // VirtualPetGUIRunner4 in your project | + | |
| - | /* | + | |
| - | try | + | |
| - | { | + | |
| - | String input = JOptionPane.showInputDialog(" | + | |
| - | VirtualPetGUIRunner4 init = new VirtualPetGUIRunner4(input); | + | |
| - | frame.dispose(); | + | |
| - | } | + | |
| - | catch(Exception err) | + | |
| - | { | + | |
| - | System.out.println(err); | + | |
| - | } | + | |
| - | */ | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | public static void main(String [] args) throws IOException | + | |
| - | { | + | |
| - | String input = JOptionPane.showInputDialog(" | + | |
| - | VirtualPetGUIRunner init = new VirtualPetGUIRunner(input); | + | |
| - | } | + | |
| - | } | + | |
| - | </file> | + | |
| + | Implement two new features in your '' | ||
| + | The following are ideas for additional features, inspired by the original Tamagotchi: | ||
| + | - Your virtual pet has a hidden health level based on their energy, happiness, sickness, and cleanliness. | ||
| + | - Your virtual pet will randomly use the bathroom and will need to be cleaned. | ||
| + | - Your virtual pet will randomly get sick and need to be given medicine. | ||
| + | - Your virtual pet will notify the user if their energy level is 0, if their happiness level is 0, if they are sick, or if they used the bathroom and need to be cleaned. | ||
| + | - Create a more interactive game in the Game class for the '' | ||
virtual_pet.1772393183.txt.gz · Last modified: by frchris
