1

Not sure if I need to edit this class or not since the cards ARE changing. Just not in order

import java.lang.Integer;

/**
 * This class is used to keep track of playing cards.
 * 
 * @author (name) 
 * @version (date)
 */

public class Card implements Comparable<Card>
{
  public int compareTo(Card otherCard) {
// instance variables - replace the example below with your own
private String denom, suit;

/**
 * Card is to be passed in as a denomination and suit
 */
public Card(String description)
{
    description = description.toUpperCase();

    if( description.length() == 2)
    {
       suit = description.substring(1);
       denom = description.substring(0,1);
    } else if(description.length() == 3) {
       suit = description.substring(2);
       denom = description.substring(0,2);
    } else {
       System.out.print("Error: An invalid card code was given.");
    }
}

/**
 * This will give a string that states a description of the card.
 * @return Card description as a string.
 */
public String getDis()
{               
   //get the description
   String denomMessage = denom;
   if(denom.equals("A"))
      denomMessage = "Ace";
   else if(denom.equals("K"))
      denomMessage = "King";
   else if(denom.equals("Q"))
      denomMessage = "Queen";
   else if(denom.equals("J"))
      denomMessage = "Jack";


   //get the suit
   String suitMessage = suit;
   if(suit.equals("S"))
      suitMessage = "Spades";
   else if(suit.equals("D"))
      suitMessage = "Dimonds";
   else if(suit.equals("C"))
      suitMessage = "Clubs";
   else if(suit.equals("H"))
      suitMessage = "Hearts";
   else 
      suitMessage = "There was a problem";

   return denomMessage + " of " + suitMessage;
}

/**
 * This was written for the purpose of helping to select a card image.
 * @return clubs are 1, hearts are 2, spades are 3, diamonds are 4
 */
public int numSuit()
{
    int value = 0;
    if(suit.equals("C"))
       value = 1;
    else if(suit.equals("H"))
       value = 2;
    else if(suit.equals("S"))
       value = 3;
    else if(suit.equals("D"))
       value = 4;

    return value;
 }

/**
 * This class was written for the purpose of selecting a card image
 * @return ace is a 1, jack is a 11, queen is a 12, king is a 13
 */
public int numDenom()
{
    int value = 0;
    if(denom.equals("A"))
       value = 1;
    else if(denom.equals("J"))
       value = 11;
    else if(denom.equals("Q"))
       value = 12;
    else if(denom.equals("K"))
       value = 13;
    else
       value = Integer.parseInt(denom);

    return value;
 } 


/**
 * Are the two cards the same suit and denomination?
 * @return true or false
 */ 
public boolean equals(Card a)
{
    if(denom.equals(a.denom) && suit.equals(a.suit))
       return true;
    else
       return false;
}

/**
 * I would suggest that you write this method
 */
public int denomCompareTo(Card a)
{

    return a.numDenom() - numDenom();  
 }



 }

All it's doing is changing it's card to the lowest card entered. I have to make it go in order from smallest to largest. no matter what face.

 import java.awt.*;
 import java.io.*;
 import java.applet.*;
 import java.awt.image.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;


