Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
COMP 14 Introduction to Programming Mr. Joshua Stough April 6, 2005 Monday/Wednesday 11:00-12:15 Peabody Hall 218 Announcements • Program 6 assigned today AFS Space • If you don't have the AFS client on your laptop, you can still access your AFS space • Download and install WS_FTP from http://shareware.unc.edu • Remote host: isis.unc.edu • Remote username: your Onyen Applets • Why won't my applet run on my friend's computer? – Sun, creator of Java, and Microsoft had a fight – Java is not installed by default in Windows XP • How to fix? – send them to http://java.com for a free download Question What type of sort produces the passes below (insertion, selection, or bubble)? 10 10 10 2 -37 -37 97 45 45 10 2 2 45 97 63 45 10 10 63 63 97 63 45 45 2 2 2 97 63 63 -37 -37 -37 -37 97 84 84 84 84 84 84 97 ORIGINAL Pass 1 Pass 2 Pass 3 Pass 4 Pass 5 COMP 14 Today • • • • Program 6 HTML GUIs Applets Program 6 • • • • • Final Assignment! 100 points Due: Monday, April 25 at 11:59pm Builds on Program 5 Add dealer to the game, decide winner, tally total wins, losses, and ties • Includes: applet version of Blackjack game, report written in HTML Blackjack Dealer Rules • The dealer is dealt two cards initially • The dealer's 2nd card is dealt face-down – known total is only for the face-up card • Player plays hand to completion – ending with stand or bust • Dealer plays hand to completion – ending with stand or bust – while point total for hand is < 17, dealer must hit – once point total for hand is >= 17, dealer must stand Blackjack Winner Rules • Hand closest to 21 without going over bust wins • If player busts, dealer wins – dealer doesn't play hand if player busts • If dealer busts, player wins • If dealer and player have same point total, it's a tie BlackjackGame New Class Constants/Variables • Constants – 3 integers DEALER, PLAYER, TIE • Class Variables – 1 variable to represent the dealer's hand – 3 integers to keep track of wins, losses, and ties • class variable - member variable defined as static, which means there is only one instance of the variable per class BlackjackGame New Methods • • • • • getDealerHand getWins getLosses getTies addDealerCards – adds cards to the dealer's hand until the dealer must stand – dealer can't have more than MAX_CARDS_IN_HAND cards • decideWinner – return integer (PLAYER, DEALER, or TIE constant) indicating who won BlackjackGame Additions To Existing Methods • initGame – instantiate dealer's hand – initialize number of wins, losses, and ties • setupNewHand – make sure deck can deal out 2 full hands without needing to be shuffled – reset the dealer's hand – deal 2 cards to the dealer Program 6 • Applet – worth 10 points – create an applet version of your Blackjack game (using BlackjackApplet.java) – put the applet online and include the URL in your Blackboard comments Something to Think About: Would your program still work if we changed only the value of MAX_CARDS_IN_HAND? (The user interface will.) Program 6 Report • Worth 25 points • Write a report in HTML (using Notepad -- no web authoring tools allowed) • Describe the Card, Hand, and Deck classes and how they work together • Describe the algorithm for scoring the hand • Questions, comments, things learned in Programs 4-6 • Put report online and include the URL in your Blackboard comments Writing Web Pages • Web pages are written in a "markup" language called HTML (HyperText Markup Language) • HTML is NOT a programming language. • HTML just tells the computer how to format text and images--it's like using Word, but having to type in what you want things to look like. Tags • HTML works based on the concept of tags. A tag is some text surrounded by < and > • Tags are not printed to the screen • Example tags: – <HTML>, <TITLE>, <P>, <H1> • A lot of the time they work in pairs: – <HTML> and </HTML> • HTML is not case-sensitive – <HTML> and <html> are the same thing Very Simple Web Page <HTML> <HEAD> <TITLE>Simple web page</TITLE> </HEAD> <BODY> This is the text on a web page. </BODY> </HTML> simple.html View any web page source by choosing Source from the View menu in a web browser What Do The Tags Mean? • <HTML>, </HTML> – go at the beginning and end of EVERY page • <HEAD>, </HEAD> – introduction of the document • <TITLE>, </TITLE> – what goes in the title bar of the window • <BODY>,</BODY> – the text (and other stuff) that is displayed in the window Color and Images • You can add color or an image to the background: – color: make body tag <BODY BGCOLOR=RED> OR <BODY BGCOLOR="#FE23AF"> – image: make body tag <BODY BACKGROUND="image.gif"> What's #FE23AF? • RGB color specification • FE23AF is hexadecimal – each digit represents 4 binary digits (0-15) – A=10, B=11, C=12, D=13, E=14, F=15 F E 2 3 A F 1111 1110 0010 0011 1010 1111 254 35 175 Ignores White Space • In HTML, where you put a line break is ignored. The web browser decides this for you based on the size of the window • These two will print the same thing: first: <BODY> Why not fly? </BODY> second: <BODY> Why not fly? </BODY> Adding White Space • Putting <P> at the beginning of a paragraph and </P> at the end will put a blank line between two pieces of text • You can also use <BR> to insert a carriage return (aka <enter>) • <hr> will insert a horizontal line Other Tags • Bold – <B> and</B> • Italic – <I> and </I> • Center – <CENTER> and </CENTER> • Comments – <!-- and --> otherTags.html Hierarchical Structure • For documents having a hierarchical structure, you can use heading tags – <H1> marking chapter in a book – <H2> marking section of a chapter – <H3> marking subsection of a chapter – <H4> and so on down... – <H5> Lists • There are two kinds of lists: – Ordered lists (surrounded by <OL> and </OL> – Unordered lists (surrounded by <UL> and </UL> • Both use <LI> and </LI> to indicate List Items (things in the list) Tables • You can also create tables • Beginning: <TABLE> </TABLE> – options: border, cellspacing, cellpadding • Each row: <TR> </TR> • Each column: <TD> </TD> Links • This is the important part. This is how you go from page to page. • <A HREF="put URL here">text to be displayed</A> Inserting Images • You can also just add an image into the middle of the page • Use <IMG SRC="put URL here"> What To Learn More? • Tutorials http://www.htmlcodetutorial.com/ http://www.w3.org/MarkUp/Guide/ • Quick Reference http://werbach.com/barebones/barebones.html GUIs • We used JOptionPane to create a GUI Calculator using dialog boxes. • We can create more complex GUIs using Java. Program 6 User Interface JFrame content pane ImageIcon JLabel JButton Before We Get Started... • JFrame is a class provided by the package javax.swing • Instead of instantiating an object of the JFrame class, we're going to extend the JFrame class (called inheritance). • The new class "inherits" features (including methods and variables) from the existing class -big time-saver! • We can use all of the methods and variables from JFrame, while adding our own. Extending JFrame • Use the modifier extends, which is a reserved word public class BlackjackUITest extends JFrame { } • JFrame is the superclass • BlackjackUITest is the subclass Next Step • We'll need a constructor for BlackjackUITest – set the window title setTitle – set the window size setSize – set the default operation when the close button is pressed setDefaultCloseOperation – display the window setVisible(true) • We'll need a main method – create an object of the BlackjackUITest class (which will call the constructor) import javax.swing.*; // needed for JFrame public class BlackjackUITest1 extends JFrame { private final static String TITLE = "Blackjack"; private final static int WIDTH = 700; private final static int HEIGHT = 600; public BlackjackUITest1() // constructor { setTitle(TITLE); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { BlackjackUITest1 gui = new BlackjackUITest1(); } } Adding Things • Access the content pane so we can add things (buttons, labels, images) Container content = getContentPane(); – Container class is provided by the java.awt package – add import statement for java.awt • Then, we set the layout type and add things to the content pane Layout Managers • FlowLayout – default – components are added left to right, top to bottom • BorderLayout – consists of NORTH, SOUTH, EAST, WEST, CENTER regions – size of CENTER region depends on the number of components in the EAST and WEST regions • GridLayout – define number of rows and columns to get equally sized cells – cells are filled left to right, top to bottom BorderLayout • Main layout for BlackjackUI is BorderLayout content.setLayout(new BorderLayout()); • When adding components with BorderLayout, you have to specify the section (using NORTH, SOUTH, EAST, WEST, CENTER constants from BorderLayout class) content.add(item, BorderLayout.SECTION); JLabels • We'll identify the regions of the BorderLayout with labels (text areas) • JLabel is a region of text – can be assigned an alignment (leftjustified, right-justified, centered) JLabel northLabel = new JLabel ("NORTH", SwingConstants.CENTER); JLabel southLabel = new JLabel ("SOUTH"); • Text can be changed with setText method northLabel.setText ("Changed Text"); Container content = getContentPane(); content.setLayout (new BorderLayout()); JLabel northLabel = new JLabel ("NORTH", SwingConstants.RIGHT); content.add (northLabel, BorderLayout.NORTH); JLabel southLabel = new JLabel ("SOUTH"); content.add (southLabel, BorderLayout.SOUTH); JLabel westLabel = new JLabel ("WEST", SwingConstants.CENTER); content.add (westLabel, BorderLayout.WEST); JLabel eastLabel = new JLabel ("EAST", SwingConstants.CENTER); content.add (eastLabel, BorderLayout.EAST); JLabel centerLabel = new JLabel ("CENTER", SwingConstants.CENTER); content.add (centerLabel, BorderLayout.CENTER); BlackjackUITest2.java Colors • Set the background color of the content pane • Set the foreground color of the text (JLabels) • Use Color class from the java.awt package • Available colors pg. 734 – constants (but lowercase) • Methods – darker() - darkens the color – brighter() - brightens the color content.setBackground(Color.green.darker().darker()); sets the content pane extra dark green Color Change Code // change the colors content.setBackground(Color.green.darker().darker()); northLabel.setForeground(Color.yellow); southLabel.setForeground(Color.red.brighter()); westLabel.setForeground(Color.cyan); eastLabel.setForeground(Color.white); centerLabel.setForeground(Color.orange); BlackjackUITest3.java Adding Images • We can create images and associate them with labels • ImageIcon – use JPG or GIF images filename ImageIcon cardImage = new ImageIcon ("img/0.gif"); • Use setIcon method from JLabel class centerLabel.setIcon (cardImage); Text Position Relative to Icon label.setVerticalTextPosition(vposition); label.setHorizontalTextPosition(hposition); SwingConstants.TOP SwingConstants.CENTER SwingConstants.BOTTOM SwingConstants.LEFT SwingConstants.CENTER SwingConstants.RIGHT Icon QuickTime™ and a TIFF (Uncompressed) decompressor are needed to see this picture. Adding Card Image // face-down card ImageIcon cardImage = new ImageIcon("img/0.gif"); centerLabel.setIcon(cardImage); centerLabel.setVerticalTextPosition(SwingConstants.BOTTOM); centerLabel.setHorizontalTextPosition(SwingConstants.LEFT); BlackjackUITest4.java Adding Buttons • To create a button, we use the JButton class JButton cmdDeal = new JButton ("Deal"); • Add button to the content pane content.add(cmdDeal); • Change text of the button with the setText method cmdDeal.setText("Hit"); • Enable/disable the button with setEnabled method cmdDeal.setEnabled(false); Buttons and Events • Button presses trigger action events • Setup a listener for the event – actionPerformed method from ActionListener class – ActionListener class from the java.awt.event package • something else to import ActionListener • Special type of class, called interface • Interface - class that contains only the method headings and a semicolon public interface ActionListener { public void actionPerformed (ActionEvent e); } ActionListener • We can't instantiate an object of ActionListener because there's no implementation • Specify that our class will implement the method actionPerformed public class BlackjackUITest extends JFrame implements ActionListener • Implement actionPerformed method in our class • Specify this class will listen for action cmdDeal.addActionListener(this); Add Buttons // buttons cmdDeal = new JButton ("Deal"); cmdDeal.addActionListener(this); content.add(cmdDeal, BorderLayout.SOUTH); buttonState = IS_DEAL; // state of button cmdNewCard = new JButton ("New Card"); cmdNewCard.addActionListener(this); content.add(cmdNewCard, BorderLayout.NORTH); When Deal button is pressed, change text to Hit. When Hit button is pressed, change text to Deal. When NewCard button is pressed, display a different card in the center region (centerLabel). actionPerformed • Anything we want to access inside the actionPerformed method, we need to declare as member variables – not local to constructor • Make cmdDeal, cmdNewCard, centerLabel member variables instead of local variables public void actionPerformed (ActionEvent e) { if (e.getSource() == cmdDeal) { // deal/hit button pressed if (buttonState == IS_DEAL) { // change text to "Hit" cmdDeal.setText("Hit"); buttonState = IS_HIT; } else { // change text to "Deal" cmdDeal.setText("Deal"); buttonState = IS_DEAL; } } continued on next slide else if (e.getSource() == cmdNewCard) { // new card button pressed // pick a int img = // make a ImageIcon random card (0-52) (int) (Math.random() * 53); temporary ImageIcon temp = new ImageIcon ("img/" + img + ".gif"); // set the member variable to the temp ImageIcon cardImage = temp; // associate the new ImageIcon with the label centerLabel.setIcon(cardImage); } } // end of actionPerformed method BlackjackUITest5.java More Layout • When we added buttons to SOUTH and NORTH regions, it overwrote the text • How to have more than one element in each region? Nest layouts using panels • Use JPanel to create sub-frame where we can place buttons, images, etc. BorderLayout NORTH dealerCardPanel playerCardPanel bottomPanel CENTER SOUTH dealerCardPanel JLabel with ImageIcon JPanel dealerCardPanel = new JPanel (new GridLayout (1, 5)); playerCardPanel JPanel playerCardPanel = new JPanel (new GridLayout (1, 5)); JLabel with ImageIcon bottomPanel JPanel bottomPanel = new JPanel (new GridLayout (3, 1)); JPanel buttonPanel = new JPanel (new GridLayout (1, 3)); tally (wins, losses, ties) instructions Deal/Hit Stand Quit JLabel with ImageIcon JLabel with ImageIcon tally (wins, losses, ties) instructions Deal/Hit Stand Quit BlackjackUI Operation • Array of 54 ImageIcons – one for each card (indices 1-52) – one blank (index 0) – one face-down (index 53) • Array of MAX_CARDS_IN_HAND JLabels, each associated with an ImageIcon for the player's hand and the dealer's hand – score displayed in label index 0 • setCard - finds the index of the specified card (using getFace and getSuit) and picks the correct image to display actionPerformed • Calls various methods based on what button was pressed • dealButtonPressed • standButtonPressed • hitButtonPressed Applets • A Java application is a stand-alone program with a main method • A Java applet is a Java program that is intended to transported over the web and executed using a web browser – an applet doesn't have a main method – needs an extra import statement: import java.applet.Applet; Applets • An applet is embedded into an HTML file using a tag that references the bytecode file (ClassName.class) of the applet class • It is actually the bytecode version of the program that is transported across the web • The applet is executed by a Java interpreter that is part of the browser – this Java interpreter not included in Windows XP, must download from java.com Applet Methods • Several methods from Applet class that are invoked automatically at certain points in an applet's life – init - executed only once when the applet is initially loaded – start - called when applet becomes active (when browser loads / returns to the page) – stop - called when applet becomes inactive (when browser leaves the page) – paint - automatically executed and is used to draw the applets contents Applets and the Web • Basic HTML file for an applet: <html> <body> <applet code = "ClassName.class"> </applet> </body> </html> • Can also specify size of applet window <applet code="ClassName.class" height=200 width=300> </applet> • Put the applet HTML file (named something.html) and your Java applet bytecode (named ClassName.class) in your public_html folder in AFS space. Converting Apps to Applet • See Ch 13, pgs. 745-748 • Extends JApplet instead of JFrame • No main method • No constructor – put code from constructor in init method • No setVisible, setTitle, or setSize methods Want to Learn More? • Creating a GUI with Swing http://java.sun.com/docs/books/tutorial/uiswing/ • Creating Applets http://java.sun.com/docs/books/tutorial/applet/ • Bored this summer? – convert your GUI Calculator to a GUI using Swing that looks more like a real calculator (look at JTextField and JTextArea)