Skip to main content
Logo image

Section 2.29 Magpie Chatbot Lab

Section 2.29.1 Magpie ChatBot Lab

Subsection 2.29.1.1 Lab Requirement

As of 2014-2015 the Advanced Placement Computer Science A course must include at least 20 hours of hands-on labs. In 2014, 3 recommended labs were created, Magpie, Picture, and Elevens, and in 2019-20, 4 more labs were created, Consumer Review, Steganography (an extension of PictureLab), Celebrity, and Data. Your teacher may choose to do any of these labs or their own labs to complete at least 20 hours of labs. See https://apcentral.collegeboard.org/courses/ap-computer-science-a/classroom-resources/lab-resource-page
 1 
https://apcentral.collegeboard.org/courses/ap-computer-science-a/classroom-resources/lab-resource-page
for the student guides for each of these labs.
If your class does all or part of the Magpie Lab, here is the College Board student guide for the Magpie Chatbot Lab
 2 
http://secure-media.collegeboard.org/digitalServices/pdf/ap/ap-compscia-magpie-lab-student-guide.pdf
as a pdf. Your teacher will provide the lab code for you which is also in the next pages. The particular code in each of these labs will not be on the exam, but the concepts covered by the labs will be on the exam.

Subsection 2.29.1.2 Magpie Lab Description

The Magpie lab allows you to work with the String class and conditionals with a chatbot. A chatbot is a computer program that tries to hold a conversation with a user. This chapter will walk you through the activities in the Magpie chatbot lab.
The first activity in Magpie is to explore some existing chatbots. We encourage you to work in pairs or groups on this activity.

Subsection 2.29.1.3 Activity 1: Exploring Chatbots

  1. Working in pairs or groups, try out some chatbots, for example:
  2. Record the chatbot response to each of the following.
  3. Ask the chatbot other questions.
  4. Work with another student or group to have two chatbots chat with each other. Type the responses from one chatbot into the input area for the other and vice-versa.
  5. Keywords: Some chatbots look for particular keywords and respond based on those keywords. What are some of the keywords that your chatbot seems to be responding to? Why do you think it responds to those keywords?

Section 2.29.2 Activity 2: Running Simplified Magpie Code

The College Board activity asks you to enter input using the Scanner class and record the responses. But, instead you can run this simplified version below and just call the getResponse method with each string as input as shown in the main method below.
In this lab, the main method creates a Magpie object called maggie, and calls its methods maggie.getGreeting() and maggie.getResponse(input) where the input can be one of the following strings as input and a response is printed out.
Run the following code and see the responses to these 4 inputs.
When different methods are called from the main method, the control flows to these methods and then comes back to main exactly where it was left when the methods finish. Click on the cool Java visualizer Chatbot
 1 
