2012-05-05 6 views
5

Vedo un sacco di domande simili a questa ma a cui viene risposto un codice che non ho ancora appreso. Dovrei essere in grado di svolgere questo compito senza un arraylist, quindi è una sfida per me. Ho bisogno di giocare a un gioco di guerra: creare una classe di carte, creare un mazzo e poi generare casualmente la prima carta, "rimuovere" la carta dal mazzo e produrre una seconda carta per vedere quale carta ha vinto, continuare questo confronto fino a il mazzo è esaurito. Ecco quello che ho finora:Codice Java per la selezione e il confronto delle carte (senza Arraylist)

public class Card 
{ 
private int cardValue; 
private String cardSuit; 
private String stringValue; 
static final String[] SUIT = {"Clubs", "Diamonds", "Hearts", "Spades"}; 
static final String[] VALUE = {"Ace","Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"}; 


/** 
*CONSTRUCTOR for Card class 
*contains the arrays for both suit and values 
**/ 
public Card (int cardS, int cardV) 
{ 

    cardSuit = SUIT[cardS]; 
    stringValue = VALUE[cardV]; 
} 

/** 
*Get method for card suit, access the value of cardSuit 
**/ 
public String getCardSuit() 
{ 
     return cardSuit; 
} 

/** 
*get method for card's VALUES 
**/ 
public String getValue() 
{ 
    return stringValue; 
} 
//in order to display string value of cards 
public String toString() 
{ 
    return String.format("%s of %s", stringValue, cardSuit); 
} 

}

public class Deck 
    { 
    private final int HIGH_SUIT=3; 
    private final int HIGH_VALUE=12; 

    int i = 0; 
    int cardCount;    

    Card[] fullDeck = new Card[52]; 
    public Deck() 
    { 

     for(int s = 0; s <= HIGH_SUIT; s++) 
     { 
      //for loop to determine the suit 
      for (int v = 0; v <= HIGH_VALUE; v++) 
      { 
       //construct all 52 cards and print them out 
       fullDeck[i] = new Card(s, v); 
       cardCount = (i + 1); 
       i++;//increment the card counter 

      } 
     } 
    } 

}

public class War3 

{ 
public static void main(String[] args) 
{ 
    int i=0; 
    Deck[] fullDeck = new Deck[52]; //set up the deck 
    //create a random value for the first card 
    int r = ((int) (Math.random() * 100) % 51);//create random number 

    Card[] playerCard = new Card[r];//create the player's card 

    System.out.println("The card is: " + playerCard.toString()); 


    } 

Come potete vedere, non ho avuto molto lontano con War 3 perché io don sapere come visualizzare la prima carta Quando viene eseguito mostra questo: La carta è: [LCard; @ 4a5ab2random # 1 Come posso visualizzare la prima carta nell'array? Ho bisogno di aiuto per capire come assegnare la prima carta e la seconda carta, visualizzarli entrambi e poi confrontarli. Ho una lunga strada da percorrere per fare un passo alla volta.

+1

Il problema è che si sta tentando di stampare l'oggetto 'giocatoreCard'. Di default, sta usando l'implementazione 'Object.toString()', quindi dovresti sovrascrivere quel metodo nella tua classe 'Card'. –

+0

Che cos'è esattamente "un gioco di guerra"? Suggerirei di lasciare che il mazzo si occupi di pescare la prima carta. – Behe

+0

Stai iniziando una serie di carte invece di una sola carta. Sostituisci le parentesi quadre con quelle normali per ottenere una chiamata al costruttore e rimuovile dalle specifiche del tipo in questo modo: 'Card playerCard = new Card (r)'. – s1lence

risposta

2

La cosa più semplice da fare sarebbe implementare un metodo toString nella classe Card.

public String toString() { 
    return String.format("%s of %s", stringValue, cardSuit); 
} 

Mentre si è in esso, spostare i due array (suit e value) dal costruttore, renderli static final, e rinominare a tutti-superiore caso:

static final String[] SUIT = {"Clubs", "Diamonds", "Hearts", "Spades"}; 
static final String[] VALUE = {"Ace","Two", "Three", "Four", "Five", "Six", "Seven", 
       "Eight", "Nine", "Ten", "Jack", "Queen", "King"}; 

Anche la selezione di la carta non dovrebbe essere fatto come si fa:

Card[] playerCard = new Card[r];//create the player's card 

crea un array di r carte, e lo assegna a playerCard. Questo non è corretto: è già stata creata tutte le carte in Deck, è una questione di prendere uno a caso da esso:

public Card takeRandomCard() { 
    int r; 
    do { 
     r = (int)(Math.random() * 52); 
    } while (taken[r]); 
    taken[r] = true; 
    return fullDeck[r]; 
} 

Nota la piccola aggiunta qui: taken è un array di 52 boolean oggetti che indica che il la carta è stata presa dal mazzo.

Ecco il tuo code with my modifications da sopra lavorando a ideone.

+3

Oppure effettua enumerazioni 'SUIT' e' VALUE'. – Hassan

+1

@Hassan Non sono sicuro che sia un consiglio prudente: considerando che non hanno studiato le liste degli array, penso che le probabilità che abbiano imparato le enumerazioni sono piuttosto ridotte. – dasblinkenlight

+0

Probabilmente hai ragione. – Hassan

0

Card.cardSuit e Card.stringValue sono entrambe stringhe per ogni oggetto Card. Sebbene tu non stia inizializzando le Carte.

Si sta inoltre creando un array di 52 deck. Questo non è necessario.

Deck[] fullDeck = new Deck[52]; 

dovrebbe essere

Deck fullDeck = new Deck(); 

è necessario un solo ponte, come il costruttore per la matrice crea 52 oggetti di carte per voi. Dovrai quindi accedere in modo casuale a ciascuna di queste schede e visualizzarle.Così, quando hai il tuo numero casuale r, si vuole prendere quella carta numero dall'oggetto Deck:

fullDeck.fullDeck[r] 

sarà recuperare una carta a caso dal tuo mazzo. Per visualizzare i valori di stringa in questa scheda:

System.out.println("The card is: " + fullDeck.fullDeck[r].getCardSuit() + fullDeck.fullDeck[r].getValue() + "random#" + r); 

anche dichiarando new al di fuori di un costruttore è di cattivo gusto.

+0

Anche questo è stato utile. – t220

Problemi correlati