Не удается запустить программу объекта карты / колоды

Я впервые публикуюсь на форуме, и я не совсем уверен, что мой вопрос верен, но я постараюсь быть конкретным и следовать указаниям. Следуя рекомендациям, этот вопрос основан на задании класса. Это назначение - взять код, который создает объект "колода", представляющий колоду карт, и добавить несколько функций. Я в настоящее время застрял в процессе.

Моя проблема заключается в этом коде:

    public class SilasAlmgrenS6L1CardCreate {
public static void main(String args[]) {
    Deck d = new Deck();
    d.shuffle();

   Hand f = new Hand(d); //Returns error 'Hand cannot be resolved to a type'

}

public static class Deck {
    Card[] cardArray = new Card[52];
    Deck() { //constructor
        int suits = 4;
        int cardType = 13;
        int cardCount = 0;
        for (int i = 1; i <= suits; i++)
            for (int j = 1; j <= cardType; j++) {
                cardArray[cardCount] = new Card(i, j);
                cardCount++;
            } //End loop
    } //End deck() constructor


    ////////////////////////////////////////////////////////
    //My code starts here

    public class Hand {
        Hand(Deck a) {
            Card[] Hand = {a.cardArray[0], a.cardArray[1], a.cardArray[2], a.cardArray[3], a.cardArray[4]};
            Card[] playerHand = {Hand[0], Hand[1]};
            System.out.println("You have " + playerHand[0] + " and " + playerHand[1] );

        } //End hand constructor
    } //End hand class

    public void shuffle() {
        //Runs loop for the length of the deck
        for(int i = 0; i < cardArray.length; i++) {
            int num = (int) (Math.random() * (51 - 0)) + 0; //Creates a random number between 0 and 51; used to shuffle
            Card placeHolder = cardArray[i]; //Picks a place holder card from the deck
            cardArray[i] = cardArray[num]; //Picks two random cards and make them equal
            cardArray[num] = placeHolder; //Assigns one of the duplicate cards to the placeholder value 
        } //End for
    } //End shuffle


    //And ends here
    /////////////////////////////////////////////////


    public void print() {
        for (int i = 0; i < cardArray.length; i++)
            System.out.println(cardArray[i]);
    } //End print loop
} //End print class



public static class Card {
    String suit, name;
    int points;
    Card(int n1, int n2) {
        suit = getSuit(n1);
        name = getName(n2);
        points = getPoints(name);
    } //End card class

    public String toString() {
        return "The " + name + " of " + suit;
    } //End toString

    public String getName(int i) {
        if (i == 1) return "Ace";
        if (i == 2) return "Two";
        if (i == 3) return "Three";
        if (i == 4) return "Four";
        if (i == 5) return "Five";
        if (i == 6) return "Six";
        if (i == 7) return "Seven";
        if (i == 8) return "Eight";
        if (i == 9) return "Nine";
        if (i == 10) return "Ten";
        if (i == 11) return "Jack";
        if (i == 12) return "Queen";
        if (i == 13) return "King";
        return "error";
    } //End getName String

    public int getPoints(String n) {
        if (n == "Jack" || n == "Queen" || n == "King" || n == "Ten")
            return 10;
        if (n == "Two")
            return 2;
        if (n == "Three")
            return 3;
        if (n == "Four")
            return 4;
        if (n == "Five")
            return 5;
        if (n == "Six")
            return 6;
        if (n == "Seven")
            return 7;
        if (n == "Eight")
            return 8;
        if (n == "Nine")
            return 9;
        if (n == "Ace")
            return 11;
        return -1;
    } //End int getPoints

    public String getSuit(int i) {
        if (i == 1) return "Diamonds";
        if (i == 2) return "Clubs";
        if (i == 3) return "Spades";
        if (i == 4) return "Hearts";
        return "error";
    } //End getSuit String        
} //End Deck class

}

Большая часть этой программы уже была предоставлена ​​с заданием, но мы должны добавить несколько функций. Первой из этих функций был метод случайного воспроизведения, который я смог сделать. В следующей функции мы должны создать класс "Рука", который раздает пользователю карты карт и подсчитывает, сколько у них очков, как если бы это была игра в блэкджек. Это точная формулировка этого шага:

'Добавить класс руки, который содержит массив из 5 ссылок на карты. У программы Deal the Hand две карты и покажите их пользователю. Сообщите пользователю, сколько очков у него есть, и спросите, хотят ли они другую карту или нет. Продолжайте позволять игроку добавлять карты, пока они не наберут 5 карт или сумма не станет больше 21.'

Я столкнулся с несколькими способами, которые я чувствовал, что мог создать этот класс, но ни один, кажется, не работает. Эта текущая итерация настолько близка, насколько я понял. Я в настоящее время в тупике, однако. Мои проблемы Я не знаю, почему я получаю ошибку типа, когда пытаюсь использовать класс Hand, и я понятия не имею, как реализовать метод getPoints(). После создания класса Hand есть несколько шагов, но я уверен, что смогу пройти через них, если смогу выяснить, как заставить этот класс работать. Я на грани пробивания дыры в моей стене, поэтому любая помощь по исправлению этого кода будет абсолютно признательна.

1 ответ

Первая проблема заключается в том, что ваш Hand класс является подклассом вашей статики Deck учебный класс. Таким образом, вы не можете использовать его в своем main метод, потому что это не включающий класс.

РЕДАКТИРОВАТЬ

Итак, я пошел немного за борт здесь. Надеюсь, это имеет смысл для вас.

