Java 无法使卡/牌组对象程序工作

Java 无法使卡/牌组对象程序工作,java,arrays,playing-cards,Java,Arrays,Playing Cards,这是我第一次在论坛上发帖,我不完全确定我的问题是否正确,但我会尽量具体并遵循指导原则。在遵循指导原则时,这是一个基于课堂作业的问题。这个任务是获取代码,创建一个代表一副牌的“牌组”对象,并添加几个功能。我目前正处于这个过程中 我的问题在于这一准则: public class SilasAlmgrenS6L1CardCreate { public static void main(String args[]) { Deck d = new Deck(); d.shuffle

这是我第一次在论坛上发帖,我不完全确定我的问题是否正确,但我会尽量具体并遵循指导原则。在遵循指导原则时,这是一个基于课堂作业的问题。这个任务是获取代码,创建一个代表一副牌的“牌组”对象,并添加几个功能。我目前正处于这个过程中

我的问题在于这一准则:

    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
公共类SilasalMgrens6lCardCreate{
公共静态void main(字符串参数[]){
甲板d=新甲板();
d、 洗牌();
Hand f=new Hand(d);//返回错误“Hand无法解析为类型”
}
公共静态类甲板{
Card[]cardArray=新卡[52];
Deck(){//构造函数
int=4;
int cardType=13;
int cardCount=0;

对于(int i=1;i来说,第一个问题是您的
Hand
类是静态
Deck
类的子类。这样,您就不能在
main
方法中使用它,因为它不是封闭类

编辑

所以,我有点过火了。希望这对你有意义

首先,我们有你的主类。为了不想输入这么长的名称,我对它进行了重命名。我添加了你的
Hand
Deck
对象作为变量,因为手既不属于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();

    }
}
}
卡片类别(未更改,但单独文件)


第一个问题是,您的
Hand
类是静态
Deck
类的子类。这样,您就不能在
main
方法中使用它,因为它不是封闭类

编辑

所以,我有点过火了。希望这对你有意义

首先,我们有你的主类。为了不想输入这么长的名称,我对它进行了重命名。我添加了你的
Hand
Deck
对象作为变量,因为手既不属于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 static class Hand
用于不需要SilasalMgrens6lCardCreate对象的内部类。或单独的文件。我同意简单的复制和粘贴将在将来引起问题。此外,按原样转换示例将使用我在类中尚未学习的代码。我目前正在开发一个使用s来自您和RaiseLtwiCe答案的部分。现在情况好多了,我的墙感谢您保存它。您找到答案了吗?为什么在子文件中使用几个类?使代码可读性降低。将在稍后尝试您的代码编辑我的答案,如果您需要更多解释,请询问。这是一个工作示例,但复制w没有理解只会在将来带来更多问题;)
public static class Hand
用于内部类,而不需要SilasalMgrens6lCardCreate对象。或单独的文件。我同意简单的复制和粘贴将在将来导致问题。此外,按原样转换示例将使用我没有看到的代码位已经在课堂上获得。我目前正在研究一个解决方案,使用您和RaiseLtwiCe答案中的片段。现在情况好多了,我的墙感谢您保存它。您找到了吗?这似乎解决了“无法解决类型问题,但现在我在同一行上得到提示:”没有封闭的类型实例e SilasalMgrens6lCardCreate是可访问的。必须使用SilasalMgrens6lCardCreate类型的封闭实例限定分配(例如x.new A(),其中x是SilasalMgrens6lCardCreate的实例)“我对Java还是很陌生,这个问题到底意味着什么?我将很快更新我的答案,并提供更多详细信息。请稍候;)这似乎解决了“无法解析为类型问题”,但现在我在同一行上得到提示:“无法访问SilasalMgrens6lCardCreate类型的封闭实例。必须限定分配。”一个silasalmgrens6lcardcreate类型的封闭实例(例如x.new A(),其中x是silasalmgrens6lcardcreate的实例)。“我对Java还是很陌生,这个问题到底意味着什么?我将很快更新我的答案,并提供更多详细信息。请稍候;”
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