Gå til innhold

trenger hjelp til card oppgave java


Anbefalte innlegg

Hei emne er pga jeg muligens vil trenge hjelp flere ganger (som sist gang)

 

jeg holder på med en oppgave hvor vi skal lage en kortstokk, som etterhvert skal stokkes, trekkes fra etc etc

 

problemet er at jeg setter meg fast allerede der jeg skal lage kortstokken, dette blir et stort problem.

 

problemet ligger egentlig i å sammenligne den kustomiserte variable card med et annet card, får ikke .equals() til å fungere eller == til å fungere, noen forslag?

 

her er koden for et kort (som vi bare ble gitt, den har jeg ikke laget selv)

 

package minePrograms;
public class card
{
  public final static int ACE   = 1;
  public final static int TWO   = 2;
  public final static int THREE = 3;
  public final static int FOUR  = 4;
  public final static int FIVE  = 5;
  public final static int SIX   = 6;
  public final static int SEVEN = 7;
  public final static int EIGHT = 8;
  public final static int NINE  = 9;
  public final static int TEN   = 10;
  public final static int JACK  = 11;
  public final static int QUEEN = 12;
  public final static int KING  = 13;

  public final static int CLUBS    = 1;
  public final static int DIAMONDS = 2;
  public final static int HEARTS   = 3;
  public final static int SPADES   = 4;

  private final static int NUM_FACES = 13;
  private final static int NUM_SUITS = 4;

  private int face, suit;
  private String faceName, suitName;

  //-----------------------------------------------------------------
  //  Creates a random card.
  //-----------------------------------------------------------------
  public card ()
  {
     face = (int) (Math.random() * NUM_FACES) + 1;
     setFaceName();

     suit = (int) (Math.random() * NUM_SUITS) + 1;
     setSuitName();
  }

  //-----------------------------------------------------------------
  //  Creates a card of the specified suit and face value.
  //-----------------------------------------------------------------
  public card (int faceValue, int suitValue)
  {
     face = faceValue;
     setFaceName();

     suit = suitValue;
     setSuitName();
  }

  //-----------------------------------------------------------------
  //  Sets the string representation of the face using its stored
  //  numeric value.
  //-----------------------------------------------------------------
  private void setFaceName()
  {
     switch (face)
     {
        case ACE:
           faceName = "Ace";
           break;
        case TWO:
           faceName = "Two";
           break;
        case THREE:
           faceName = "Three";
           break;
        case FOUR:
           faceName = "Four";
           break;
        case FIVE:
           faceName = "Five";
           break;
        case SIX:
           faceName = "Six";
           break;
        case SEVEN:
           faceName = "Seven";
           break;
        case EIGHT:
           faceName = "Eight";
           break;
        case NINE:
           faceName = "Nine";
           break;
        case TEN:
           faceName = "Ten";
           break;
        case JACK:
           faceName = "Jack";
           break;
        case QUEEN:
           faceName = "Queen";
           break;
        case KING:
           faceName = "King";
           break;
     }
  }

  //-----------------------------------------------------------------
  //  Sets the string representation of the suit using its stored
  //  numeric value.
  //-----------------------------------------------------------------
  private void setSuitName()
  {
     switch (suit)
     {
        case CLUBS:
           suitName = "Clubs";
           break;
        case DIAMONDS:
           suitName = "Diamonds";
           break;
        case HEARTS:
           suitName = "Hearts";
           break;
        case SPADES:
           suitName = "Spades";
           break;
     }
  }

  //-----------------------------------------------------------------
  //  Determines if this card is higher than the passed card. The
  //  second parameter determines if aces should be considered high
  //  (beats a King) or low (lowest of all faces).  Uses the suit
  //  if both cards have the same face.
  //-----------------------------------------------------------------
  public boolean isHigherThan (card card2, boolean aceHigh)
  {
     boolean result = false;

     if (face == card2.getFace())
     {
        if (suit > card2.getSuit())
           result = true;
     }
     else
     {
        if (aceHigh && face == ACE)
           result = true;
        else
           if (face > card2.getFace())
              result = true;
     }

     return result;
  }