http://www.pythontutor.com/visualize.html#code=public+class+Magpie2%0A%7B%0A+++public+String+getGreeting(%29%0A+++%7B%0A+++++return+%22Hello,+let's+talk.%22%3B%0A+++%7D%0A%0A+++public+String+getResponse(String+statement%29%0A+++%7B%0A+++++String+response+%3D+%22%22%3B%0A+++++if+(statement.indexOf(%22no%22%29+%3E%3D+0%29+%7B%0A+++++++response+%3D+%22Why+so+negative%3F%22%3B%0A+++++%7D+else+if+(statement.indexOf(%22mother%22%29+%3E%3D+0%0A+++++++++++++++++%7C%7C+statement.indexOf(%22father%22%29+%3E%3D+0%0A+++++++++++++++++%7C%7C+statement.indexOf(%22sister%22%29+%3E%3D+0%0A+++++++++++++++++%7C%7C+statement.indexOf(%22brother%22%29+%3E%3D+0%29+%7B%0A+++++++response+%3D+%22Tell+me+more+about+your+family.%22%3B%0A+++++%7D+else+%7B%0A+++++++response+%3D+getRandomResponse(%29%3B%0A+++++%7D%0A+++++return+response%3B%0A+++%7D%0A%0A+++private+String+getRandomResponse(%29%0A+++%7B%0A+++++final+int+NUMBER_OF_RESPONSES+%3D+4%3B%0A+++++double+r+%3D+Math.random(%29%3B%0A+++++int+whichResponse+%3D+(int%29(r+*+NUMBER_OF_RESPONSES%29%3B%0A+++++String+response+%3D+%22%22%3B%0A%0A+++++if+(whichResponse+%3D%3D+0%29+%7B%0A+++++++response+%3D+%22Interesting,+tell+me+more.%22%3B%0A+++++%7D+else+if+(whichResponse+%3D%3D+1%29+%7B%0A+++++++response+%3D+%22Hmmm.%22%3B%0A+++++%7D+else+if+(whichResponse+%3D%3D+2%29+%7B%0A+++++++response+%3D+%22Do+you+really+think+so%3F%22%3B%0A+++++%7D+else+if+(whichResponse+%3D%3D+3%29+%7B%0A+++++++response+%3D+%22You+don't+say.%22%3B%0A+++++%7D%0A+++++return+response%3B%0A+++++++%7D%0A%0A+++public+static+void+main(String%5B%5D+args%29%0A+++%7B%0A+++++Magpie2+maggie+%3D+new+Magpie2(%29%3B%0A%0A+++++System.out.println(maggie.getGreeting(%29%29%3B%0A+++++System.out.println(maggie.getResponse(%22My+mother+and+I+talked+last+night.%22%29%29%3B%0A+++++System.out.println(maggie.getResponse(%22I+said+no!%22%29%29%3B%0A+++++System.out.println(maggie.getResponse(%22The+weather+is+nice.%22%29%29%3B%0A+++++System.out.println(maggie.getResponse(%22Do+you+know+my+brother%3F%22%29%29%3B%0A+++%7D%0A%7D&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=java&rawInputLstJSON=%5B%5D&curInstr=9
below to step through the code. Click on the Forward button at the bottom of the code to step through the code to see the flow of control from the main method to the other methods and back.
You can also run a version of the Magpie lab on replit.com
 2 
https://replit.com/@BerylHoffman/Magpie-ChatBot-Lab-v2#Main.java
that uses the Scanner class for input so that you can type in your own input to interact with it.
As you can see the getResponse method of Magpie2 looks for certain keywords like "mother" and "brother". Why do you think the response to β€œDo you know my brother?” isn’t β€œTell me more about your family.”? Discuss this with partner in pairs and see if you can figure it out.
The response to β€œThe weather is nice.” is one of the random responses. Look at the code to see how the if statement assigns a value to the response and returns that response. The method getRandomResponse generates a random number and uses that to assign the response. Modify the code above to add other random responses.

Activity 2.29.1.

Run to see the results. Try changing the input in main.

Subsection 2.29.2.1 Exercises

Alter the code above or in your own IDE (see section below) to do the following. We encourage you to work in pairs.
  • Have it respond β€œTell me more about your pets” when the statement contains the word β€œdog” or β€œcat”. For example, a possible statement and response would be:
  • Have it respond favorably when it sees the name of your teacher. Be sure to use appropriate pronouns! For example, a possible statement and response would be:
  • Have the code check that the statement has at least one character. You can do this by using the trim method to remove spaces from the beginning and end, and then checking the length of the trimmed string. If there are no characters, the response should tell the user to enter something. For example, a possible statement and response would be:
  • Add two more noncommittal responses to the possible random responses.
  • Pick three more keywords, such as β€œno” and β€œbrother” and edit the getResponse method to respond to each of these.
  • What happens when more than one keyword appears in a string? Try the input My **mother** has a **dog** but **no** cat. Which response did you get – was it the one about family or the one about pets or the negative one for no? Change the order of your if-else-if statements to make it so that one of the other responses is selected and try running it again.
Activity 2.29.2.
What happens when a keyword is included in another word? Consider statements like β€œI know all the state capitals” which contains no and β€œI like vegetables smothered in cheese” which contains mother. Explain the problem with the responses to these statements.

Subsection 2.29.2.2 Activity 2: Actual Code - (Optional)

You can do all of Activity 2 with the actual code using the Scanner class for input instead if you prefer.
Here is the actual code for the Magpie lab on replit.com
 3 
https://replit.com/@BerylHoffman/Magpie-ChatBot-Lab-v2#Main.java
. It uses the Scanner class to read input from the user. The Scanner class is not on the AP CSA exam. You can log in to replit.com and use this code and change it to do this lab.
Or you can copy and paste in the code from below into any Integrated Development Environment (IDE) like DrJava or JGrasp to run on your computer.
Here is the code for MagpieRunner2.java.
import java.util.Scanner;

/**
 * A simple class to run the Magpie class.
 *
 * @author Laurie White
 * @version April 2012
 */
public class MagpieRunner2
{

    /** Create a Magpie, give it user input, and print its replies. */
    public static void main(String[] args)
    {
        Magpie2 maggie = new Magpie2();

        System.out.println(maggie.getGreeting());
        Scanner in = new Scanner(System.in);
        String statement = in.nextLine();

        while (!statement.equals("Bye"))
        {
            System.out.println(maggie.getResponse(statement));
            statement = in.nextLine();
        }
    }
}
Here is the code for Magpie2.java.
public class Magpie2
{
    /**
     * Get a default greeting
     *
     * @return a greeting
     */
    public String getGreeting()
    {
        return "Hello, let's talk.";
    }

    /**
     * Gives a response to a user statement
     *
     * @param statement the user statement
     * @return a response based on the rules given
     */
    public String getResponse(String statement)
    {
        String response = "";
        if (statement.indexOf("no") >= 0)
        {
            response = "Why so negative?";
        } else if (statement.indexOf("mother") >= 0
                || statement.indexOf("father") >= 0
                || statement.indexOf("sister") >= 0
                || statement.indexOf("brother") >= 0)
        {
            response = "Tell me more about your family.";
        }
        else
        {
            response = getRandomResponse();
        }
        return response;
    }

    /**
     * Pick a default response to use if nothing else fits.
     *
     * @return a non-committal string
     */
    private String getRandomResponse()
    {
        final int NUMBER_OF_RESPONSES = 4;
        double r = Math.random();
        int whichResponse = (int) (r * NUMBER_OF_RESPONSES);
        String response = "";

        if (whichResponse == 0)
        {
            response = "Interesting, tell me more.";
        }
        else if (whichResponse == 1)
        {
            response = "Hmmm.";
        }
        else if (whichResponse == 2)
        {
            response = "Do you really think so?";
        }
        else if (whichResponse == 3)
        {
            response = "You don't say.";
        }

        return response;
    }
}

Section 2.29.3 Activity 3: Better Keyword Detection

This activity introduces you to some new String methods including some that are not on the exam, but are useful. Your teacher will tell you whether your class is doing this activity or not.

Subsection 2.29.3.1 More String Methods

Run the StringExplorer below. It currently has code to illustrate the use of the indexOf and toLowerCase methods. Do they do what you thought they would? The method indexOf is on the exam and the method toLowerCase is not. Why do you think you might want to change the string to all lowercase characters? Why doesn’t the value of sample change?
Activity 2.29.1.
Run the code below. Why do you think you might want to change the string to all lowercase characters? Why doesn’t the value of sample change? Do string methods change the string? Try some other string methods.
Open the API for String in Java documentation|
 1 
docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/String.html
in another tab. Scroll down to the Method Summary section and find the indexOf(String str) method. Follow the link and read the description of the indexOf method.
Activity 2.29.2.
Copy the following lines to StringExplorer in the ActiveCode above in the main method above to see for yourself that indexOf behaves as specified:
int notFoundPsn = sample.indexOf("slow");
System.out.println("sample.indexOf(\"slow\") = " + notFoundPsn);
Read the description of indexOf(String str, int fromIndex). Add lines to StringExplorer that illustrate how this version of indexOf differs from the one with one parameter.

