0

I have written a code for a simple card game. Every-time I draw the deck wont decrease and I don't how to avoid it. There are 24 cards on the deck. Every-time I answer Y it draw a card from the deck and remove it but it won't happen on my code.

This is my code:

Opportunity.java

package opportunity;
import java.io.*;

public class Opportunity {
    /*Player 1 */
    public int p1_money = 10000;
    public int p1_card_d = 40;
    public int p1_card_h = 0;
    /*Player 2 */
    public int p2_money = 10000;
    public int p2_card_d = 40;
    public int p2_card_h = 0;
    public int xyz = 0;

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException {
        System.out.print("***************Opportunity***************\n");
        while (true) {
            System.out.println("Do you want to draw a card? Y/N");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s = br.readLine();
            if ("Y".equals(s)) {
                Deck deck = new Deck();
            if (deck.card_deck.get(0).getEnum() == Card.CardType.EVENT) {
                System.out.println("Name: "+deck.card_deck.get(0).getName());
                System.out.println("Cost: "+deck.card_deck.get(0).getCost());
                System.out.println("Effect: "+deck.card_deck.get(0).getProperty("Effect"));
                deck.card_deck.remove(0);
                System.out.println(deck.card_deck.size());
            }
            else if(deck.card_deck.get(0).getEnum() == Card.CardType.ASSET) {
                System.out.println("Name: "+deck.card_deck.get(0).getName());
                System.out.println("Purchase Cost: "+deck.card_deck.get(0).getCost());
                System.out.println("Income: "+deck.card_deck.get(0).getProperty("income"));
                System.out.println("Start Selling Price: "+deck.card_deck.get(0).getProperty("ssp"));
                System.out.println("Selling Price Growth: "+deck.card_deck.get(0).getProperty("spg")+" per turn");
                deck.card_deck.remove(0);
                System.out.println(deck.card_deck.size());
            }
            } else {
               System.out.println("Goodbye!");
               break;
            }
        }
    }
}

Card.java:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package opportunity;

import java.util.*;


/**
 *
 * @author ASUS
 */
public class Card {
    public enum CardType {
        EVENT,
        PROPERTY,
        ASSET;
    }
    private final CardType cardType;
    private final String cardName;
    private final Double cardCost;
    private final Map<String, String> properties = new HashMap<>();

    Card(final CardType cardType, final String cardName, final Double cardCost) {
        this.cardType = cardType;
        this.cardName = cardName;
        this.cardCost = cardCost;
    }

    public Card setProperty(final String name, final String value) {
        properties.put(name, value);
        return this;
    }
    public String getName() {
        return cardName;
    }
    public Double getCost() {
        return cardCost;
    }
    public Enum getEnum() {
        return cardType;
    }
    public String getProperty(final String name) {
        return properties.get(name);
    }
}

Deck.java

package opportunity;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class Deck {
public List<Card> card_deck;
    private int x;

    public Deck() {
        if(x == 0) {
            final Card card1 = new Card(Card.CardType.EVENT, "Get Tax Returns",0.00).
            setProperty("Effect", "Earn money equal to the\n"
                    + "maximum income each of your\n"
                    + "properties can give you,\n"
                    + "depending on their level.");
            final Card card2 = new Card(Card.CardType.EVENT, "BIR Hunting Begins",0.00).
            setProperty("cost", "0.00").
            setProperty("Effect", "An opponent loses\n"
                    + "money equal to 50% of the\n"
                    + "maximum income each of\n"
                    + "their properties can give him or her,\n"
                    + "depending on the level of the\n"
                    + "property.");
            final Card card3 = new Card(Card.CardType.EVENT, "Restore Balance",10000.00).
            setProperty("Effect", "The total income of all\n"
                    + "the players becomes equal to\n"
                    + "the income of the player\n"
                    + "with the lowest income.");
            final Card card4 = new Card(Card.CardType.ASSET, "Vacant Property Lot",7500.00).
                setProperty("income", "1000.00").
                setProperty("ssp", "3250.00").
                setProperty("spg", "5000.00");
            final Card card5 = new Card(Card.CardType.ASSET, "Stock Investment",9000.00).
                setProperty("income", "500.00").
                setProperty("ssp", "4500.00").
                setProperty("spg", "10000.00");
            final Card card6 = new Card(Card.CardType.ASSET, "Time Investment Account",15000.00).
                setProperty("income", "100.00").
                setProperty("ssp", "7500.00").
                setProperty("spg", "15000.00");

                card_deck = new ArrayList<>();
                for (int i=0; i<4; i++) {
                    card_deck.add(card1);
                    card_deck.add(card2);
                    card_deck.add(card3);
                    card_deck.add(card4);
                    card_deck.add(card5);
                    card_deck.add(card6);
                }
                Collections.shuffle(card_deck);
            }
    }
    public List getList(){
        x = 1;
        return card_deck;
    }
}

3 Answers 3

2

You create a new Deck in each iteration :

        if ("Y".equals(s)) {
            Deck deck = new Deck();

This doesn't look right, since it would make the Deck full in each iteration.

Sign up to request clarification or add additional context in comments.

Comments

0

Agreeing with the answer before me: Every iteration you make a new deck.

To solve this:

.... public int xyz = 0;

public Deck gameDeck;
/**
 * @param args the command line arguments
 * @throws java.io.IOException
 */

.... if ("Y".equals(s)) { if(gameDeck==null || gameDeck.card_deck.size()==0){

gameDeck = new Deck();} if (deck.card_deck.get(0).getEnum() == Card.CardType.EVENT) { ....

What this will do is hold 1 deck in place all the time (gameDeck). If that deck does not exist (example: first time we run program), or if it is empty, it will create a new deck (see the if statement I added).

Comments

0

Why not initialize Deck deck = null; and if statement to avoid object creation in each iteration.

public static void main(String[] args) throws IOException {
        System.out.print("***************Opportunity***************\n");
        int setDeck = 0;
        Deck deck = null;
        while (true) {
            System.out.println("Do you want to draw a card? Y/N");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s = br.readLine();
            if ("Y".equals(s)) {
                if (setDeck == 0) {
                    deck = new Deck();
                }
            if (deck.card_deck.get(0).getEnum() == Card.CardType.EVENT) {
                System.out.println("Name: "+deck.card_deck.get(0).getName());
                System.out.println("Cost: "+deck.card_deck.get(0).getCost());
                System.out.println("Effect: "+deck.card_deck.get(0).getProperty("Effect"));
                deck.card_deck.remove(0);
                System.out.println(deck.card_deck.size());
            }
            else if(deck.card_deck.get(0).getEnum() == Card.CardType.ASSET) {
                System.out.println("Name: "+deck.card_deck.get(0).getName());
                System.out.println("Purchase Cost: "+deck.card_deck.get(0).getCost());
                System.out.println("Income: "+deck.card_deck.get(0).getProperty("income"));
                System.out.println("Start Selling Price: "+deck.card_deck.get(0).getProperty("ssp"));
                System.out.println("Selling Price Growth: "+deck.card_deck.get(0).getProperty("spg")+" per turn");
                deck.card_deck.remove(0);
                System.out.println(deck.card_deck.size());
            }
            setDeck = 1;
            } else {
               System.out.println("Goodbye!");
               break;
            }
        }
    }

Comments

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.