Avatar billede rockie6 Nybegynder
07. oktober 2002 - 08:21 Der er 15 kommentarer

Kort

Jeg skal have nedenstpende kode, så kortene ligger i rækkefølge afhængig af farve, og værdi... Den skal ligeledes også køre helt op til kongen!!!


import java.util.*;

public class Opgaver
{
  public static void main(String[] arg)
  {
    Vector bunke;
    bunke = new Vector();

    // Opbyg bunken
    for (int n=2; n<9; n++)
    {
      bunke.addElement("ruder"+n);  // ruder
      bunke.addElement("klør"+n);  // klør
      bunke.addElement("spar"+n);  // spar
    }

    System.out.println("Før blanding: "+bunke);
    int antalKort = bunke.size();

    // Bland bunken
    for (int n=0;n<100;n++)
    {
      int nr;
      nr = (int) (Math.random() * antalKort);    // find en tilfældig plads

      String kort = (String) bunke.elementAt(nr); // tag et kort ud

      bunke.removeElementAt(nr);

      nr = (int) (Math.random() * antalKort);
      bunke.insertElementAt(kort,nr);                  // sæt det ind et andet sted

    }
   
    System.out.println("Efter blanding: "+bunke);
  }
}
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 08:30 #1
Du kunne f.eks. give hvert kort et unikt nr, som f.eks. 100 - 113 til ruder og 200 - 213 klør og derved sortere på tallet med f.eks. en Bubblesort, jeg ved ikke om Bubblesort er den bedste men det var lige den jeg kunne huske :-)
Avatar billede rockie6 Nybegynder
07. oktober 2002 - 08:31 #2
Hmmm..,. Jeg ved godt hvilke muligheder der findes... men jeg skal have hele koden for de point
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 08:43 #3
Ok, er det så iorden at man laver en klasse der hedder Kort;

public class Kort
{
  private int key, nr;
  private String type;

  public Kort(int, key, String type, int nr)
  {
    this.key = key;
    this.type = type;
    this.nr = nr;
  }

  private int getKey(){ return this.key; }
  private int getNr(){ return this.nr; }
  private String getType(){ return this.type; }
}

Og derefter skal du når du adder sige bunke.addElement(new Kort("100", "Klør", n));

Derefter finder du en sorteringsalgoritme der virker, jeg har ikke lige en ved hånden, eller du løber alle objekterne igennem med en for.
Og tjekker størelsen og placeringen med kort.getKey().

Du kan også sortere dem med det samme ved at sige add(key, new Kort(key, "Klør", n)
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 08:44 #4
Det giver selvfølgelig en stor Vector med en masse tomme felter, men det er da en løsning :-)
Avatar billede rockie6 Nybegynder
07. oktober 2002 - 08:46 #5
Jeg er total begynder, så det siger mig ikke meget... Jeg skal bare have hele koden!! Desværre
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:05 #6
Det her virker sådan at bunke er sorteret ved start:

import java.util.*;

public class Opgaver
{
  public static void main(String[] arg)
  {
    Vector bunke;
    bunke = new Vector();

    // Opbyg bunken
    String kortType[] = {"klør", "spar", "hjerter", "ruder"};
    int nrKort = 0;
    for (int i=0; i<4; i++)
    {
        for (int n=1; n<14; n++)
        {
            bunke.addElement((kortType[i] + " " + n));
        }
        nrKort += 13;
    }

    System.out.println("Før blanding: "+bunke);
    int antalKort = bunke.size();

    // Bland bunken
    for (int n=0;n<100;n++)
    {
      int nr;
      nr = (int) (Math.random() * antalKort);    // find en tilfældig plads

      String kort = (String) bunke.elementAt(nr); // tag et kort ud

      bunke.removeElementAt(nr);

      nr = (int) (Math.random() * antalKort);
      bunke.insertElementAt(kort,nr);                  // sæt det ind et andet sted

    }
 
    System.out.println("Efter blanding: "+bunke);
  }
}
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:16 #7
Og istedet for at blande med :
for (int n=0;n<100;n++)
    {
      int nr;
      nr = (int) (Math.random() * antalKort);    // find en tilfældig plads

      String kort = (String) bunke.elementAt(nr); // tag et kort ud

      bunke.removeElementAt(nr);

      nr = (int) (Math.random() * antalKort);
      bunke.insertElementAt(kort,nr);                  // sæt det ind et andet sted

    }