Subsection 2.29.3.2 Better Keyword Detection

In activity 2, you discovered that simply searching for collections of letters in a string does not always work as intended. For example, the word β€œcat” is in the string β€œLet’s play catch!”, but the string has nothing to do with the animal. In this activity, you will trace a method that searches for a full word in the string. It will check the substring before and after the string to ensure that the keyword is actually found.
Take a look at the findKeyword method below. It has a while loop in it which we haven’t seen before. A while loop repeats the code in the block below it while a condition is true. A block is all the code inside of an open curly brace { and a close curly brace }.
private int findKeyword(String statement, String goal,
        int startPos)
{
   String phrase = statement.trim();
   // The only change to incorporate the startPos is in
   // the line below
   int psn = phrase.toLowerCase().indexOf(goal.toLowerCase(),
                                          startPos);

   // Refinement--make sure the goal isn't part of a word
   while (psn >= 0)
   {
      // Find the string of length 1 before and after
      // the word
      String before = " ", after = " ";
      if (psn > 0)
      {
         before = phrase.substring(psn - 1, psn).toLowerCase();
      }
      if (psn + goal.length() < phrase.length())
      {
         after = phrase.substring(
                  psn + goal.length(),
                  psn + goal.length() + 1)
                  .toLowerCase();
      }

      /* determine the values of psn, before, and after at this point */

      // If before and after aren't letters, we've
      // found the word
      if (((before.compareTo("a") < 0) ||
           (before.compareTo("z") > 0)) // before is not a letter
          && ((after.compareTo("a") < 0) ||
              (after.compareTo("z") > 0)))
      {
          return psn;
      }

      // The last position didn't work, so let's find
      // the next, if there is one.
      psn = phrase.indexOf(goal.toLowerCase(),psn + 1);

   }

   return -1;
}
Run the code below or this replit.com version 3
 2 
https://replit.com/@BerylHoffman/Magpie-ChatBot-Lab-v3#Main.java
to see this new method findKeyword in action. It is called from the getResponse method to print out an appropriate response based on a keyword. For example, looking for the word "no" to print out "Why so negative?", but it won’t match no inside of another word like "another".
if (findKeyword(statement, "no") >= 0)
{
   response = "Why so negative?";
}
You can also step through the code in the Java visualizer
 3 