  //-----------------------------------------------------------------
  //  Determines if this card is higher than the passed card,
  //  assuming that aces should be considered high.
  //-----------------------------------------------------------------
  public boolean isHigherThan (card card2)
  {
     return isHigherThan (card2, true);
  }

  //-----------------------------------------------------------------
  //  Returns the face (numeric value) of this card.
  //-----------------------------------------------------------------
  public int getFace ()
  {
     return face;
  }

  //-----------------------------------------------------------------
  //  Returns the suit (numeric value) of this card.
  //-----------------------------------------------------------------
  public int getSuit ()
  {
     return suit;
  }

  //-----------------------------------------------------------------
  //  Returns the face (string value) of this card.
  //-----------------------------------------------------------------
  public String getFaceName ()
  {
     return faceName;
  }

  //-----------------------------------------------------------------
  //  Returns the suit (string value) of this card.
  //-----------------------------------------------------------------
  public String getSuitName ()
  {
     return suitName;
  }

  //-----------------------------------------------------------------
  //  Returns the string representation of this card, including
  //  both face and suit.
  //-----------------------------------------------------------------
  public String toString ()
  {
     return faceName + " of " + suitName;
  }
}

 

 

 

her er koden for det jeg har laget til nå (vet lite, men jeg må fikse dette før jeg kan komme videre)

 

package minePrograms;
import java.util.*;
import minePrograms.card;
public class Oppgave8a {


public static void main(String[] args) {
	card deck[]=new card[52];
	int i=0;
	int i2=0;
	int i3=0;
	boolean samme=false;

	while(i<52){
		card kort=new card();
		while(i2<52){
			//her FUCKER det seg, så jeg får flere av samme kort om jeg brukre == også. med equals blir det bare feilmedling
			if(deck[i2].equals(kort)){
				samme=true;
				i2=52;
			}
			else i2++;
		}
		if(samme==false){
			deck[i]=kort;
			i++;
		}
		System.out.println(kort);
		samme=false;
	}
}

}

 

 

hvordan får jeg sammenlignet card med et annet card? o0 det må da finnes en enkel funksjon for slikt et sted?

Endret av Gnurk(homesmasher)
Lenke til kommentar
Videoannonse
Annonse

Det er fordi to objekter ikke er like, selv om flere (eller alle, for den saks skyld) er like.

Hvis jeg har en klase Bok, med to felt, Tittel og Forfatter, og har to bøker, b1 og b2, så vil ikke disse være like, selv om begge har samme tittel og forfatter.

 

Dette KAN løses ved å override funksjonen equals(slik at den returner True, hvis 'face' og 'suit' er like), ELLER, å sammenlikne toString() verdien fra begge objektene, siden disse vil være like.

 

Beklager hvis jeg missforsto hva du ba om.

Endret av Martin HaTh
Lenke til kommentar

det var absolutt dette jeg spurte om :)

for å "overrid'e" .equals måtte jeg da gått inn i funksjonen equals? eller?

 

kan forøvrig adde at jeg prøvde en ny løsning med

if(deck[i2].face==(kort.face&&deck[i2].suit==kort.suit))

men problemet oppstår jo da disse er sotte til private (error: not visible) kan jeg temporelt gjør dem "visible" inni testen? eller løse dette problemet på en ann måte? (føler jeg nærmer meg værtfall) :9

Endret av Gnurk(homesmasher)
Lenke til kommentar

Da må du gå inn i klassen card (forresten, klassenavn skal gjerne starte med stor forbokstav, selv om det ikke er du som har laget den.), og lage en metode, public boolean equals(card a). Den kan, feks, se slik ut:

public boolean equals(card a){
if(this.face==a.face && this.suit==a.suit){
           return true;
}
return false

Denne metoden vil sammenlikne 'face' og 'suit' fra det kortet som kjører metoden, og kortet som sendes som parameter (a). Hvis du ikke er kjent med this , så betyr det bare feltet i instansen som kjører metoden. Det er ganske nyttig, til tross for hvordan det høres ut, les litt om det.

&& betyr og, hvis du ikke visste det.

 

Får nesten legge til at jeg ikke er en ekspert her, så det er mulig at det ikke kommer til å fungere. Men det kan være greit å teste det ut, siden det gir nyttig erfaring.

Lenke til kommentar

Da må du gå inn i klassen card (forresten, klassenavn skal gjerne starte med stor forbokstav, selv om det ikke er du som har laget den.), og lage en metode, public boolean equals(card a). Den kan, feks, se slik ut:

public boolean equals(card a){
if(this.face==a.face && this.suit==a.suit){
           return true;
}
return false

Denne metoden vil sammenlikne 'face' og 'suit' fra det kortet som kjører metoden, og kortet som sendes som parameter (a). Hvis du ikke er kjent med this , så betyr det bare feltet i instansen som kjører metoden. Det er ganske nyttig, til tross for hvordan det høres ut, les litt om det.

&& betyr og, hvis du ikke visste det.

 

Får nesten legge til at jeg ikke er en ekspert her, så det er mulig at det ikke kommer til å fungere. Men det kan være greit å teste det ut, siden det gir nyttig erfaring.

Face og suit er private, så du kan ikke ta de i bruk på denne måten. Bruk metodene ".getSuit()" og ".getFace()"

 

public boolean equals(card a){
return ( ( this.getFace()==a.getFace() ) && ( this.getSuit()==a.getSuit() ) )
}

Endret av etse
Lenke til kommentar

metoden fungerer ikke ettersom samme error fortsatt blir produsert, kan det være det MÅ sammenlignes i den nye classen ettersom det blir sett på objekt uansett?

produserer uansett samme error som den vanlige equals funksjonen (selv når jeg ga den et annet navn for sikkerhets skyld)

Lenke til kommentar

(bumper fordi du svarte rett etter meg, så nå ser du at du har fått svar). Problemet er at dere prøver å akksesere en "private member", noe som ikke er lov utenfor klassen. Men om man ser i koden har du 2 metoder "getFace()" og "getSuit()" som er public og vil returnere verdiene du trenger :) Se over for eksempel.

Lenke til kommentar

tusen takk :) skal prøve med d nå ^^

 

edit: muligens jeg er fryktelig dum nå, men jeg så ikke noen true/false return på den du suggesta (du forventa nok at jeg fylte ut)

noe jeg gjorde, men får fortsatt error, har jeg sotte dette opp feil på noen måte?

 

i card classen:

 

  public boolean equalse(card a){
   if(this.getFace()==a.getFace()&&this.getSuit()==a.getSuit())
      return true;
      else{
   	   return false;
      }
}

 

 

i

den classen jeg lager:

if(deck[i2].equalse(kort)==true){

 

error koden er: Exception in thread "main" java.lang.NullPointerException

at minePrograms.Oppgave8a.main(Oppgave8a.java:16)

som alltid :\

Endret av Gnurk(homesmasher)
Lenke til kommentar

jeg har ikke noe return true false, siden det boolske-utrykket i seg selv returnerer True eller False, jeg returnerer bare denne verdien direkte.

 

Burde kanskje tenkt på at dette ikke er veldig pedagogisk og enkelt å se i begynnelsen, så beklager det.

Endret av etse
Lenke til kommentar

jeg har ikke noe return true false, siden det boolske-utrykket i seg selv returnerer True eller False, jeg returnerer bare denne verdien direkte.

 

Burde kanskje tenkt på at dette ikke er veldig pedagogisk og enkelt å se i begynnelsen, så beklager det.

ikke noe å beklage :) nå lærte jeg dette og.

 

forøvrig kan jeg nevne at jeg nå har gjort testen slik

if((deck[i2].equalse(kort))&&i!=0){

og jeg får fortsatt error nå, men jeg får ut 1 kort først, så det er tydeligvis noe feil med denne testen? (jeg kalte den equalse, for å unngå å overwrit'e navne med vanlig equals funksjon, ellers brukte jeg din funksjon.

 

har et "else" alternative og, så det skal ikke stå på dette.

Endret av Gnurk(homesmasher)
Lenke til kommentar

ok det fungerer endeli, testen var egentlig helt fin :) så tusen takk for det.

 

var bare litt problemer med "testene" jeg kjørte, glemte å resette i2 verdien f.eks så det ble sammenlignet med deler av arrayet som ikke var dep

 

legger inn koden for interesserte, men det er egentli lite å se :p, tungvinn løsning i know, men nå er kortstokken i boks værtfall, skal bare legge til "trekk kort" "shuffle" og "antall kort" :)

 

