Gnurk! Skrevet 2. november 2011 Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av Gnurk(homesmasher) Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 forøvrig kan jeg jo nevne at når jeg bruker == istedenfor .equals så fungerer programmet, men denne IF'n slår aldri til (testen fungerer ikke) og d blir altså flere av samme kort Lenke til kommentar
Martin HaTh Skrevet 2. november 2011 Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av Martin HaTh Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av Gnurk(homesmasher) Lenke til kommentar
Martin HaTh Skrevet 2. november 2011 Del Skrevet 2. november 2011 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
etse Skrevet 2. november 2011 Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av etse Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 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
etse Skrevet 2. november 2011 Del Skrevet 2. november 2011 (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
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av Gnurk(homesmasher) Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 får det forøvrig med å putte det direkte inn i if testen og med: if(deck[i2].getFace()==kort.getFace()&&deck[i2].getSuit()==kort.getSuit()){ akkurat samme feilmelding, dette er ufroståelig :\ Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 KAN ha funnet feilen nå skal teste, glemte å lage en "exception" for når tabben ikke ennå har blitt delt et kort Lenke til kommentar
etse Skrevet 2. november 2011 Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av etse Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 (endret) 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 2. november 2011 av Gnurk(homesmasher) Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 (endret) fuck alt jeg sa, eneste grunnen til at d fungerte var en feil vei krokkodille tegn som fikk den til å hoppe over equalse funksjonen Endret 2. november 2011 av Gnurk(homesmasher) Lenke til kommentar
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 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 , 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
Gnurk! Skrevet 2. november 2011 Forfatter Del Skrevet 2. november 2011 faen fant just ut at jeg blir NØDT til å sette opp alt på en ann måte -_- i typiske "public/private" metoder etc Lenke til kommentar
jonny Skrevet 3. november 2011 Del Skrevet 3. november 2011 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
Gnurk! Skrevet 3. november 2011 Forfatter Del Skrevet 3. november 2011 de måtte forbli private desverre i forhold til oppgaven, er forøvrig ferdig med denne oppgaven, kan laste opp løsningen etterpå (mangler noen få "syntakser") Lenke til kommentar
Gnurk! Skrevet 8. november 2011 Forfatter Del Skrevet 8. november 2011 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
Gnurk! Skrevet 8. november 2011 Forfatter Del Skrevet 8. november 2011 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå