0

I am trying to create a toString to print the detail of my array. I can have it print how I want it to look by doing a for loop and using print line with in the toString but obviously dosn't really work when I want to use it in the main part of my code.

For context this is what I have for Card:

/** 
 * Constructor for the card. If damageDone and mana are negative they are replaced by 1 
 * (not the best solution but the good enough until we cover exception handling later in the 
 * semester). <br>
 * My solution length: 8 lines
 * @param manaCost - The amount of mana this spell costs to cast
 * @param damageDone - The amount of damage done by this card
 * @param name  - the name of this card
 */

public Card(int manaCost, int damageDone, java.lang.String name) {
    if (damageDone < 0) {
        this.damageDone = 1;}
    else {this.damageDone = damageDone;}
    if (manaCost < 0) {
        this.manaCost = 1;}
    else {this.manaCost = manaCost;}
    this.name = name;}

This is my example this piece of code works as to what I want it to look like but actually brings back no result:

public java.lang.String toString(){
    int count = 0;
    for (int index = 0; index < card.length; index++) {
        count++; 
        System.out.println(count + ": " + card[index]); 
    }
    return "";}

So I tried to build a string method but it brings back no results, I am so confused. Has anyone got any idea where I am going wrong.

@Override
public java.lang.String toString(){
    String output = "";
    for (int index = 0; index < card.length; index++) {
        output = output + card[index];
    }
    return output;}

The full class I am working on is below I am still having issues on other areas that I am working through:

public class Deck {

    private Card[] card = new Card[100];

private int cardsRunning = 100;
static int DECKSIZE = 100;
static java.lang.String emailID = "MITNY013";
private boolean random = true;



/**
 * Constructor for the Deck. Adds the following cards to the deck in the following order
 * 4x Super Lucky Strike, Damage 100, Mana 2 
 * 6x Mega Santa Hit, Damage 80, Mana 2
 * 10x Critical Hit, Damage 50, Mana 5
 * 10x Massive Strike, Damage 40, Mana 7
 * 15x Wrong Way Down A One Way Street, Damage 30, Mana 10
 * 15x Bender Rules Here, Damage 15, Mana 10
 * 40x Trade, Damage 5, Mana 5 <br>
 * My solution length: 16 lines (space lines not included)
 * @param random - Whether to turn on random features
 */

public Deck(boolean random) {
    for (int index = 0; index <= 3; index++) {
        card[index] = new Card( 2, 100, "Lucky Strike");
    }
    for (int index = 4; index <= 10; index++) {
        card[index] = new Card( 2, 80, "Santa Hit");
    }
    for (int index = 11; index <= 20; index++) {
        card[index] = new Card( 5, 50, "Critical Hit");
    }
    for (int index = 21; index <= 30; index++) {
        card[index] = new Card ( 7, 40, "Massive Strike");
    }
    for (int index = 31; index <= 45; index++) {
        card[index] = new Card( 10, 30, "Wrong Way Down A One Way Street");
    }
    for (int index = 46; index <= 60; index++) {
        card[index] = new Card( 10, 15, "Bender Rules Here");
    } 
    for (int index = 61; index <= 99; index++) {
        card[index] = new Card( 5, 5, "Trade");
    } 
}

/**
 * Returns a string representation of the entire deck in the format
 * Deck [ 1:Card [name=Super Lucky Strike, manaCost=2, damageDone=100]
 *        2:Card [name=Super Lucky Strike, manaCost=2, damageDone=100]
 *        3:Card [name=Super Lucky Strike, manaCost=2, damageDone=100]
 *        4:Card [name=Super Lucky Strike, manaCost=2, damageDone=100]] <br>
 * My solution length: 7 lines
 * @overrides - toString in class java.lang.Object
 */

@Override
public java.lang.String toString(){
    String output = "";
    for (int index = 0; index < card.length; index++) {
        output = output + card[index];
    }
    return output;}



/**
 * Uses a random number generator to get a card from the deck somewhere then swaps the 
 * last card in the deck to that position and reduces the cardsRemaining by one. 
 * This is important. if the random flag is false you should always get the card at 
 * position 0. When you swap the card out you should also set the old position to null 
 * for safety. <br>
 * My solution length: 10 lines
 * @return - the card drawn or null if no cards left in deck
 */

public Card getRandomCard() {
    // use random number generator
    Random rand = new Random();
    int randomCardNo = rand.nextInt(getCardsRemaining());
    removeCard(randomCardNo);
    return card[randomCardNo];
}

/**
 * Return the number of cards remaining in the deck.
 * My solution length: 6 lines
 * @return - the total cards remaining
 */

public int getCardsRemaining() {
    int temp = 100;
    for (int index = 0; index < card.length; index++) {
        if ((card[index] == null) ) {
            temp = temp -1;
        }}
    cardsRunning = temp;
    return cardsRunning;}

/**
 * BONUS Method
 * My solution length: XXX
 * @return - shuffle cards in deck 
 */

public void shuffle(Card[] card) {
    int index; 
    Card temp;
    Random random = new Random();
    for (int i = card.length - 1; i > 0; i--){ 
        index = random.nextInt(i + 1);
        temp = card[index];
        card[index] = card[i];
        card[i] = temp;}}

private void removeCard(int no) {
    int size = card.length;
    Card[] newCard = new Card[size];
    int index = 0;
    for (int i = 0; i < size; i++) {
        if (card[i] != null) {
            newCard[index++] = card[i];
        }
    }
    }
}
3
  • Use System.out.println() for your second approach. Commented Feb 8, 2020 at 21:45
  • 2
    If card.lenght > 0, then something should be returned. Please post a minimal reproducible example. --- A remark on your code: java.lang.String can be simplified to just String. The java.lang package is always implicitly imported. Commented Feb 8, 2020 at 21:45
  • Can you please post some of your code. Commented Feb 8, 2020 at 22:18

2 Answers 2

1

You need to override the toString method in both, Card and Deck classes as given below:

public class Card {
    int manaCost;
    int damageDone;
    String name;

    public Card(int manaCost, int damageDone, String name) {
        if (damageDone < 0) {
            this.damageDone = 1;
        } else {
            this.damageDone = damageDone;
        }
        if (manaCost < 0) {
            this.manaCost = 1;
        } else {
            this.manaCost = manaCost;
        }
        this.name = name;
    }

    // ...

    @Override
    public String toString() {
        return "Card [manaCost=" + manaCost + ", damageDone=" + damageDone + ", name=" + name + "]";
    }
}

public class Deck {
    private Card[] cards;

    public void setCards(Card[] cards) {
        this.cards = cards;
    }

    // ...

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < cards.length; i++) {
            sb.append(cards[i].toString() + "\n");
        }
        return sb.toString();
    }
}

Test:

public class Main {
    public static void main(String[] args) {
        Card[] cards= {
                new Card( 2, 100, "Lucky Strike"),
                new Card( 2, 80, "Santa Hit"),
                new Card( 5, 50, "Critical Hit")
        };
        Deck deck1 = new Deck();
        deck1.setCards(cards);
        System.out.println(deck1);
    }
}

Output:

Card [manaCost=2, damageDone=100, name=Lucky Strike]
Card [manaCost=2, damageDone=80, name=Santa Hit]
Card [manaCost=5, damageDone=50, name=Critical Hit]
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks Arvind, this has helped thank you. now I can move onto what is going wrong with my get random and get cards remaining
0

It would be nice to know what a card is. That being said, a really easy way to do this is using Arrays#toString.

public java.lang.String toString(){
    return Arrays.toString(card);
}

1 Comment

Hi Jason, I have added what a Card is to my original message

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.