Table of Contents

Virtual Pet

Example of a Virtual Pet

Activity 3

VirtualPet.java
public class VirtualPet
{
  /* 
   * Activity 3
   * @author (your name)
   * @version (a version number or a date)
   * 
   * enter code for instance variables, constructor, 
   * getName, and toString methods
   * 
   **/
  public VirtualPet(String str)
  {
 
  }
  public String getName(){
      return "";
  }
}
VirtualPetRunner.java
import java.util.Scanner;
 
//Activity 3
 
/* remove comment for part C
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
*/
 
public class VirtualPetRunner
{
// Prints menu and returns user choice
 public static int getChoice(Scanner input)
 {
   int selection = 0;
   while (selection < 1 || selection > 4)
   {
     System.out.println("------Virtual Pet Menu------");
     System.out.println("1. Get Pet Information");
     System.out.println("2. Feed Pet" );
     System.out.println("3. Play with Pet" );
     System.out.println("4. Quit" );
     System.out.print("Enter your choice ..... ");
     selection = input.nextInt();
   }
   return selection;
  }
 
  // Displays a picture of the pet
  public static void printPet(String emo)
  {
    System.out.println(" /\\_/\\");  
    System.out.println("( o.o )"); 
    System.out.println(" > " + emo + " <");
  }
 
  public static void main(String[] args) 
  {
    // CHANGE THIS VARIABLE VALUE TO TEST AT A DIFFERENT SPEED
    final int INTERVAL_IN_SECONDS = 10;
 
    // Sets up Scanner for user input
    Scanner input = new Scanner(System.in);
 
    VirtualPet myPet = new VirtualPet("Coco");
 
    /*  Remove comment for part C
    // Sets up a ScheduledExecutorService object that will call updateStatus
    // every 1 minute.
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    scheduler.scheduleAtFixedRate(() -> { myPet.updateStatus(); },  
             INTERVAL_IN_SECONDS, INTERVAL_IN_SECONDS, TimeUnit.SECONDS);
    */
 
    System.out.println(myPet);
    printPet("ᵔ");
 
    int choice = getChoice(input);
    while (choice != 4)
    {
      if (choice == 1)
      {
        System.out.println(myPet);
      }
      else if (choice == 2)
      {   /* remove comment for part B
        myPet.feed();
        System.out.println("\n\nYou have fed " + myPet.getName());
      */
      }
      else if (choice == 3)
      {   /* remove comment for part C
        myPet.play();
        System.out.println("\n\nYou have played with " + myPet.getName());
        */                     
       }
       /* remove comment for part B
       if (myPet.getEnergyLevel() >= 5  && myPet.getHappinessLevel() >= 5)
       {
         printPet("ᵕ");
       }
       else
       {
         printPet("ᵔ");
       }
       */
 
       System.out.println(myPet.getName().toUpperCase());
       choice = getChoice(input);
     }
     /* remove comment for part C
     scheduler.shutdown();
     */
  }
}

Activity 4

Food.java
/**
 * Activity 4 part A
 * @author (your name)
 * @version (a version number or a date)
 */
public class Food
{
  /* enter code for instance variables, constructor,
     and accessor methods
  **/
}
Game.java
/**
 * A Game object is created with parameters that define the name of the game, 
 * the increase in happiness level, and the amount of weight lost 
 * when the game is played. 
 * 
 * The Game class should have a constructor with the following header: 
 * public Game(String name, int happinessIncr, int weightDecr). 
 * 
 * The Game class also has accessor methods for all instance variables 
 * and a method boolean isWinner() that has a 50% chance of returning true 
 * and a 50% chance of returning false. 
 * Write the complete Game class, including the constructor 
 * and any required instance variables and their accessor method 
 * and the method isWinner(). 
 */
public class Game
{
  /**
   * Activity 3 Part B
   * @author (your name)
   * @version (a version number or a date)
   */
  public Game (String name, int happinessIncr, int weightDecr){
 
  }
  public boolean isWinner(){
      return false;
  }
}
VirtualPetGUIRunner.java
/**
 * A GUI class to run the Virtual Pet Lab
 * Requires javax.swing and java.awt
 * @author Kim Hermans
 * Image Credit: J.P. O'Hara & Jamie O'Hara
 * @November 2024
 */