http://www.pythontutor.com/visualize.html#code=public+class+Magpie3%0A+++%7B%0A%09++/**%0A%09+++*+Get+a+default+greeting%0A%09+++*+%0A%09+++*+%40return+a+greeting%0A%09+++*/%0A%09++public+String+getGreeting(%29%0A%09++%7B%0A%09+++++return+%22Hello,+let's+talk.%22%3B%0A%09++%7D%0A%0A%09++%0A%09++public+String+getResponse(String+statement%29%0A%09++%7B%0A%09+++++String+response+%3D+%22%22%3B%0A%09%09+if+(statement.length(%29+%3D%3D+0%29%0A%09%09+%7B%0A%09%09++++response+%3D+%22Say+something,+please.%22%3B%0A%09%09+%7D%0A%09%09+else+if+(findKeyword(statement,+%22no%22%29+%3E%3D+0%29%0A%09%09+%7B%0A%09%09%09response+%3D+%22Why+so+negative%3F%22%3B%0A%09%09+%7D%0A%09%09+else+if+(findKeyword(statement,+%22mother%22%29+%3E%3D+0%0A%09%09%09%09%7C%7C+findKeyword(statement,+%22father%22%29+%3E%3D+0%0A%09%09%09%09%7C%7C+findKeyword(statement,+%22sister%22%29+%3E%3D+0%0A%09%09%09%09%7C%7C+findKeyword(statement,+%22brother%22%29+%3E%3D+0%29%0A%09%09+%7B%0A%09%09%09response+%3D+%22Tell+me+more+about+your+family.%22%3B%0A%09%09+%7D%0A%09%09+else%0A%09%09+%7B%0A%09%09%09response+%3D+getRandomResponse(%29%3B%0A%09%09+%7D%0A%09%09+return+response%3B%0A%09++%7D%0A%0A%09++%0A%09++private+int+findKeyword(String+statement,+String+goal,%0A%09%09%09int+startPos%29%0A%09++%7B%0A%09+++++String+phrase+%3D+statement.trim(%29%3B%0A%09%09+//+The+only+change+to+incorporate+the+startPos+is+in%0A%09%09+//+the+line+below%0A%09%09+int+psn+%3D+phrase.toLowerCase(%29.indexOf(%0A%09%09%09%09goal.toLowerCase(%29,+startPos%29%3B%0A%0A%09%09+//+Refinement--make+sure+the+goal+isn't+part+of+a%0A%09%09+//+word%0A%09%09+while+(psn+%3E%3D+0%29%0A%09%09+%7B%0A%09%09%09//+Find+the+string+of+length+1+before+and+after%0A%09%09%09//+the+word%0A%09%09%09String+before+%3D+%22+%22,+after+%3D+%22+%22%3B%0A%09%09%09if+(psn+%3E+0%29%0A%09%09%09%7B%0A%09%09%09%09before+%3D+phrase.substring(psn+-+1,+psn%29%0A%09%09%09%09%09%09.toLowerCase(%29%3B%0A%09%09%09%7D%0A%09%09%09if+(psn+%2B+goal.length(%29+%3C+phrase.length(%29%29%0A%09%09%09%7B%0A%09%09%09%09after+%3D+phrase.substring(%0A%09%09%09%09%09%09psn+%2B+goal.length(%29,%0A%09%09%09%09%09%09psn+%2B+goal.length(%29+%2B+1%29%0A%09%09%09%09%09%09.toLowerCase(%29%3B%0A%09%09%09%7D%0A%0A++++++++++++/*+determine+the+values+of+psn,+before,+and+after+at+this+point+*/%0A++++++++++++%0A%09%09%09//+If+before+and+after+aren't+letters,+we've%0A%09%09%09//+found+the+word%0A%09%09%09if+(((before.compareTo(%22a%22%29+%3C+0%29+%7C%7C+(before%0A%09%09%09%09%09.compareTo(%22z%22%29+%3E+0%29%29+//+before+is+not+a%0A%09%09%09%09%09%09%09%09%09%09%09//+letter%0A%09%09%09%09%09%26%26+((after.compareTo(%22a%22%29+%3C+0%29+%7C%7C+(after%0A%09%09%09%09%09%09%09.compareTo(%22z%22%29+%3E+0%29%29%29%0A%09%09%09%7B%0A%09%09%09%09return+psn%3B%0A%09%09%09%7D%0A%0A%09%09%09//+The+last+position+didn't+work,+so+let's+find%0A%09%09%09//+the+next,+if+there+is+one.%0A%09%09%09psn+%3D+phrase.indexOf(goal.toLowerCase(%29,%0A%09%09%09%09%09psn+%2B+1%29%3B%0A%0A%09%09+%7D%0A%0A%09%09return+-1%3B%0A%09++%7D%0A%0A%09++%0A%09++private+int+findKeyword(String+statement,+String+goal%29%0A%09++%7B%0A%09%09+return+findKeyword(statement,+goal,+0%29%3B%0A%09++%7D%0A%0A%09++/**%0A%09+++*+Pick+a+default+response+to+use+if+nothing+else+fits.%0A%09+++*+%0A%09+++*+%40return+a+non-committal+string%0A%09+++*/%0A%09++private+String+getRandomResponse(%29%0A%09++%7B%0A%09%09+final+int+NUMBER_OF_RESPONSES+%3D+4%3B%0A%09%09+double+r+%3D+Math.random(%29%3B%0A%09%09+int+whichResponse+%3D+(int%29+(r+*+NUMBER_OF_RESPONSES%29%3B%0A%09%09+String+response+%3D+%22%22%3B%0A%0A%09%09+if+(whichResponse+%3D%3D+0%29%0A%09%09+%7B%0A%09%09+%09response+%3D+%22Interesting,+tell+me+more.%22%3B%0A%09%09+%7D%0A%09%09+else+if+(whichResponse+%3D%3D+1%29%0A%09%09+%7B%0A%09%09+%09response+%3D+%22Hmmm.%22%3B%0A%09%09+%7D%0A%09%09+else+if+(whichResponse+%3D%3D+2%29%0A%09%09+%7B%0A%09%09+%09response+%3D+%22Do+you+really+think+so%3F%22%3B%0A%09%09+%7D%0A%09%09+else+if+(whichResponse+%3D%3D+3%29%0A%09%09+%7B%0A%09%09+%09response+%3D+%22You+don't+say.%22%3B%0A%09%09+%7D%0A%0A%09%09+return+response%3B%0A%09++%7D%0A%09++%0A%09++public+static+void+main(String%5B%5D+args%29%0A%09++%7B%0A%09%09Magpie3+maggie+%3D+new+Magpie3(%29%3B%0A%09%09%0A%09%09maggie.findKeyword(%22yesterday+is+today's+day+before.%22,+%22day%22,+0%29%3B%0A%09%09%09%0A%09++%7D%0A%0A+++%7D&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=java&rawInputLstJSON=%5B%5D&curInstr=0
or using the CodeLens button below. It may take a minute or two to load. Click the forward button at the bottom of the code to execute the next statement.
Activity 2.29.3.
Modify the code below to print the values of psn, before, and after right after the comment on line 100 in the findKeyword method below. Record each of the values in a table. The College Board student guide for the Magpie Chatbot Lab
 4 
http://secure-media.collegeboard.org/digitalServices/pdf/ap/ap-compscia-magpie-lab-student-guide.pdf
has a table on page 8 that can be printed. Use the CodeLens button to step through the code.

Subsection 2.29.3.3 Exercise: Use the new method

Repeat the changes you made to the program in Activity 2, using this new method to detect keywords. You can use the active code window above, or the replit.com version 3
 5 
https://replit.com/@BerylHoffman/Magpie-ChatBot-Lab-v3#Main.java
or your own IDE.

Subsection 2.29.3.4 Questions: Prepare for the next activity

Single keywords are interesting, but better chatbots look for groups of words. Consider statements like β€œI like cats,” β€œI like math class,” and β€œI like Spain.” All of these have the form β€œI like something.” The response could be β€œWhat do you like about something?” The next activity will expand on these groups. You will get to add one of your own, so it’s a good idea to start paying close attention to common phrases in your own conversations.

Section 2.29.4 Activity 4: Responses that Transform Statements

If your class has time, your teacher may have you do Activity 4 below.
As stated previously, single keywords are interesting, but better chatbots look for groups of words. Statements like β€œI like cats”, β€œI like math class”, and β€œI like Spain” all have the form β€œI like something”. The response could be β€œWhat do you like about something?” This activity will respond to groupings of words.
Try each of the following as the value for the statement in the main method and see what they print. Or you can try it on replit.com version 4
 1 
https://replit.com/@BerylHoffman/Magpie-ChatBot-Lab-v4#Main.java
.
You can also step through the code in the Java visualizer
 2 