package minePrograms;
import java.util.*;
import minePrograms.card;
public class Oppgave8a {


public static void main(String[] args) {
	card deck[]=new card[52];
	int i=0;
	int i2=0;
	boolean samme=false;
	boolean samme2=true;

	while(i<52){
		card kort=new card();
		while((i2<52)&&(i!=0)&&(samme==false)&&(i2<i)){
			if((deck[i2].equalse(kort))){
				samme=true;
			}
			else{
				i2++;
			}
		}
		if(samme==false){
			deck[i]=kort;
			System.out.println(deck[i]);
			i++;
		}
		samme=false;
		i2=0;
	}
	boolean shuffle=false;
	//shuffle
	if(shuffle==true){


//int i3=52;
//card decks[];
//int i4=0;
//	while(i3<52){

	//}
}
}
}

 

Lenke til kommentar

Her er en noe enklere måte å lage en kortstokk på (riktignok sortert, hvis ikke dette er ønskelig må 'shuffle'-funksjonen kjøres på den etterpå):

 

   Card deck[] = new Card[Card.NUM_FACES*Card.NUM_SUITS];

   for(int suit=1; suit <= Card.NUM_SUITS; suit++)
      for(int face=1; face <= Card.NUM_FACES; face++)
         deck[(suit-1)*Card.NUM_FACES+face-1] = new Card(face, suit);

 

Jeg har forøvrig endret navn fra 'card' til 'Card' og gjort NUM_SUITS og NUM_FACES public (ingen grunn til at de skal være private).

Lenke til kommentar

ok jeg delte card classen som det importeres fra i starten (det har lite med poenget å gjøre uansett :) )

 

så jeg lagde en main metode der det skulle vært normale metoder etc, derfor måtte jeg gjør det om. men tror jeg gjorde noe feil (er litt ustød på metoder og det)

 

 

kan noen hjelpe meg til hvorfor jeg ikke får importert deck?

 

her er koden for der jeg vil importere fra

 

package minePrograms;
import java.util.*;

public class Carddeck {
private int i=0;
private int i2=0;
public int antcard=52;
public card drawncard;
private boolean samme=false;
public card[] deck=new card[52];
public card[] Carddeck(){
while(i<52){
	card kort=new card();
	while((i2<52)&&(i!=0)&&(samme==false)&&(i2<i)){
		if((deck[i2].equalse(kort))){
			samme=true;
		}
		else{
			i2++;
		}
	}
	if(samme==false){
		deck[i]=kort;
		//System.out.println(deck[i]);
		i++;
	}
	samme=false;
	i2=0;
}
return deck;
}


public card[] newDeck(){
	card[] newDeck=deck;
	return newDeck;
}
private int i4=0;
public card drawncard() {
	drawncard=deck[i4];
	i4=i4+1;
	int i42=i4-1;
	return deck[i42];
}
public int antcard(){
	antcard = antcard-i4;
	return antcard;
}


	public card[] shuffle(){
	for (int p=0;p<10000;p++){
		int a = (int)Math.random()*52;
		int b = (int)Math.random()*52;

		card tmp = deck[a];
		deck[a] = deck[b];
		deck[b] = tmp;
	}
	return deck;
	}
}

 

 

 

og her er der jeg prøver å importere

 

package minePrograms;
import java.util.*;
import minePrograms.card;
public class Oppgave8a {


public static void main(String[] args) {
deck stokk=new Carddeck;


}


}

 

har forøvrig prøvd med =new deck.Carddeck og, =new deck

Lenke til kommentar

altså for å gjøre klart, jeg lurer litt på om jeg har sotte opp feil i den første koden over? siden jeg ikke får impotert inn deck (skal bare importere inn deck for så å bruke drawcard metoden til å trekke kort til det er tumt), men harke "bynt" der ennå, så for nå lurer jeg bare på importeringen

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...