0

我正在将二十一点游戏作为我在 OOP 课程中的最后一个项目。我一辈子都想不通为什么我的牌不能正确渲染(仍然会考虑未显示的牌的值 - 这意味着如果我有二十一点并且我只能看到我的一张牌,我仍然会获得二十一点的荣誉)。这是我试图传达的截图(注意:每次总是至少缺少一张牌,并且庄家的面朝下牌也没有正确显示):

在此处输入图像描述

这是与我的卡片渲染问题相关的代码段:

/**
     * Paints the cards stacked top-down in addition to the rest of the 
     * components. The cards are arranged so the user can still see all of
     * the cards' values.
     */
    public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (hand == null) return;
            for (int i = 0; i < hand.length(); i++) {
                    drawCard(g, hand.get(i), 10, 76 + 33*i);
            }
    }

    /**
     * Paints a card image onto (x,y) of the container. A face down card will
     * be drawn accordingly.
     * @param g the graphics context
     * @param card the card to be printed
     * @param x the x-position of the printed card in this container
     * @param y the y-position of the printed card in this container
     */
    private void drawCard(Graphics g, Card card, int x, int y){
        String face = "";
        String suit = "";
        String filepath = "";

        if (!card.isFaceUp()) {
            suit = "b1";
            face = "fv";
        }
        else {
            face = String.valueOf(card.getFace());
            if (face == "11"){
                face = "j";
            }
            if (face == "12"){
                face = "q";
            }
            if (face == "13"){
                face = "k";
            }
            switch (card.getSuit()) {
                    case Card.DIAMONDS: suit = "d";       break;
                    case Card.CLUBS:    suit = "c";         break;              
                    case Card.HEARTS:   suit = "h";     break;
                    default:            suit = "s";     break; //Spades
            }
            BufferedImage cardImg = null;
            filepath = "C:/Users/Student/workspace/Blackjack GUI/src/images/" + suit + face + ".png";
            try {
                cardImg = ImageIO.read(new File(filepath));
            } catch (IOException e) {
            }
            g.drawImage(cardImg,x,y,71,96,this);

        }

卡片的值(“面”)和花色是从我的名为 Card 的类中的整数派生的。这是该课程的副本:

/**
 * A class the represents the deck of 52 cards used in Blackjack.
 * Cards can be one of 13 faces, one of four suits, and one of two colors.
 * Methods will get the names, faces, values, suits, or colors of the cards and
 * can flip the card face up or face down.
 * @author Mike Mulhearn
 */
public class Card {

    /**
     * The value of an Ace
     */
    public static final int ACE = 1; 
    /**
     * The value of a Two
     */
    public static final int TWO = 2; 
    /**
     * The value of a Three
     */
    public static final int THREE = 3; 
    /**
     * The value of a Four
     */
    public static final int FOUR = 4; 
    /**
     * The value of a Five
     */
    public static final int FIVE = 5;
    /**
     * The value of a Six
     */
    public static final int SIX = 6; 
    /**
     * The value of a Seven
     */
    public static final int SEVEN = 7;
    /**
     * The value of an Eight
     */
    public static final int EIGHT = 8; 
    /**
     * The value of a Nine
     */
    public static final int NINE = 9; 
    /**
     * The value of a Ten
     */
    public static final int TEN = 10; 
    /**
     * The value of a Jack
     */
    public static final int JACK = 11; 
    /**
     * The value of a Queen
     */
    public static final int QUEEN = 12; 
    /**
     * The value of a King
     */
    public static final int KING = 13; 
    /**
     * The value of a Spade
     */
    public static final int SPADES = 3;
    /**
     * The value of a Diamond
     */
    public static final int DIAMONDS = 0; 
    /**
     * The value of a Club
     */
    public static final int HEARTS = 2; 
    /**
     * The value of a Club
     */
    public static final int CLUBS = 1; 

    private int suit; //Represents the suit of the card (0-Diamond,1-Club,2-Heart,3-Spade)
    private int face; //Will contain a value from 0 to 12, from Ace to King
    private boolean isFaceUp = true; //Tells whether the card is face up or face down
    /**
     * Create a card with suit cardSuit, face cardFace, and visibility faceUp
     * @param cardSuit is the suit of the card
     * @param cardFace is the face of the card
     * @param faceUp is true when card is face up, false if face down
     */
    public Card(int cardSuit, int cardFace, boolean faceUp){
        suit = cardSuit;
        face = cardFace;
        isFaceUp = faceUp;
    }

    /**
     * Create a card with suit cardSuit, face cardFace
     * @param cardSuit is the suit of the Card
     * @param cardFace is the face of the Card
     */
    public Card(int cardSuit, int cardFace){
        suit = cardSuit;
        face = cardFace;
        isFaceUp = true;
    }

    /**
     * Gets the suit of the card
     * @return integer value with the suit of the card
     */
    public int getSuit(){
        return suit;
    }

    /**
     * Gets the color of the card
     * @return Color of the card as a String
     */
    public String getColor(){
        if(suit == 0 || suit == 2)
            return "Red";
        else
            return "Black";
    }

    /**
     * Gets the face of the Card
     * @return Face of the Card
     */
    public int getFace(){
        return face;
    }

    /**
     * Gets the value of the Card
     * Uses the face of the Card to calculate the value
     * Ace is 1, 2-9 are themselves, 10 and higher are 10
     * @return value of the card
     */
    public int getValue(){
        if(face >= TWO && face <= TEN)
            return face;
        else if(face > TEN)
            return 10;
        return -1;
    }

    /**
     * Gets the highest possible value of the ace
     * @return integer of the highest possible value of the ace
     */
    public int getHighValue() {
        int high = getValue();
        if (high == -1) {
            return 11;
        } else {
            return high;
        }
    }

    /**
     * Gets the lowest value of the ace
     * @return integer of the lowest possible value of the ace
     */
    public int getLowValue() {
        int low = getValue();
        if (low == -1) {
            return 1;
        } else {
            return low;
        }
    }

    /**
     * Flips the card over
     */
    public void flip(){
        isFaceUp = !isFaceUp;
    }

    /**
     * Determines whether the cards are face up
     * @return boolean value representing whether the card is face up or down
     */
    public boolean isFaceUp(){
        return isFaceUp;        
    }
    /**
     * Gets the suit name
     * @return String with the suit of the card
     */
    public String getSuitName(){
        switch(suit) {
            case DIAMONDS: return "Diamonds";
            case CLUBS: return "Clubs";
            case HEARTS: return "Hearts";
            case SPADES: return "Spades";
            default: return "Error: No Suit Found";    
        }
    }
    /**
     * Gets the face name
     * @return String with the face of the card
     */
    public String getFaceName() {
        switch (face) {
            case ACE: return "Ace";
            case TWO: return "Two"; 
            case THREE: return "Three"; 
            case FOUR: return "Four"; 
            case FIVE: return "Five"; 
            case SIX: return "Six"; 
            case SEVEN: return "Seven"; 
            case EIGHT: return "Eight"; 
            case NINE: return "Nine";
            case TEN: return "Ten";
            case JACK: return "Jack"; 
            case QUEEN: return "Queen"; 
            case KING: return "King"; 
            default: return "Error: No Face Found";                 
        }
    }
}

最后是 GUI 类中 main 函数的副本:

 /** 
     * Runs the Game
     * @param args Main Method
     */
    public static void main(String[] args) {
            GUI b = new GUI();
    Game game = b.new Game();
    JOptionPane.showMessageDialog(game, "Welcome to Mike Mulhearn's House of Cards. " +
                                        "Today we will be indulging ourselves in a game of Blackjack. " +
                                        "Please take your seat.");        
    while (true) {

            if (game.human.getMoney() < MIN_BET) {
                    JOptionPane.showMessageDialog(game, "You don't have enough money to play. YOU LOSE!");
                    System.exit(0);
            }

            System.out.println(game.deck.getCount());
            game.askBets(); 
            game.deal();            
            game.repaint();
            game.setButtonState(true, true, true, false, true);
            if (game.human.getCurrentBet() > game.human.getMoney()) 
                    game.playerChoices.disableDouble();
            while (game.turnContinue) { game.repaint(); }           
            game.setButtonState(false, false, false, false, false);                 
            game.doAITurns();
            game.repaint();
            game.doDealerTurn();
            game.repaint();       
            game.doPayOuts(); 
            game.reset();           
    }        
    }

如果我遗漏了任何代码,这里是我的程序的压缩副本:Blackjack GUI.zip

如果有人能帮我解决这个问题,我将不胜感激!

4

1 回答 1

3

我几乎可以肯定这是由于不好的字符串比较:

face = String.valueOf(card.getFace());
if (face == "11"){
    face = "j";
}
if (face == "12"){
    face = "q";
}
if (face == "13"){
    face = "k";
}

将它们更改为if (face.equals("another string")). 请参阅“如何在 Java 中比较字符串?”

这些检查将不正确,因此您将获得不存在的文件路径。如果您不吃 IOException,您就会知道这一点:

filepath = "C:/Users/Student/workspace/Blackjack GUI/src/images/" + suit + face + ".png";
try {
    cardImg = ImageIO.read(new File(filepath));
} catch (IOException e) {
}

作为旁注,您不应该在绘画时进行 IO。相反,在启动时读取所有图像并将它们放入地图中。

static final Map<String, Image> IMGS = new HashMap<String, Image>();

static {
    HashMap<String, Image> imgs = new HashMap<String, Image>();

    String dir = "C:/Users/Student/workspace/Blackjack GUI/src/images/";
    String png = ".png";

    for (String suit = "d", name; ;) {
        for (int face = 1; face <= 13; face++) {
            if (face == 11) {
                name = suit + "j";
            } else if (face == 12) {
                name = suit + "q";
            } else if (face == 13) {
                name = suit + "k";
            } else {
                name = suit + face;
            }

            try {
                imgs.put(
                    name,
                    ImageIO.read(new File(dir + name + png));
                );
            } catch (IOException e) {
                System.out.println(
                    "Exception <" + e.toString() + "> for " + name
                );
            }
        }

        if (suit.equals("d") {
            suit = "c";
        } else if (suit.equals("c")) {
            suit = "h";
        } else if (suit.equals("h")) {
            suit = "s");
        } else {
            break;
        }
    }

    IMGS = Collections.unmodifiableMap(imgs);
}
于 2013-12-09T11:28:56.773 回答