http://www.pythontutor.com/visualize.html#code=public%20class%20Magpie4%0A%20%20%20%7B%20%0A%20%20%20%20%20%20public%20String%20getResponse%28String%20statement%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20String%20response%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20if%20%28statement.length%28%29%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20%22Say%20something,%20please.%22%3B%0A%0A%20%20%20%20%20%20%20%20%20else%20if%20%28findKeyword%28statement,%20%22no%22%29%20%3E%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20%22Why%20so%20negative%3F%22%3B%0A%20%20%20%20%20%20%20%20%20else%20if%20%28findKeyword%28statement,%20%22mother%22%29%20%3E%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20findKeyword%28statement,%20%22father%22%29%20%3E%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20findKeyword%28statement,%20%22sister%22%29%20%3E%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20findKeyword%28statement,%20%22brother%22%29%20%3E%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20%22Tell%20me%20more%20about%20your%20family.%22%3B%0A%0A%20%20%20%20%20%20%20%20%20else%20if%20%28findKeyword%28statement,%20%22I%20want%20to%22,%200%29%20%3E%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20transformIWantToStatement%28statement%29%3B%0A%20%20%20%20%20%20%20%20%20else%20if%20%28findKeyword%28statement,%20%22I%20want%22,%200%29%20%3E%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20transformIWantStatement%28statement%29%3B%0A%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20psn%20%3D%20findKeyword%28statement,%20%22you%22,%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28psn%20%3E%3D%200%20%26%26%20findKeyword%28statement,%20%22me%22,%20psn%29%20%3E%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20transformYouMeStatement%28statement%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20getRandomResponse%28%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20return%20response%3B%0A%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20private%20String%20transformIWantToStatement%28String%20statement%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20statement%20%3D%20statement.trim%28%29%3B%0A%20%20%20%20%20%20%20%20%20String%20lastChar%20%3D%20statement.substring%28statement.length%28%29%20-%201%29%3B%0A%20%20%20%20%20%20%20%20%20if%20%28lastChar.equals%28%22.%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20statement%20%3D%20statement.substring%280,%20statement.length%28%29%20-%201%29%3B%0A%20%20%20%20%20%20%20%20%20int%20psn%20%3D%20findKeyword%20%28statement,%20%22I%20want%20to%22,%200%29%3B%0A%20%20%20%20%20%20%20%20%20String%20restOfStatement%20%3D%20statement.substring%28psn%20%2B%209%29.trim%28%29%3B%0A%20%20%20%20%20%20%20%20%20return%20%22What%20would%20it%20mean%20to%20%22%20%2B%20restOfStatement%20%2B%20%22%3F%22%3B%0A%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20private%20String%20transformIWantStatement%28String%20statement%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20statement%20%3D%20statement.trim%28%29%3B%0A%20%20%20%20%20%20%20%20%20String%20lastChar%20%3D%20statement.substring%28statement.length%28%29%20-%201%29%3B%0A%20%20%20%20%20%20%20%20%20if%20%28lastChar.equals%28%22.%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20statement%20%3D%20statement.substring%280,%20statement.length%28%29%20-%201%29%3B%0A%20%20%20%20%20%20%20%20%20int%20psn%20%3D%20findKeyword%20%28statement,%20%22I%20want%22,%200%29%3B%0A%20%20%20%20%20%20%20%20%20String%20restOfStatement%20%3D%20statement.substring%28psn%20%2B%207%29%3B%0A%20%20%20%20%20%20%20%20%20return%20%22Would%20you%20really%20be%20happy%20if%20you%20had%20%22%20%2B%20restOfStatement%20%2B%20%22%3F%22%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20private%20String%20transformYouMeStatement%28String%20statement%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20statement%20%3D%20statement.trim%28%29%3B%0A%20%20%20%20%20%20%20%20%20String%20lastChar%20%3D%20statement.substring%28statement.length%28%29%20-%201%29%3B%0A%20%20%20%20%20%20%20%20%20if%20%28lastChar.equals%28%22.%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20statement%20%3D%20statement.substring%280,%20statement.length%28%29%20-%201%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20int%20psnOfYou%20%3D%20findKeyword%20%28statement,%20%22you%22,%200%29%3B%0A%20%20%20%20%20%20%20%20%20int%20psnOfMe%20%3D%20findKeyword%20%28statement,%20%22me%22,%20psnOfYou%20%2B%203%29%3B%0A%20%20%0A%20%20%20%20%20%20%20%20%20String%20restOfStatement%20%3D%20statement.substring%28psnOfYou%20%2B%203,%20psnOfMe%29.trim%28%29%3B%0A%20%20%20%20%20%20%20%20%20return%20%22What%20makes%20you%20think%20that%20I%20%22%20%2B%20restOfStatement%20%2B%20%22%20you%3F%22%3B%0A%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20private%20int%20findKeyword%28String%20statement,%20String%20goal,%20int%20startPos%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20String%20phrase%20%3D%20statement.trim%28%29%3B%0A%20%20%20%20%20%20%20%20%20int%20psn%20%3D%20phrase.toLowerCase%28%29.indexOf%28goal.toLowerCase%28%29,%20startPos%29%3B%0A%20%20%20%20%20%20%20%20%20while%20%28psn%20%3E%3D%200%29%20%0A%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20String%20before%20%3D%20%22%20%22,%20after%20%3D%20%22%20%22%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28psn%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20before%20%3D%20phrase.substring%20%28psn%20-%201,%20psn%29.toLowerCase%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28psn%20%2B%20goal.length%28%29%20%3C%20phrase.length%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20after%20%3D%20phrase.substring%28psn%20%2B%20goal.length%28%29,%20psn%20%2B%20goal.length%28%29%20%2B%201%29.toLowerCase%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%28%28before.compareTo%20%28%22a%22%29%20%3C%200%20%29%20%7C%7C%20%28before.compareTo%28%22z%22%29%20%3E%200%29%29%20%20%26%26%20%28%28after.compareTo%20%28%22a%22%29%20%3C%200%20%29%20%7C%7C%20%28after.compareTo%28%22z%22%29%20%3E%200%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20psn%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20psn%20%3D%20phrase.indexOf%28goal.toLowerCase%28%29,%20psn%20%2B%201%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20return%20-1%3B%0A%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20private%20int%20findKeyword%28String%20statement,%20String%20goal%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20return%20findKeyword%20%28statement,%20goal,%200%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20private%20String%20getRandomResponse%28%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20return%20%22Interesting,%20tell%20me%20more.%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20public%20static%20void%20main%28String%5B%5D%20args%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Magpie4%20maggie%20%3D%20new%20Magpie4%28%29%3B%0A%20%20%20%20%20%20%20%20String%20statement%20%3D%20%22I%20want%20to%20build%20a%20robot.%22%3B%0A%20%20%20%20%20%20%20%20System.out.println%28%22Statement%3A%20%22%20%2B%20statement%29%3B%0A%20%20%20%20%20%20%20%20System.out.println%28%22Response%3A%20%22%20%2B%20maggie.getResponse%28statement%29%29%3B%20%20%20%20%0A%20%20%20%20%20%20%7D%0A%20%20%20%7D&cumulative=false&heapPrimitives=false&mode=display&origin=opt-frontend.js&py=java&rawInputLstJSON=%5B%5D&textReferences=false&curInstr=0
. It may take a minute or two to load. Click the forward button at the bottom of the code to execute the next statement.

Subsection 2.29.4.1 Exercises:

In this activity, the chatbot is altered to look not only for keywords, but also specific phrases. Magpie4.java adds two new methods, transformIWantToStatement and transformYouMeStatement and getResponse has been modified to add tests to find β€œI want to something” statements and β€œYou something me” statements.
Look at the code. See how it handles β€œI want to” and you/me statements.
Then add two new methods, transformIWantStatement and transformIYouStatement, and calls to each as described below. Alter the code either above in the active code window or on replit.com version 4
 3 
https://replit.com/@BerylHoffman/Magpie-ChatBot-Lab-v4#Main.java
or in an IDE of your choice:
  • In a method transformIWantStatement, have it respond to β€œI want something” statements with β€œWould you really be happy if you had something?” You can use the already written transformIWantToStatement method as a guide. In doing this, you need to be careful about where you place the call to the method so it calls the right one. Test with the following:
  • In a method transformIYouStatement, have it respond to statements of the form β€œI something you” with the restructuring β€œWhy do you something me?”. You can use the transformYouMeStatement method as a guide. Test with the following:
Find an example of when this structure does not work well. How can you improve it?

Section 2.29.5 Mixed Up Code Practice

Activity 2.29.1.

The following program segment should print 4 random responses using if/else statements, but the blocks have been mixed up. Drag the blocks from the left and put them in the correct order on the right. Click the Check button to check your solution.
You have attempted of activities on this page.