Exercises in this lecture   Go to the notes, in which this exercise belongs -- Keyboard shortcut: 'u'   Alphabetic index   Course home   

Exercise solution 2.2
Klassen Spillekort


Jeg vil gerne fremhæve konstanterne for kortfarver og værdier (som ikke er numeriske). Læg også mærke til de to private operationer som hjælper toString() med at præsentere et kort på en pæn måde. I praksis ville vi nok ikke implementere ligMed, men derimod redefinere operationen equals. Min udgave af klassen Spillekort ser således ud:

public class Spillekort{

  // Farve konstanter:
  public final static int RUDER = 0;
  public final static int HJERTER = 1;  
  public final static int KLØR = 2;  
  public final static int SPAR = 3;  

  // Værdi konstanter: 
  public final static int KNÆGT = 11;  
  public final static int DRONNING = 12;  
  public final static int KONGE = 13;
  public final static int ES = 1;  

  private int farve;
  private int værdi;

  Spillekort(int farve, int værdi){
    this.farve = farve;
    this.værdi = værdi;
  }

  private String værdiPræsentation(){
    if (this.værdi == ES)            return ("Es");
    else if (this.værdi == KNÆGT)    return ("Knægt");
    else if (this.værdi == DRONNING) return ("Dronning");
    else if (this.værdi == KONGE)    return ("Konge");
    else return (Integer.toString(værdi));
  }

  private String farvePræsentation(){
    switch (this.farve) {
      case RUDER:    return("Ruder"); 
      case HJERTER:  return ("Hjerter");
      case KLØR:     return("Klør");
      case SPAR:     return("Spar");
      default: return("???");
    }
  }

  public String toString(){
    return(farvePræsentation() + " " + værdiPræsentation());
  }

  public boolean ligMed(Spillekort andetKort){
    return(this.farve == andetKort.farve && this.værdi == andetKort.værdi);
  }

  public boolean mindreEnd(Spillekort andetKort){
    int thisReelVærdi  = (this.værdi == 1) ? KONGE+1 : this.værdi;
    int andetKortReelVærdi = (andetKort.værdi == 1) ? KONGE+1 : andetKort.værdi;
    return(thisReelVærdi < andetKortReelVærdi);
  }

  public boolean størreEnd(Spillekort andetKort){
    return !(this.ligMed(andetKort) || this.mindreEnd(andetKort));
  }
}
 

Her er endvidere et link til det rene Java program .

Et helt kortspil kan repræsenteres af klassen KortSpil, som endvidere indeholder et hovedprogram der laver et spil kort:

public class KortSpil{
  
  public Spillekort[] bunke = new Spillekort[52];

  /* Lav et spil kort med 52 kort. */
  public KortSpil(){
    for(int f = Spillekort.RUDER; f <= Spillekort.SPAR; f++)
     for (int v = 1; v <= Spillekort.KONGE; v++){
       Spillekort kort = new Spillekort(f,v);
       bunke[f*13+(v-1)] = kort;
     }
  }

  /* Et hovedprogram som instantierer denne klasse og udskriver KortSpil objektets kort */
  public static void main(String[] args){
    KortSpil spil = new KortSpil();
    for (int i = 0; i < 52; i++)
      System.out.print(spil.bunke[i] + " ");
  }
}

Bemærk at vi samler kortene op i et array af størrelse 52. Bemærk også hvor omstændeligt det er at putte kortene ind i dette array (indeks beregninger). Vi vil senere i kurset møde andre array-linenede klasser, som gør dette meget lettere - og mere elegant.

Her er et link til det rene Java program af KortSpil .