Kan du gøre det hurtigt med

Collections.shuffle(bunke);

Det giver samme effekt :-)
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:17 #8
Desuden har Collections også en Sort
Collections.sort(bunke);
Den sortere elementerne i Vector, problemet er bare at så skal du have en indikator foran, som f.eks. "101 Klør 1", så ville det også virke !
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:20 #9
Og jeg kan nok gætte at du gerne vil have koden så denne kode gør faktisk det du beder om:

import java.util.*;

public class Opgaver
{
  public static void main(String[] arg)
  {
    Vector bunke;
    bunke = new Vector();

    // Opbyg bunken
    String kortType[] = {"klør", "spar", "hjerter", "ruder"};
    int nrKort = 0; //unik nr
    for (int i=0; i<4; i++)
    {
        for (int n=1; n<14; n++)
        {
            bunke.addElement((nrKort + " - " + kortType[i] + " " + n));
            nrKort++;
        }
    }

    System.out.println("Før blanding: "+bunke);
    int antalKort = bunke.size();

    //bland bunken
    Collections.shuffle(bunke);
    System.out.println("Efter blanding: "+bunke);
   
    //sorter bunken
    Collections.sort(bunke);
   
    System.out.println("Efter sortering: "+bunke);
  }
}
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:22 #10
Ups en mindre fejl skift lige følgende kode ud så "skulle" det virke:

// Opbyg bunken
    String kortType[] = {"klør", "spar", "hjerter", "ruder"};
    int nrKort = 0; //unik nr
    for (int i=0; i<4; i++)
    {
        for (int n=1; n<14; n++)
        {
            if(nrKort < 10)
                bunke.addElement(("0"+nrKort + " - " + kortType[i] + " " + n));
            else
                bunke.addElement((nrKort + " - " + kortType[i] + " " + n));
            nrKort++;
        }
    }
Avatar billede disky Nybegynder
07. oktober 2002 - 09:35 #11
hbhansen:
Der er flere fejl i din kode.

Man laver normalt aldrig sådanne noget i main() metoden, da den er statisk. Man kalder konstruktoren for klassen og kører på klasse niveau.

Vector bunke;
    bunke = new Vector();

Det gør man heller ikke.
Man angiver altid interface typen, i stedet for klasse typen, så kan man MEGET lettere skift List type hvis man vil, og Vector anvender man også KUN hvis man vil sikre at metode kald er Syncronized, Vector er nemlig langsommere end ArrayList.

Så ovenstående skulle for at være korrekt nok nærmere være:
List bunke;
    bunke = new ArrayList();

Selvfølgelig virker din udgave også, den performer bare dårligere og der er en alt for hård kobling imellem objekt og type,. som skaber problemmer senere evt.
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:37 #12
Det er jeg fulstændig godt klar over, som jeg nok skrev tidligere så ville jeg selv have lavet det på en helt anden måde, men jeg tog bare udgangspunkt i hans kode og så bygget det derudfra.
Men jeg er godt klar over at der er fejl og det kunne gøres på en anden måde :-)
Avatar billede disky Nybegynder
07. oktober 2002 - 09:41 #13
det glæder mig.

Synes bare det er vigtigt og nævne det for opgavestilleren, så han/hun ikke får dårlige vaner allerede nu.
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 09:45 #14
Helt enig :-) Sådanne dårlige vaner er svære at komme af med igen !
Avatar billede jakoba Nybegynder
07. oktober 2002 - 13:48 #15
Skal det absolut være en Vector?  det er da ret overkill her.

// filen KortSpil.java


// **************** Klassen Kort
// constructor
//  public Kort( int nummer );  // 0..51
//  public Kort( String farve, String verdi ); // se arrays 'farver' og 'verdier'
//metoder:
//  public int compareTo ( Kort b )// [-1,0,1] for [ a>b, a==b, a<b ]
//  public int getNummer();      //eg  40 
//  public String toString();    //eg: "klør-knægt"