 /**
 * This applet is currently working. It will run in a webpage. It will take in card codes such as
 * 2h for the two of heart and "paint" the image of five cards when all five text fields each have a 
 * card coding entered into them. Your assignment will be to write the part of the code 
 * that will sort the cards once they have been entered so that the will be "painted" from smallest
 * to largest denomination regardless of suit as long "None" is selected in the drop down box. In 
 * the event one of the suits is selected that suit will be placed in order first then followed by
 * the rest of the cards in order. To complete the assignment you should read through this class' code 
 * but you will only need to change the section that state that you should change it and possibly 
 * the card class.
 * 
 * @author (Put your name here.) 
 * @version (Put the date here.)
 */
public class CardApplet extends Applet {

Image ic1,ic2,ic3,ic4,ic5;
Card c1,c2,c3,c4,c5;
private TextField cardIn1,cardIn2,cardIn3,cardIn4,cardIn5;
private String message;
private Button enter,sort;
private ButtonListener buttonListen;
private Choice trump;
static final int CARD_WIDTH = 73;
static final int CARD_HEIGHT = 98;

/**
 * This is called an inner class as it is a class writen inside of another class. It is here so 
 * that the buttons will be able to trigger an event.
 */
class ButtonListener implements ActionListener 
{
    /**
     * The name of this method is important and should not be changed. This will take in the
     * "action" of a button being pushed and store reference to it in the object variable e.
     */
    public void actionPerformed(ActionEvent e) 
    {

       String action = e.paramString();

       if( action.indexOf("Enter") >= 0)
       {
           //get text
           String text1 = cardIn1.getText();
           String text2 = cardIn2.getText();
           String text3 = cardIn3.getText();
           String text4 = cardIn4.getText();
           String text5 = cardIn5.getText();

         //Get rid of whitespace before and after string
           text1 = text1.trim();
           text2 = text2.trim();
           text3 = text3.trim();
           text4 = text4.trim();
           text5 = text5.trim();

           message = "Cards Entered";

           //setup cards and card images
           c1 = new Card(text1);
           ic1 = getCardImage(c1);
           c2 = new Card(text2);
           ic2 = getCardImage(c2);
           c3 = new Card(text3);
           ic3 = getCardImage(c3);
           c4 = new Card(text4);
           ic4 = getCardImage(c4);
           c5 = new Card(text5);
           ic5 = getCardImage(c5);
           //this method call is to this class and tells the applet to follow the code of paint again.
           repaint();
       }
       else if( action.indexOf("Sort") >= 0)
       {               
           //ADD YOUR CODE HERE.

         if(c1.denomCompareTo(c2) < 0 )

               ic1 = ic2;
               c1 = c2;
           if(c1.denomCompareTo(c3) < 0 )

               ic1 = ic3;
               c1 = c3;

           if(c1.denomCompareTo(c4) < 0 )

               ic1 = ic4;
               c1 = c4;
           if(c1.denomCompareTo(c5) < 0 )

                   ic1 = ic5;
                   c1 = c5;

           if(c2.denomCompareTo(c1) < 0 )

               ic2 = ic1;
               c2 = c1;

           if(c2.denomCompareTo(c3) < 0 )

               ic2 = ic3;
               c2 = c3;

           if(c2.denomCompareTo(c4) < 0 )

                   ic2 = ic4;
                   c2 = c4;
           if(c2.denomCompareTo(c5) < 0 )

                       ic2 = ic5;
                       c2 = c5;
           if(c3.denomCompareTo(c1) < 0 )

             ic3 = ic1;
             c3 = c1;
           if(c3.denomCompareTo(c2) < 0 )

               ic3 = ic2;
               c3 = c2;
           if(c3.denomCompareTo(c4) < 0 )

               ic3 = ic4;
               c3 = c4;
           if(c3.denomCompareTo(c5) < 0 )

               ic3 = ic5;
               c3 = c5;
           if(c4.denomCompareTo(c1) < 0 )

               ic4 = ic1;
               c4 = c1;
           if(c4.denomCompareTo(c2) < 0 )

               ic4 = ic2;
               c4 = c2;
           if(c4.denomCompareTo(c3) < 0 )

               ic4 = ic3;
               c4= c3;
          if(c4.denomCompareTo(c5) < 0 )

               ic4 = ic5;
               c4 = c5;
          if(c5.denomCompareTo(c1) < 0 )

               ic5 = ic1;
               c5 = c1;
          if(c5.denomCompareTo(c2) < 0 )

               ic5 = ic2;
               c5 = c2;
         if(c5.denomCompareTo(c3) < 0 )

               ic5 = ic3;
               c5 = c3;
         if(c5.denomCompareTo(c4) < 0 )

               ic5 = ic4;

         c5 = c4;


           //DO NOT CHANGE CODE PAST THIS LINE.
           message = "Sorted";
           repaint();
       }    

  }
} //end of inner class.


/**
 * This method is called when the applet is first started. It will setup the layout of the applet.
 */
public void init() {

    //This is the text that prints in the gray box towards the bottem of the applet.
    message="Let us get started ";

    //Sets the back ground color of the the applet
    setBackground(Color.GREEN);

    // Set default layout manager
    setLayout(new FlowLayout() );

    //setup textboxes for entering in cards
    cardIn1 = new TextField("Enter",4);
     add(cardIn1);
    cardIn2 = new TextField("cards ",4);
     add(cardIn2);
    cardIn3 = new TextField("using",4);
     add(cardIn3);
    cardIn4 = new TextField("Chap 5",4);
     add(cardIn4);
    cardIn5 = new TextField("coding",4);
     add(cardIn5);

    //place buttons
    buttonListen = new ButtonListener();
    enter = new Button("Enter");
     enter.addActionListener(buttonListen);
     add(enter);
    sort = new Button("Sort");
     sort.addActionListener(buttonListen);
     add(sort);

    //setup dropdown
    trump = new Choice();
      trump.addItem("None");
      trump.addItem("Hearts");
      trump.addItem("Diamonds");
      trump.addItem("Spades");
      trump.addItem("Clubs");
      add(trump);

    //Since the card object variables are null each image object variable
    //will hold reference to a card back image.
    ic1 = getCardImage(c1);
    ic2 = getCardImage(c2);
    ic3 = getCardImage(c3);
    ic4 = getCardImage(c4);
    ic5 = getCardImage(c5);

}

/*
 * This class is used to place graphics on an applet.
 */
public void paint(Graphics g) {

    //places cards on applet
    int linePos = 70;
    g.drawImage(ic1,19,linePos,this);
    g.drawImage(ic2,19+CARD_WIDTH,linePos,this);
    g.drawImage(ic3,19+2*CARD_WIDTH,linePos,this);
    g.drawImage(ic4,19+3*CARD_WIDTH,linePos,this);
    g.drawImage(ic5,19+4*CARD_WIDTH,linePos,this);

    // simple text displayed on applet
    g.setColor(Color.lightGray);
    g.draw3DRect(2, 175, 200, 20, true);
    g.fillRect(2, 175, 200, 20);
    g.setColor(Color.black);
    g.drawString(message, 4, 190);
}

/**
 * This will select either the correct portion of the cards image based on the suit and denomination or
 * the card back image.
 * @param a The card object holds the suit and denomination in state.
 * @return It returns an image object variable with holds reference to a image that was created for a card that was passed in.
 * @throws MalformedURLException 
 */
public Image getCardImage(final Card a) 
{        




            int cardDenom,cardSuit;
            Image playingCards = null;
            ImageFilter cardFilter;
            ImageProducer cardProducer;

    if( a == null)
    {
        playingCards = getImage(getCodeBase(), "cardBack.png");


    }else{
       playingCards = getImage(getCodeBase(),"cards.png");

       cardDenom = (a.numDenom()*CARD_WIDTH)- CARD_WIDTH;
       cardSuit = (a.numSuit()*CARD_HEIGHT) - CARD_HEIGHT;
       cardFilter = new CropImageFilter(cardDenom,cardSuit,CARD_WIDTH,CARD_HEIGHT);
       cardProducer = new FilteredImageSource(playingCards.getSource(),cardFilter);
       playingCards = createImage(cardProducer);
    }

    return playingCards;




}

}
HanDolo
  • 21
  • 4
  • 2
    Let the `Card`class implement `Comparable`, if you want the class to make sorting based on a single field ( like Denomination/Rank of the card), else you can use `Comparator`, that will allow one, to sort the class based on various values (lwhich it seems, is not required, in this game of cards). Moreover, the `denomCompareTo(...)`method, should return `numDenom() - a.numDenom()`, instead of other way around, for sorting from lowest to highest value. – nIcE cOw Mar 07 '15 at 01:40
  • @nIcEcOw Okay I did the Comparable but it does the same thing. Is my code after "// ADD YOUR CODE HERE" in the applet wrong? – HanDolo Mar 07 '15 at 01:47
  • NEED HELP DUE IN 1 HR – HanDolo Mar 07 '15 at 03:44
  • @HanDolo is there a reason you keep trying to remove the code from the answer I posted? I thought it would be good to leave it there for your review. – sova Mar 08 '15 at 22:51

1 Answers1

1

nIcE cOw is correct in mentioning Comparable

from http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

Which means that your implementation of Comparable for your objects (cards) should follow that convention.

In your top code section

public int denomCompareTo(Card a) 
{
  if ( a.numDenom() <  this.numDenom() ) //the value of card a is less
  { return -1; }
  else if ( a.numDenom() == this.numDenom() ) //equality
  { return 0; }
  else //otherwise.. whatever's left (a must be greater)
  { return 1;}
}

Read that over until you understand it. Comparable is the method you want to definitely work. It's going to be invoked by calling

FirstCard.CompareTo( SecondCard );

that line of code is going to return a value of either -1, 0, or 1. Depending on which is greater, or 0 if they are equal. That's all a sorting algorithm really /needs/ to be able to figure out an ordering.

So that's the code you need for Comparable. Please look it over until you understand it.

The code in the second portion,

else if( action.indexOf("Sort") >= 0)
{               
    //ADD YOUR CODE HERE.
    ...   
}

Needs to be updated to reflect how Comparable works.

So I am guessing this is a button or action thingy, and if you specify Sort then we want to sort the cards. Fair enough. Well, where are the cards stored? It looks like in a bunch of variables named c(number) and ic(number) for the image. Like c1 and ic1, c2 and ic2. In the future, look into using arrays.

So your code is almost correct for this portion! It's just that you need a temporary value to store the old card. Otherwise you're overwriting it everytime.

For example: First basket is an apple, Second basket is a grape.

If you say "Hey, put the contents of the 2nd basket into the 1st" then the first one becomes grape. The second one is also (still) grape. Where did apple go? We lost it because computers are mercilessly true to your instructions. We need to store the old card in a new variable.

So when you say

if(c1.denomCompareTo(c2) < 0 ) { //for the love of jobe please use braces for multiline if statements
           ic1 = ic2;
           c1 = c2;
 }

The original ic1 and c1 are being overwritten and lost.

You can fix this by using a temporary variable or swapping variable, or when you get really clever, using XOR (ask your nerdy friends)

Image tempImg;
Card tempCard;


if(c1.denomCompareTo(c2) < 0 ) {  //meaning if card1 is less than card2

    tempImg = ic1;  //store card1 temporarily
    tempCard = c1;

    ic1 = ic2;  //copy vals of card2 to card1 slots
    c1 = c2;

    ic2 = tempImg; //slide the original val of ic1 here
    c2 = tempCard;
 }

Granted, your sorting algorithm is accurate, but will require many passes if the cards are in any funky ordering. Which is why you'll probably have to loop over these instructions several times. You're doing something incrementally usually referred to as "bubble sort" ... If you need help looping over your sorting, just let us know.

Here are some examples:

I am posting a very quick reference example for you to look at. It is not that tough to understand, though, once you will understand it, things will become a bit more easier.

import java.util.*;

enum Suit {
    HEART,
    DIAMOND,
    CLUB,
    SPADE
}

class Card implements Comparable<Card> {
    private int rank;
    private Suit suit;

    public Card ( int rank, Suit suit ) {
        this.rank = rank;
        this.suit = suit;
    }

    public int getRank () {
        return rank;
    }

    public void setRank ( int rank ) {
        this.rank = rank;
    }

    public Suit getSuit () {
        return suit;
    }

    public void setSuit ( Suit suit ) {
        this.suit = suit;
    }

    @Override
    public int compareTo ( Card anotherCard ) {
        return this.rank - anotherCard.rank;
    }

    @Override
    public String toString () {     
        return String.format ("Suit: %8s Rank: %8s", suit, rank);
    }
}

public class CardsExample {

    private static final int TOTAL_CARDS = 52;
    private static final int CARDS_PER_SUIT = 13;
    private static final int TOTAL_SUITS = 4;
    private List<Card> deck;

    public CardsExample () {
        deck = new ArrayList<Card> ();      
    }

    private void createDeck () {
        for ( Suit suit : Suit.values () ) {
            for ( int i = 0; i < CARDS_PER_SUIT; ++i ) {
                deck.add ( new Card ( i, suit ) );
            }
        }
    }

    private void displayDeck () {
        for ( Card card : deck ) {
            System.out.println ( card );
        }
    }

    private void performTask () {
        createDeck ();
        Collections.shuffle ( deck );
        System.out.println ( "Before SORTING" );
        displayDeck ();
        Collections.sort ( deck );
        System.out.println ( "After SORTING" );
        displayDeck ();
    }