import java.awt.BorderLayout;
import java.awt.Color;
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, animationTimerSeconds;
    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,statsLabel, messageLabel, timerLabel;
    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(); }, INTERVAL_IN_SECONDS, INTERVAL_IN_SECONDS, TimeUnit.SECONDS);
 
        // Calls helper methods to initialize components of GUI
        initPetDisplayPanel();
        initTimerPanel();
        initStatsPanel();
        initButtons();
        fillLayout();
        initMenuBar();
 
        // Initializes the frame
        frame = new JFrame();
        frame.setPreferredSize(new Dimension(350, 500));
        frame.setTitle("Virtual Pet");
        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("Feed");
        foodButton.addActionListener(new FoodButtonListener());
        foodButton.setPreferredSize(new Dimension(80, 30));
        foodButton.setMaximumSize(new Dimension(80, 30));
 
        playButton = new JButton("Play");
        playButton.addActionListener(new PlayButtonListener());
        playButton.setPreferredSize(new Dimension(80, 30));
        playButton.setMaximumSize(new Dimension(80, 30));
 
        menuPanel = new JPanel();
        menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS)); 
        menuPanel.add(Box.createVerticalStrut(50));
        menuPanel.add(foodButton, c);
        menuPanel.add(Box.createVerticalStrut(10));
        menuPanel.add(playButton, c);
        menuPanel.add(Box.createVerticalStrut(10));
    }
 
    // Initializes the panel that contains the information text
    public void initStatsPanel()
    {
        info = "" + pet3.toString().replaceAll("\n", "") + "";
        statsLabel = new JLabel(info);
        statsLabel.setBorder(BorderFactory.createEmptyBorder(0, 15, 15, 0));
 
        messageLabel = new JLabel("Happy Birthday, " + pet3.getName() + "!");
        messageLabel.setForeground(Color.blue);
        messageLabel.setBorder(BorderFactory.createEmptyBorder(0, 15, 15, 0));
 
        statsPanel = new JPanel(new GridLayout(2,1));
        statsPanel.add(messageLabel);
        statsPanel.add(statsLabel);
    }
 
    // Initializes the panel that displays the VirtualPet
    public void initPetDisplayPanel() 
    {
        imageHappy = new ImageIcon("petHappy.gif");
        imageSad = new ImageIcon("petSad.gif");
        imageEat = new ImageIcon("petEat.gif");
        imagePlay = new ImageIcon("petPlay.gif");
        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("00:00");
        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("%02d:%02d", minutes, remainingSeconds));
                info = "" + pet3.toString().replaceAll("\n", "") + "";
                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 a new Virtual Pet
    public void initMenuBar()
    {
        petRunner3 = new JMenuItem("Activity 3");
        petRunner3.addActionListener(new NewPet3Listener());
        petRunner4 = new JMenuItem("Activity 4");
        petRunner4.addActionListener(new NewPet4Listener());
        newPetMenu = new JMenu("New Pet");
        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);
        c.weightx = 40;
        c.gridx = 1;
        mainPanel.add(menuPanel, c);
        c.weightx = 60;
        c.weighty = 30;
        c.gridx = 0; 
        c.gridy = 1;
        mainPanel.add(statsPanel, c);
        c.weightx = 40;
        c.gridx = 1;
        mainPanel.add(timerPanel, c);
    }
 
    // Defines the action when the Feed button is clicked
    class FoodButtonListener implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
            pet3.feed();
            messageLabel.setText("You have fed " + pet3.getName());
            info = "" + pet3.toString().replaceAll("\n", "") + "";
            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
    class PlayButtonListener implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
            pet3.play();
            messageLabel.setText("You have played with " + pet3.getName());
            info = "" + pet3.toString().replaceAll("\n", "") + "";
            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 the action when a New Pet from Activity 3 is clicked
    class NewPet3Listener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            try
            {        
                String input = JOptionPane.showInputDialog("Enter your virtual pet's name:");
                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) 
        {
		// "Uncomment" code when you complete Activity 4 and include
		// VirtualPetGUIRunner4 in your project
		/*
            try
            {
                String input = JOptionPane.showInputDialog("Enter your virtual pet's name:");
                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("Enter your virtual pet's name:");
        VirtualPetGUIRunner init = new VirtualPetGUIRunner(input);
    }
}

Activity 5

VirtualPet4Runner.java
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
public class VirtualPetRunner4
{
    // Prints out menu and returns user choice
    public static int getChoice(Scanner input)
    {
      int selection = 0;
      while (selection < 1 || selection > 4)
      {
         System.out.println("------Virtual Pet Menu------");
         System.out.println("1. Get Pet Information");
         System.out.println("2. Feed Pet" );
         System.out.println("3. Play with Pet" );
         System.out.println("4. Quit" );
         System.out.print("Enter your choice ..... ");
         selection = input.nextInt();
      }
      return selection;
    }
 
    // Prints out food options and returns user choice
    public static int getPantry(Scanner input)
    {   
      int selection = 0;
      while (selection < 1 || selection > 5)
      {
        System.out.println("------Pantry Inventory------");
        System.out.println("1. Apple");
        System.out.println("2. Cupcake" );
        System.out.println("3. Broccoli" );
        System.out.println("4. Potato");
        System.out.println("5. Return to Menu" );
        selection = input.nextInt();
      }
      return selection;
 
    }
 
     // Prints out game options and returns user choice
    public static int getGame(Scanner input)
    {
      int selection = 0;
      while (selection < 1 || selection > 4)
      {
        System.out.println("------Game Options------");
        System.out.println("1. Coin Toss");
        System.out.println("2. Hoop Jumping" );
        System.out.println("3. Simon Says" );
        System.out.println("4. Return to Menu" );
        selection = input.nextInt();
      }
      return selection;
    }
 
   // Displays a picture of the pet
    public static void printPet(String emo)
    {
        System.out.println(" /\\_/\\");  
        System.out.println("( o.o )"); 
        System.out.println(" > " + emo + " <");
    }
 
    public static void main(String[] args) 
    {
        // CHANGE THIS VARIABLE VALUE TO TEST AT A DIFFERENT SPEED
        final int INTERVAL_IN_SECONDS = 10;
 
        // Sets up Scanner for user input
        Scanner input = new Scanner(System.in);
 
        VirtualPet4 myPet = new VirtualPet4("Coco");
 
        // Instantiates Food objects
        Food apple = new Food("Apple", 2, 1, 1); 
        Food cupcake = new Food("Cupcake", 1, 2, 2);
        Food broccoli = new Food("Broccoli", 3, -1, 1);
        Food potato = new Food("Potato", 2, 0, 2);
 
        // Instantiates Game objects
        Game coinToss = new Game("Coin Toss", 1, 0);
        Game hoopJumping = new Game("Hoop Jumping", 2, 2);
        Game simonSays = new Game("Simon Says", 1, 2);
 
        // Sets up a ScheduledExecutorService object that will call updateStatus
        // every 1 minute.
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(() -> { myPet.updateStatus(); }, 0, INTERVAL_IN_SECONDS, TimeUnit.SECONDS);
 
        System.out.println(myPet);
        printPet("ᵔ");
 
        int choice = getChoice(input);        
        while (choice != 4)
        {
            if(choice == 1)
            {
              System.out.println(myPet);
            }
            else if (choice == 2)
            {
                System.out.println("Select a food option from the pantry.");
                int food = getPantry(input);
                Food f = null;
                if (food == 1)
                  f = apple;
                else if (food == 2)
                  f = cupcake;
                else if (food == 3)
                  f = broccoli;
                else if (food == 4)
                  f = potato;
                if (f != null)
                {
                  myPet.feed(f);
                  System.out.println("\n\nYou have fed " + myPet.getName() 
                                        + " 1 " + f.getName());
                }
            }
            else if (choice == 3)
            {
                System.out.println("Select a game to play.");
                int game = getGame(input);
                Game g = null;
                if (game == 1)
                  g = coinToss;
                else if (game == 2)
                  g = hoopJumping;
                else if (game == 3)
                  g = simonSays;
                if (g != null)
                {
                  boolean hasWon = myPet.play(g);
                  System.out.println("\n\nYou have played " + g.getName() 
                                        + " with " + myPet.getName());
                  if (hasWon)
                     System.out.println(myPet.getName() + " has won!");
                  else
                     System.out.println(myPet.getName() + " has lost!");
                }
            }
            if (myPet.getEnergyLevel() >= 5  && myPet.getHappinessLevel() >= 5)
                printPet("ᵕ");
            else
                printPet("ᵔ");
            System.out.println(myPet.getName().toUpperCase());
            choice = getChoice(input);
        }
        scheduler.shutdown();
    }
}