class Kort {

  private static final String[] farver =
                  { "klør", "ruder", "hjerter", "spar" };
                 
  private static final String[] verdier =
                  { "1", "2", "3", "4", "5", "6", "7",
                    "8", "9", "10", "knægt", "dame", "konge" };
                   
  private int kortNummer;  // kort er nummereret fra 0 til 51

  public Kort( int nummer ) {
      if ( nummer < 0 || nummer > 51 ) {
          System.out.println( "Ugyldig parameter til Kort ( "+nummer+" )\nbruger " +(nummer%52) );
      }
      this.kortNummer = nummer % 52;
  } //endconstructor Kort( int )

  public Kort( String farve, String verdi ) {
      int fIdx,vIdx;
      for ( fIdx=0; fIdx<farver.length; fIdx++) {
          if ( farver[fIdx].equals(farve) ) break;
      }
      if ( fIdx >= 4 ) {
          System.out.println( "Ugyldig parameter til Kort  \""+farve+"\"\nbruger 0" );
          fIdx = 0;
      }
      for ( vIdx=0; vIdx<verdier.length; vIdx++) {
          if ( verdier[vIdx].equals(verdi) ) break;
      }
      if ( vIdx >= 13 ) {
          System.out.println( "Ugyldig parameter til Kort  \""+verdi+"\"\nbruger 0" );
          vIdx = 0;
      }
      this.kortNummer = vIdx<<2 +fIdx;
  } //endconstructor Kort( String, String )

  public int compareTo ( Kort b ) {
      if ( this.kortNummer == b.kortNummer ) return 0;
      if ( this.kortNummer > b.kortNummer ) return 1;
      return -1;
  } //endmethod compareTo
 
  public int getNummer() {
      return kortNummer;
  } //endmethos getNummer

  public String toString() {
      return  farver[this.kortNummer&3] +"-" +verdier[this.kortNummer>>2];
  } //endfunction toString

} //endclass Kort



// **************** Klassen Spil
// constructor
//  public Spil();              // opret kortspil med 52 kort
//metoder
//  public void bland();        // blander kortene
//  public int  reset();        // start forfra på samme bunke
//  public Kort giv();          // giv et kort fra bunken (eller null)
//  public boolean endOfSpil();  // true når alle kort gevet

class Spil {  // testklasse for klassen kort.

  public final static int ANTAL_KORT = 52;
  private Kort[] spil = new Kort[ANTAL_KORT];
  private int neste;
     
  public Spil() {
      for (int i=0; i<ANTAL_KORT; i++) {
        spil[i] = new Kort(i);
      }
      neste = 0;
  } //endconstructor KortSpil
 
  public void bland() {
      int i,j;
      Kort tmp;
      for ( i=ANTAL_KORT-1; i>0; i--) {
        tmp = spil[i];
        j = (int)Math.floor( Math.random() * i );
        spil[i] = spil[j];
        spil[j] = tmp;
      }
      neste = 0;
  } //endmethod bland
 
  public int reset() {
      return ( neste = 0 );
  } //endmethod reset
 
  public Kort giv() {
      if ( neste < ANTAL_KORT ) {
        return spil[neste++];
      } else {
        return null;
      }
  } //endmethod giv
 
  public boolean endOfSpil() {
      return ( neste == ANTAL_KORT );
  } //endmethod endOfSpil

} //endclass Spil



// *************** klassen KortSpil

// testklasse for klasserne Spil og Kort

class KortSpil {
 
  public static void udskrivSpil( Spil s ) {
      s.reset();
      int teller = 0;
      while ( ! s.endOfSpil() ) {
        System.out.print( s.giv().toString()+", " );
        if ( ( ++teller & 3 ) == 0 ) {
            System.out.println();
        }
      }
      System.out.println();
  }

  public static void main ( String[] args ) {

      Spil s = new Spil();
      udskrivSpil( s );

      s.bland();
      udskrivSpil( s );

  } //endmethod main
 
} //endclass KortSpil
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester