Getting your Feet Green Teaching Java and Object Oriented Programming Techniques With Greenfoot Introduction: Basic Housekeeping o Hello and Welcome to TCEA 2015. o Please set all phones to vibrate. If you have an important call, please take it in the hall. o During breaks, Please feel free to share our experience on Social Media. Tweets and likes are appreciated. #TCEA2015 #Greenfoot Background: Java and Greenfoot oJava is one of the most widely used programming languages on Earth. Refrigerators, thermostats, cars: many devices in the Internet of Things speak java. oGreenfoot is one of the easiest ways to learn Java syntax and Object Oriented Programming techniques while not being buried in the minutia of the language. oGreenfoot is an introductory and education IDE that is also capable of some professional results. oGreenfoot makes coding fun by allowing the new developer to concentrate on creating. Greenfoot keeps the complicated stuff “under the hood”. How to Teach Code: Practice oIn a word, the best way to teach coding is “practice”. The instructor leads and the students follow along. It may seem boring at times to copy line after line of code from a book or screen into a text editor but as you type through the lines you begin to see how they fit together. You can not learn by copy and paste or by lecturing about code others have written. You need to type it for yourself. oThe goal of this instructional period is to teach you how to teach others to code, even if you are not an expert. I will give you resources and some techniques to use with your students but the main thing to remember is to have them type out the code. oHaving said that…Let’s get started. The Greenfoot IDE: Wombats Everywhere oYou should find a flash drive at your work station. Go ahead and insert it into a USB port. Once it is recognized, navigate from “Computer” to the flash drive and let’s see what’s there. oYou should see an application called Greenfoot as well as one called BlueJ. This is a bonus I have tossed in. BlueJ is also a java IDE that is a bit more advanced that Greenfoot. It is a logical progression from one to the other as the student becomes more skilled. You will also see a folder labeled SDK. This is a version of the Java Development Kit that is required for both Greenfoot and BlueJ to run. These flash drives are completely self contained and should work on any Windows system without running an install file of any kind. Just plug and go. Object Oriented Programming: Class In Session oObject Oriented Programming is a way of developing software using small units of code to model real world objects. It is a step away from the old procedural monolithic style of coding that depended on the program following a set script. oOOP as we will call it, uses smaller sections of code, each designed to do a single task. They are put together like building blocks to accomplish whatever task to program is required to do. oIt is a good idea to begin each lesson by giving your students the fundamental concepts that they should master by the end of the lesson. In this case, our first concepts are Classes and Objects. These are the fundamental building blocks of OOP Object Oriented Programming: The Object of the Game oStart Greenfoot from your flash drive and navigate to the folder entitled examples. Open the folder called “Wombats and Leaves” and then open the Project file called “Project”. oThe Greenfoot IDE or “Integrated Development Environment” is very simple and easy to navigate. The large central section is called the “world”. It is where the action takes place. There is a longer narrow section along the right side of the screen called the Class Navigation Windows. You can see the different classes within your project here and follow their hierarchy of inheritance. oFinally, the section along the bottom contains the Run, Pause, Speed, and Reset buttons. We will investigate each of these controls as we move through the program. oGreenfoot programs or “scenarios” require two basic classes: the World and the Actor class. The world class is the container while the actor does whatever action is required. oThe cross-hatched lines mean that the class has yet to be compiled. A compiler is a program that takes code and makes it into something a computer can act on; in this case, Java byte code. What we are writing are essentially text files with a “.java” prefix. The compiler turns them into Java classes. oClick the “Compile” button and let’s see what happens… oThe cross-hatching goes away and we can see exactly what “Wombat World” looks like. It is supposed to be sand but any image may be used. oWe have two actor classes in our list but neither appear in the program yet. In order to place one, RIGHT CLICK on the “Wombat” class, place your cursor on the sand colored area and LEFT CLICK. You just built your first Object using a Class as a pattern. Classes: Inheritance oWe need to pause and look at an important concept in OOP, Inheritance. oJust as we receive features and tendencies from our parents, classes can access methods and other constructs from their parent classes. oThe arrow leading from “Wombat” up to “Actor” shows an inheritance relationship. “Wombat” is a type of “Actor” It can do anything an actor can do in addition to all the things unique to wombats. oNow lets see what these actors can do. oIf we RIGHT CLICK on the Wombat image we can see a list of the METHODS available in the Wombat class as well as the methods that the Wombat inherits from the actor class. oLEFT CLICK on the void act() method and see the results. oThe wombat moves to the right by one square. We have just called a METHOD and the object responded. oNow look at the buttons below the World image. You will notice and “Act” button there as well. LEFT CLICK the “Act” button and see the results. oThe wombat has moved another square. The “Act” button allows us to call the Act method for any actor. All actors in Greenfoot have an act() method. oNow click the “Run” button. The wombat continues to move. The “Run” button calls the act() method continuously as it was meant to be called. The act() method is a loop. Source Code: Lets Look at the Instructions oNow lets look at the source code. In the navigation column, LEFT CLICK on the Wombat entry and select “Open Editor” from the menu. oThe lines that begin with “import” allow us to use libraries of code that have been written for the Java language or for Greenfoot itself. oThe line public class Wombat extends Actor is the class declaration. It tells us what class we have and what it inherits from. oOne method we need to look at has the same name as the class itself. We call this method the CONSTRUCTOR and it is where we put code to initialize our class. Break Time: Everyone take 10 minutes oPlease be back on time so that we can make the most of your time today. oDon’t forget to promote the class on social media. #Greenfoot #Java #TCEA15 #TechnologyNEducation oTwitter: @ReganWhite222 oFacebook: https://www.facebook.com/regan.white.3 oBlog: http://technologyNeducation.wordpress.com New Scenario: The Little Crab Game oIn Greenfoot, LEFT CLICK File and select “Open”. Browse to the “Examples” folder and open the “Little Crab” directory. Select the “Project” file and Greenfoot will open the Little Crab scenario. oOur goal here is to build, as much as possible in the time we have, a playable game. This is how I would teach a classroom of students, with some minor modifications on the presentation. oOur goal here is to build, as much as possible in the time we have, a playable game. This is how I would teach a classroom of students, with some minor modifications on the presentation. oYou’ll notice that the class icons are crosshatched. Go ahead and click the compile button to build them into usable classes. oOnce you have the classes compiled, put a crab into the world. oRIGHT CLICK on the Crab class in the navigation panel. Select “Open Editor” from the context menu. Lets start adding code to our crab class. oCurrently we have a single import statement that allows us to use the libraries specific to Greenfoot. We have a multi-line comment, and we have a class definition. Finally we have a public method called act() that exists in all Greenfoot actors. oIf we were to close the code editor and click on the “Run” button in the Greenfoot interface, absolutely NOTHING would happen because the act() method is empty. oObviously the first thing we want our crab to do is move. We need to find or build a method to tell our crab how to move. Fortunately for us, crab is a sub-class of actor, which has a method we can use. If we type in move(); between the opening and closing curly brackets in the act() method recompile our class, and then click the “Run” button, we find that things have changed. oHaving our crab stuck at the edge of the world is not very useful. Fortunately there is another method from the actor. oIf we RIGHT CLICK on the “Actor” class in our Greenfoot interface we see that instead of source code, we find documentation. This is a list of all the methods available to the Actor class. As we look through the list we find a “turn()” method that allows our actor to turn a number of degrees. Lets add that method call after the move() call in our crab code. oNotice the number “5” contained within the parenthesis. This is called a parameter and it tells our method “how much” or “what” to do. Move() does not have a parameter and if we look at the move code, we see it is not needed as the actor continues to move until it is unable. The Turn() method, however, requires a number of degrees to know how far to turn. Hence the parameter. oNow, run the code and see the changes. Explanations: What is Going On Here?? • I’m not sure that is better. Now we are going in circles. • As you know, the act() method is a loop. It continues to fire until the program terminates, or as long as the actor exists. The crab is moving and then turning 5 degrees and then moving in succession and so it goes in circles. • Take a moment and modify the parameter to see what effect making the number larger or smaller has. Try adding a non-numeric character and see what happens. (This is what I am constantly telling my kids…Try to break it and you’ll see how it works.) Logical Flow: Making Decisions • The crab still gets hung up at the edge of the world. It does not know how to react. We have to teach it. Open the code editor for the “Animal” class. It opens in the documentation mode. Look through the methods and see if you can find one we could use. • atWorldEdge() is described as a Boolean data type. This means that the method returns a value of True or False based on conditions within the program. We need a way to check those conditions using this method. We are going to use and IF statement as our logic tester. Modify the crab act() method as follows: The correct format for an “IF” statement in java is… if (condition) { //action code goes here; } If our condition (atWorldEdge()) returns true then we need to turn away from the edge. Once we are no long trapped we can keep moving. Recompile the code, add a new crab, and test out the results. It appears that our crab turns a lot more than 17 degrees. However, remember that the crab is turning 17 degrees, rechecking its position, and if it is still trapped, turning again. All this happens VERY rapidly. Once the crab is COMPLETELY clear of the edge, it continues in a straight line until it encounters the edge again. You can experiment with the amount of turning necessary to get away from the wall an still look natural within the game. Recap: Let’s Take a Moment to Reflect • It is important to bring out programming concepts and practices to your students as you walk through the code. It is a good idea to assign vocabulary words as you enter new sections (Whether or not you use Michael Kölling’s book Introduction to Programming with Greenfoot (available from Prentice Hall), you need to make sure that your kids understand not only what they are doing, but WHY. • Key Terms So Far… Class: A software model or pattern of a real world object. Things created from classes are called objects or instances interchangeably. Object: A software construct created when a class is instantiated to mimic some behavior of a real world object. Constructor: A method in a class, with the same name as the class, called when a class is instantiated. It basically creates the class. Parameter: A condition required for a method to work; usually contained in parenthesis after the class name. Method: A section of code that tells an object to do something. It may or may not return a value or response. Return Value: A response or message returned by a method upon completion of it’s task. Back to Business: Random is Good oMuch of what makes a good simulation comes of being unpredictable. If the antagonist behaves the same way every time, then a pattern develops and the game is easily beaten. We need to introduce some random behavior to make our characters seem more life-like. oTo accomplish this, we use a method from Greenfoot itself that allows us to create “Random” numbers. (These numbers aren’t really random as they are the results of a VERY lengthy and involved mathematical operation but for our purposes, they are close enough.) oAdd the following code in another IF statement: if (Greenfoot.getRandomNumber(100) < 10) { turn(5); } o The method is a part of the Greenfoot environment itself. We call it using what is known as DOT NOTATION. The method expects a parameter that is an Integer (whole number). This number acts as the upper limit for our random number generator. The method will return an integer between zero and the upper limit. o In this case we want a random number between 0 and 100. If we determine that our numbers is less than 10 (ergo. 10% of the time) then our statement returns correct and the IF code fires. 90% of the time the number will be greater than 10 and the IF statement will be passed over. Adding a New Character: Worms • Lets add a new character to the mix. In doing so, realize that far and away the hardest part of game development is character creation and design. Code is easy compared to drawing, coloring, and designing a good character. Greenfoot takes care of much of this by providing an extensive library or ready made sprites or images for your use. You may also create images in Photoshop or GIMP as long as they are PNG or JPG format. • To create a new class, RIGHT CLICK on ANIMAL (make sure it is ANIMAL that you are right clicking on) and select Make a New Subclass from the menu. oTo create a new class, simply fill in the appropriate box with a name, in this case, Worm as all class names should be capitalized. oSelect an image – scroll down until you see the worm image, just below sand.jpg and click to highlight it. Now click OK and you will see a new class oNow, see if you can add some worms to your world. Don’t forget to recompile. Worm o OK we have worms. What do we DO with them? o We need to tell our crab how to eat them as this will be the primary scoring activity of our game. The crab eats as many worms as possible before something else eats him. o To eat a worm, the crab must be able to find them. There are two methods from the Animal class that will help us; boolean canSee(java.class) and void eat(java.class). Both expect a parameter of the java class of some type; in this case, a worm class. o The canSee() method returns a Boolean (true/false) value, while the eat() method just does it’s job and does not return a value as evidenced by its VOID description. o We will need another IF statement and we will be putting this in the CRAB code editor, not worm. (WHY?) o Add the following code to the act() method of the Crab class If (canSee(Worm.class)) { eat(Worm.class); } o The logic is simple here. If the crab is within one block of a worm then he can see the worm. (Crabs don’t have great eye sight). If the conditions are met then the canSee method returns a Boolean value of True. If this is the case then the crab can and will eat the worm, completely destroying that one instance of the worm class. It will only destroy the worm object it eats. That worm will disappear from the world. This is why we put the code in the crab and not the worm. Now, recompile, place some worms and a crab into the world and click the “Run” button More Random Behavior: Our Crab is Unnatural oCan anyone tell me what is wrong with our crab? It incorporates random motion in the frequency of its turns but something is not right. oIf you can’t guess, I’ll tell you. The crab only turns one way. Our intrepid hero is channeling the spirit of Dale Earnhart. He only turns left. We need to create another randomizer to mix up his turns a bit. oIn our already random IF statement, add the following: turn(Greenfoot.getRandomNumber(90) – 45); o What could this code possibly mean? o We are still using the turn() method but now for some reason we are getting a random number between 0 and 90 and subtracting 45 from it. o Notice that 45 is half of 90. 50% of the time the answer we get will be positive and the other half of the time the number will be negative. o Therefore, 50% of the time our turn will be right and 50% of the time, our turn will go left. Recompile, add some worms and a crab, and run the code. Creating Our Own Methods oWe can create methods in Greenfoot as easily as we can use methods already created for us. oWe create these methods to ENCAPSULATE the code and make our program more modular. The goal of Object Oriented Programming is easily supportable code because it is built in fundamental units like blocks which are then put together to do the job. oLets move our looking and eating code into its own method. First we need to declare the method. Well I Declare: Making Methods oMethod definition involves declaring the method to be public or private, deciding on a return value, if any, and finally naming the method according to the conventions you have been given by whoever you are working for. oWe want our method to be public so that we can call it from anywhere. We don’t need a return value, and we can call it “lookForWorm()” It is a standard practice in Java to capitalize the class names and leave methods and variables lower case. It is also common practice to use camel notation to make the spaceless variable names easier to read. oWe create the skeleton of our method below the last closing curly bracket of the “act()” method. oWe declare the method public, we do not want a return value so we use the “void” keyword, and finally, we call it “lookForWorm()” according to common practice. oWe include the open and closing curly brackets to place the code o Now we go back in to the act method and replace all that code with a simple function call. We use the name of the function followed by parenthesis and a semi colon. o We don’t need anything in the parenthesis because our method does not have a parameter. o When our program reaches this point in the code it will automatically skip down to the method we call and perform that operation. It will then return to the same place in the “act()” method and continue on from there. Now It’s Your Turn: Create a Method oCreate a method on the Act() method of the crab class to encapsulate the random behavior of our crab. Take that code that generates random movement and place it in a public method with no parameters and no return. oCreate a method to encapsulate the edge of the world detection functionality. It needs no parameters and does not have a return. Be sure to include calls for both these methods in the “act()” method. oYou should have three new methods, each public and each with no return or parameters. oYou should also have three new method calls in the act() method after move() oNow is a good time to mention COMMENTING your code. oA comment is a note to yourself or another developer about what a method is supposed to be or do. oThe computer compiler will ignore comments but they are nice to have when you reopen a program a year later to do maintenance work on it and can’t remember what you were trying to do. oThere are two types of comments; in-line and multiple line. oIn-line comments are used to document a single line of code. They are designated with a pair of forward slashes as shown here. oMultiline comments are usually found in the header of the class or prior to a method and may be used to give a more in-depth explanation of the purpose of the code. They are designated by a forward slash followed by an asterisk and then ended by an asterisk followed by a forward slash. Behavior: Our Program has a Problem oSo far so good but our game has a couple of problems. oWe need an enemy. In this case, the EVIL LOBSTER (a known crab eater.) will play the part of the villain of this picture. oOur crab moves on his own. We need to control his movement. If this is supposed to be a game then we need to be able to PLAY. oIn point of fact, our crab behaves exactly as our lobster ought to. It moves randomly around and eats things. We are going to create a new class for lobsters and transfer the code from crab into lobster. We will then put new code into the crab to allow us to control his actions. Let’s See What You’ve Learned oGo ahead and create a new class for lobster. We want to make it a subclass of Animal so that we can take advantage of the Animal methods. oRIGHT CLICK on Animal and select New Subclass; In the dialog box, name the class Lobster and select the lobster image. oClick OK. oRIGHT CLICK on Animal, Select New subclass from the menu oName the class “Lobster” and select an appropriate image. oFinally, click OK to add the class to our program. Swapping Code • We now open the crab editor, select ALL the code in the class, ctl + C to copy the code. • We open the Lobster editor, select ALL the code already there, and then ctl + V to paste the new code in and get rid of the old. • We will need to modify the new code slightly. First, we change the name of the class to Lobster. o We will need to modify the new code slightly. First, we change the name of the class to Lobster. o Our crab already behaves perfectly as a villain but we want him to eat crabs and not worms so we will modify the lookForWorm into lookforCrab() and change the target class. o And finally, we change the method name and method call to reflect the new target. Lets get the Player Involved oWe are going to use a Greenfoot method called o static boolean isKeyDown(“string”); oto control the movement of our crab. oThe static keyword tells us that this is a class method. The boolean tells us that it returns a TRUE or FALSE value, and the “string” inside the parenthesis tells us we need to send it a string or text parameter; in this case, the name of the key we want to check on. oWe still want our crab to look for worms and we still want him to move so we will just remove the random motion code and replace it with our new code. We leave the lookForWorm() and move() methods alone. o We replaced the randomTurn() method with a checkKeyPress() method to see what key is being pressed. o If the left arrow key is pressed we want our crab to to turn left, if the right arrow key is used we want the crab to turn right. o We also added a call to this method in place of the randomTurn() method call in act() o And finally, we got rid of the turnAtWorldEdge() method. I mean…you are driving this thing right? o Recompile and make sure everything works and then it will be time to try it out. This is the End: Stopping the Game • We need to find a place to stop this game, hopefully when all the worms are eaten and not when our crab is eaten. • We are going to search the “Greenfoot Documentation” to find a method to help us accomplish this. • In the Greenfoot editor, click on the “Help” menu and select “Greenfoot Class Documentation” from the menu. A web page will open that lists the various classes available in Greenfoot. Click on the Greenfoot entry and the page will navigate to a document that lists the methods for the Greenfoot class itself. See if you can find a method to stop a game. Stop() oI think the stop() fits the bill nicely. It requires no parameters and simply brings an ongoing scenario to a halt when called. oWhere should we put it? One place we can use it now is when the lobster catches the crab. Look at the lobster code and type in a method call for the stop() method where you think it ought to go. oI think the best place to place the call would be as soon as the crab gets eaten by the lobster. At that point, Game Over. Make it Interesting: Adding Sound • Before we go we need to add a few niceties to our scenario. We have a playable game but it could use some feedback in the form of sound. • Greenfoot provides an extensive library of media to use in games. Greenfoot speaks .au and .wav files exclusively. (although support for .mp3 may have been added by now). • We use the “playSound” method in Greenfoot to play the sound files. • Sound files must be placed in the “sounds” directory where our Greenfoot project is saved. If you navigate there you will find a sound folder with sound files, an images folder for the various sprites, and a lot of class files. • We want a slurping sound to play every time we eat a worm. Find the best place and enter Greenfoot.playSound(“slurp.wav”); • Once you have added the line of code, recompile and run the game. Getting Ready to Play • One annoying factor about our game is the need to repopulate characters between rounds. We want our game to automatically reset when we want to replay. • We need to use our world class to load the characters in automatically. • Open up the CrabWorld class code and look for a method with the same name as the class. This method is called the constructor. It is called every time the world instantiates. This is where we put things we want to be automatically created when the game starts. The New Keyword New oTo instantiate a class (create a new object from it) we use the “new” key word. oWe also need to tell our world where to put the object. We use left and top pixel counts to do that. oFor example, lets say we want our new crab to always appear in the center of the world. We would say addObject(new Crab(), 280, 280); because our world is 560 pixels by 560 pixels. Go ahead and add this code to the world constructor. oWe add out new object into the constructor method of CrabWorld. oWhen we recompile we now find a crab sitting in the middle of our world. oGo ahead and add a couple of lobsters to the top and bottom of our world. oNow for a challenge. Add 5 worms to random locations within the world. oWe can use the getRandomNumber() method to generate the random numbers. We feed it a parameter of 560 to make sure it never puts anything off the screen. oNow when we recompile, the game is ready to go. oThe last feature we will add to our game is to make our Crab’s movement a little more realistic. oCrabs tend to move with a jerky scuttle but ours glides across the sand like an Olympic figure skater. oLets use an old animation trick called “Persistence of Vision” to make him look alive. Now You See Him oGreenfoot provides two crab images, one with legs extended and one with legs slightly bent. These two images, played in quick succession, make the crab look like he is walking. oWe will use the Greenfoot.image methods to swap the pictures quickly in the program. oWe must first create a new image and assign it the parameter of crab2.png. We use the “new” keyword and enter. new GreenfootImage(“crab2.jpg); Now You See Him oOnce we have the new image created, we can use the setImage method to assign it to a Greenfoot actor. setImage(new GreenfootImage(“crab2.png”); oNotice we are creating a new image and assigning it in the same line of code. oNow we need to make the images switch. To do that we need a place to hold them. We will use a pair of fields. oFields are special variables called “instance variables”. They let us remember information as long as the object it is attached to exists in the game. Each crab will remember these two images. We declare them at the start of a class. oWe declare two fields or instance variables in our Crab class and now we use the equal sign to assign them the value of the images we created. oWe assign the images to the crab object inside the Crab constructor. o Alternating the Image • We use an IF/ELSE statement to switch the image. • We use the current image as the conditional on which to base our swapping. • If, for example, the current image is image 1, we swap to image 2 and vice versa. We place this code in the act method which runs continuously and Greenfoot takes care of the rest oFirst we build a new method called imageSwap to handle the heavy lifting. It requires no parameters, although we could add the two images if we chose to. It has no return value, it just changes out the pictures. oWe use the getImage and setImage methods, which are build into the Actor class from which we inherit, to change the image. oNext we place a call to this method into the Act() method of the crab. The Act() method continually runs and so our swapImage() method is continually called. If the current image is crab.png then we swap to crab2.png continuously as long as the crab still exists in our world. And Finally: What We Need to Have a Real Game • Can anyone guess the last piece of the puzzle? Score: oWe need to keep score if this is a game. oIn order to do that we need to add the following constructs; an instance variable to remember how many worms we have eaten, a method to add the worms, and a call to the stop() method when we have eaten enough to win. oWe need to instantiate this code into our lookForWorm() method since this is where the eating occurs oWe create a field of type “int” or integer to hold our worms eaten. oNext we add to our canSee(Worm.class) statement to add 1 to our eaten worm total every time we eat one. oFinally, we end the game when our total equals 5. The double equal sign is not an assignment statement, it is a test. A single equal sign is an assignment. We set an object equal to a value, for example. We also toss in a sound file to let the user know less abruptly than just stopping the game. What’s Next? • The first thing we need to do is test our game to make sure it behaves exactly as we expect. • Next we can look at some ideas to improve our game… New Ideas • Use different images to change to tone of the game • Use more different kinds of actors (add a boss or another prey animal) • Instead of moving forward automatically, we might have to hold the up arrow. • Build a two player game by setting up another keyboard control on the other side of the keyboard. • Make new worms pop up when one is eaten.