Прежде всего, у нас есть ваш основной класс. Я переименовал его, чтобы не хотеть набирать это длинное имя. Я добавил твой Handа также Deck объекты как переменные, так как ни Рука не принадлежит колоде, ни наоборот, но они оба являются частью Main класс, давайте назовем это игрой.

Вы начинаете с перетасовки колоды. Когда у вас есть колода, вы можете получить случайную карту. Это обеспечивается колодой. (Я скоро приду к этому методу).

Как только у вас есть рука, вы можете показать пользователю количество очков, которое у них есть, и спросить, не хотели бы они получить дополнительную карту (если numberOfPoints < 22 и numberOfCards < 5). Если им нужна дополнительная карта, попросите в колоде случайную карту и добавьте ее в руку. Продолжайте, пока любая из границ не будет встречена.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CardExample {

private Hand playHand;
private Deck playDeck;
private Scanner reader = new Scanner(System.in);  // Reading from System.in


public static void main(String args[]) {
    new CardExample().play();
}

public void play(){
    playDeck = new Deck();
    playDeck.shuffle();

    Card firstCard = playDeck.getRandomCard();
    Card secondCard = playDeck.getRandomCard();

    List<Card> startCards = new ArrayList<>();
    startCards.add(firstCard);
    startCards.add(secondCard);

    playHand = new Hand(startCards);
    requestInput();
}

private void requestInput(){
    System.out.println("You have " + playHand.getPoints() + " points");
    System.out.println("New card? (Y/N)");
    String input = reader.next();
    if(input.equalsIgnoreCase("y")){
        Card newCard = playDeck.getRandomCard();
        playHand.addCard(newCard);

        if(playHand.getNumberOfCards() < 5 && playHand.getPoints() < 22) {
            requestInput();
        }else if(playHand.getPoints() >= 22){
            System.out.println("You have " + playHand.getPoints() + "points. You're dead, sorry.");
            reader.close();
        } else{
            System.out.println("You have 5 cards, that's the max");
            reader.close();
        }
    }else{
        System.out.println("Your score is " + playHand.getPoints() + " points");
        reader.close();

    }
}
}

Палубный класс

 public class Deck {

private Card[] cardArray = new Card[52];
private int currentIndex = 0;

public Deck() { //constructor
    int suits = 4;
    int cardType = 13;
    int cardCount = 0;
    for (int i = 1; i <= suits; i++)
        for (int j = 1; j <= cardType; j++) {
            cardArray[cardCount] = new Card(i, j);
            cardCount++;
        } //End loop
}

public void shuffle() {
    //Runs loop for the length of the deck
    for(int i = 0; i < cardArray.length; i++) {
        int num = (int) (Math.random() * (51 - 0)) + 0; //Creates a random number between 0 and 51; used to shuffle
        Card placeHolder = cardArray[i]; //Picks a place holder card from the deck
        cardArray[i] = cardArray[num]; //Picks two random cards and make them equal
        cardArray[num] = placeHolder; //Assigns one of the duplicate cards to the placeholder value
    } //End for
} //End shuffle

public Card[] getCardArray() {
    return cardArray;
}

public Card getRandomCard(){
    Card nextCard = cardArray[currentIndex];
    currentIndex += 1;
    return nextCard;
}


//And ends here
/////////////////////////////////////////////////


public void print() {
    for (int i = 0; i < cardArray.length; i++)
        System.out.println(cardArray[i]);
} //End print loop
}

Ручной классaddCard обновляет баллы, чтобы при получении numberOfCards или баллов возвращалось правильное значение

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

public class Hand {
private int points = 0;
private int numberOfCards = 0;
private List<Card> hand = new ArrayList<>();


public Hand(List<Card> cards) {
    hand.addAll(cards);
    numberOfCards += cards.size();
    for(Card card: cards){
        points += card.points;
    }
} //End hand constructor

public void addCard(Card card){
    hand.add(card);
    points += card.points;
    numberOfCards += 1;
}

public int getNumberOfCards() {
    return numberOfCards;
}

public int getPoints() {
    return points;
}


}

Класс карты (без изменений, но отдельный файл)

public class Card {
String suit, name;
int points;
Card(int n1, int n2) {
    suit = getSuit(n1);
    name = getName(n2);
    points = getPoints(name);
} //End card class

public String toString() {
    return "The " + name + " of " + suit;
} //End toString

public String getName(int i) {
    if (i == 1) return "Ace";
    if (i == 2) return "Two";
    if (i == 3) return "Three";
    if (i == 4) return "Four";
    if (i == 5) return "Five";
    if (i == 6) return "Six";
    if (i == 7) return "Seven";
    if (i == 8) return "Eight";
    if (i == 9) return "Nine";
    if (i == 10) return "Ten";
    if (i == 11) return "Jack";
    if (i == 12) return "Queen";
    if (i == 13) return "King";
    return "error";
} //End getName String

public int getPoints(String n) {
    if (n == "Jack" || n == "Queen" || n == "King" || n == "Ten")
        return 10;
    if (n == "Two")
        return 2;
    if (n == "Three")
        return 3;
    if (n == "Four")
        return 4;
    if (n == "Five")
        return 5;
    if (n == "Six")
        return 6;
    if (n == "Seven")
        return 7;
    if (n == "Eight")
        return 8;
    if (n == "Nine")
        return 9;
    if (n == "Ace")
        return 11;
    return -1;
} //End int getPoints

public String getSuit(int i) {
    if (i == 1) return "Diamonds";
    if (i == 2) return "Clubs";
    if (i == 3) return "Spades";
    if (i == 4) return "Hearts";
    return "error";
} //End getSuit String
} //End Deck class
Другие вопросы по тегам