【问题标题】:Java Blackjack GUI paintComponent drawImage not displaying all the cardsJava Blackjack GUI paintComponent drawImage 不显示所有卡片
【发布时间】:2013-12-09 19:52:50
【问题描述】:

我正在开发二十一点游戏,作为我 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!

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

【问题讨论】:

    标签: java swing user-interface paintcomponent blackjack


    【解决方案1】:

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

    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"))。见"How do I compare strings in 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-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多