    public static void main ( String[] args ) {
        new CardsExample ().performTask ();
    }
}

EDIT:

If one wants to sort cards, in terms of their Suit first, then one can use Comparatortoo, in this example, for which not much of a change is required, just change the enum part, as shown below and provide implementation for Comparator < Card >, within the Cardclass, and let Collections.sort ( deck, suitComparator )do the work, as shown in this example.

import java.util.*;

enum Suit {
    HEART ( 0 ),
    DIAMOND ( 1 ),
    CLUB ( 2 ),
    SPADE ( 3 );

    private int value;

    private Suit ( int value ) {
        this.value = value;
    }

    public int retrieveValue () {
        return value;
    }
}

class Card implements Comparable < Card > {
    private int rank;
    private Suit suit;

    public static Comparator < Card > suitComparator = 
                        new Comparator < Card > () {
        @Override
        public int compare ( Card someCard, Card anotherCard ) {
            return someCard.suit.retrieveValue () - anotherCard.suit.retrieveValue ();
        }
    };

    public Card ( int rank, Suit suit ) {
        this.rank = rank;
        this.suit = suit;
    }

    public int getRank () {
        return rank;
    }

    public void setRank ( int rank ) {
        this.rank = rank;
    }

    public Suit getSuit () {
        return suit;
    }

    public void setSuit ( Suit suit ) {
        this.suit = suit;
    }

    @Override
    public int compareTo ( Card anotherCard ) {
        return this.rank - anotherCard.rank;
    }

    @Override
    public String toString () {     
        return String.format ( "Suit: %8s Rank: %8s", suit, rank );
    }
}

public class CardsExample {

    private static final int TOTAL_CARDS = 52;
    private static final int CARDS_PER_SUIT = 13;
    private static final int TOTAL_SUITS = 4;
    private List < Card > deck;

    public CardsExample () {
        deck = new ArrayList < Card > ();       
    }

    private void createDeck () {
        for ( Suit suit : Suit.values () ) {
            for ( int i = 0; i < CARDS_PER_SUIT; ++i ) {
                deck.add ( new Card ( i, suit ) );
            }
        }
    }

    private void displayDeck () {
        for ( Card card : deck ) {
            System.out.println ( card );
        }
    }

    private void performTask () {
        createDeck ();
        Collections.shuffle ( deck );
        System.out.println ( "Before SORTING" );
        displayDeck ();
        Collections.sort ( deck );
        Collections.sort ( deck, Card.suitComparator );
        System.out.println ( "After SORTING" );
        displayDeck ();
    }

    public static void main ( String[] args ) {
        new CardsExample ().performTask ();
    }
}

Good luck

nIcE cOw
  • 24,468
  • 7
  • 50
  • 143
sova
  • 5,468
  • 10
  • 40
  • 48