2012-04-17 52 views
-2

我有測試酒杯的Java代碼中的問題,這是下面的代碼:的BlackJack的Java代碼的測試

package view; 

/* 
////In this applet, the user plays a game of Blackjack. The 
////computer acts as the dealer. The user plays by clicking 
////"Hit!" and "Stand!" buttons. 

////The programming of this applet assumes that the applet is 
////set up to be about 466 pixels wide and about 346 pixels high. 
////That width is just big enough to show 2 rows of 5 cards. 
////The height is probably a little bigger than necessary, 
////to allow for variations in the size of buttons from one platform 
////to another. 

*/ 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

import model.Card; 
import model.Deck; 
import model.Hand; 

public class GUI21 extends JApplet { 

public void init() { 

    // The init() method creates components and lays out the applet. 
    // A BlackjackCanvas occupies the CENTER position of the layout. 
    // On the bottom is a panel that holds three buttons. The 
    // BlackjackCanvas object listens for events from the buttons 
    // and does all the real work of the program. 

setBackground(new Color(130,50,40)); 

BlackjackCanvas board = new BlackjackCanvas(); 
getContentPane().add(board, BorderLayout.CENTER); 

JPanel buttonPanel = new JPanel(); 
buttonPanel.setBackground(new Color(220,200,180)); 
getContentPane().add(buttonPanel, BorderLayout.SOUTH); 

JButton hit = new JButton("Hit!"); 
hit.addActionListener(board); 
buttonPanel.add(hit); 

JButton stand = new JButton("Stand!"); 
stand.addActionListener(board); 
buttonPanel.add(stand); 

JButton newGame = new JButton("New Game"); 
newGame.addActionListener(board); 
buttonPanel.add(newGame); 

} // end init() 

public Insets getInsets() { 
    // Specify how much space to leave between the edges of 
    // the applet and the components it contains. The background 
    // color shows through in this border. 
return new Insets(3,3,3,3); 
} 


// --- The remainder of this class consists of a nested class --- 


class BlackjackCanvas extends JPanel implements ActionListener { 

    // A nested class that displays the card game and does all the work 
    // of keeping track of the state and responding to user events. 

Deck deck;   // A deck of cards to be used in the game. 

Hand dealerHand; // Hand containing the dealer's cards. 
Hand playerHand; // Hand containing the user's cards. 

String message; // A message drawn on the canvas, which changes 
       // to reflect the state of the game. 

boolean gameInProgress; // Set to true when a game begins and to false 
         // when the game ends. 

Font bigFont;  // Font that will be used to display the message. 
Font smallFont; // Font that will be used to draw the cards. 


BlackjackCanvas() { 
    // Constructor. Creates fonts and starts the first game. 
    setBackground(new Color(0,120,0)); 
    smallFont = new Font("SansSerif", Font.PLAIN, 12); 
    bigFont = new Font("Serif", Font.BOLD, 14); 
    doNewGame(); 
} 


public void actionPerformed(ActionEvent evt) { 
     // Respond when the user clicks on a button by calling 
     // the appropriate procedure. Note that the canvas is 
     // registered as a listener in the GUI21 class. 
    String command = evt.getActionCommand(); 
    if (command.equals("Hit!")) 
    doHit(); 
    else if (command.equals("Stand!")) 
    doStand(); 
    else if (command.equals("New Game")) 
    doNewGame(); 
} 


void doHit() { 
     // This method is called when the user clicks the "Hit!" button. 
     // First check that a game is actually in progress. If not, give 
     // an error message and exit. Otherwise, give the user a card. 
     // The game can end at this point if the user goes over 21 or 
     // if the user has taken 5 cards without going over 21. 
    if (gameInProgress == false) { 
    message = "Click \"New Game\" to start a new game."; 
    repaint(); 
    return; 
    } 
    playerHand.addCard(deck.takeCardfromDeck()); 
    if (playerHand.getScore() > 21) { 
    message = "You've busted! Sorry, you lose."; 
    gameInProgress = false; 
    } 
    else if (playerHand.getScore() == 5) { 
    message = "You win by taking 5 cards without going over 21."; 
    gameInProgress = false; 
    } 
    else { 
    message = "You have " + playerHand.getScore() + ". Hit or Stand?"; 
    } 
    repaint(); 
} 


void doStand() { 
     // This method is called when the user clicks the "Stand!" button. 
     // Check whether a game is actually in progress. If it is, 
     // the game ends. The dealer takes cards until either the 
     // dealer has 5 cards or more than 16 points. Then the 
     // winner of the game is determined. 
    if (gameInProgress == false) { 
    message = "Click \"New Game\" to start a new game."; 
    repaint(); 
    return; 
    } 
    gameInProgress = false; 
    while (dealerHand.getScore() <= 16 && dealerHand.getCardsinHand() < 5) 
    dealerHand.addCard(deck.takeCardfromDeck()); 
    if (dealerHand.getScore() > 21) 
     message = "You win! Dealer has busted with " + dealerHand.getCardsinHand() +"."; 
    else if (dealerHand.getScore() == 5) 
     message = "Sorry, you lose. Dealer took 5 cards without going over 21."; 
    else if (dealerHand.getScore() > playerHand.getScore()) 
     message = "Sorry, you lose, " + dealerHand.getScore() 
             + " to " + playerHand.getScore() + "."; 
    else if (dealerHand.getScore() == playerHand.getScore()) 
     message = "Sorry, you lose. Dealer wins on a tie."; 
    else 
     message = "You win, " + playerHand.getScore() 
             + " to " + dealerHand.getScore() + "!"; 
    repaint(); 
    } 


    void doNewGame() { 
     // Called by the constructor, and called by actionPerformed() if 
     // the use clicks the "New Game" button. Start a new game. 
     // Deal two cards to each player. The game might end right then 
     // if one of the players had blackjack. Otherwise, gameInProgress 
     // is set to true and the game begins. 
    if (gameInProgress) { 
      // If the current game is not over, it is an error to try 
      // to start a new game. 
    message = "You still have to finish this game!"; 
    repaint(); 
    return; 
    } 
    deck = new Deck(); // Create the deck and hands to use for this game. 
    dealerHand = new Hand(); 
    playerHand = new Hand(); 
    deck.shuffle(); 
    dealerHand.addCard(deck.takeCardfromDeck()); // Deal two cards to each player. 
    dealerHand.addCard(deck.takeCardfromDeck()); 
    playerHand.addCard(deck.takeCardfromDeck()); 
    playerHand.addCard(deck.takeCardfromDeck()); 
    if (dealerHand.getScore() == 21) { 
     message = "Sorry, you lose. Dealer has Blackjack."; 
     gameInProgress = false; 
    } 
    else if (playerHand.getScore() == 21) { 
     message = "You win! You have Blackjack."; 
     gameInProgress = false; 
    } 
    else { 
     message = "You have " + playerHand.getScore() + ". Hit or stand?"; 
     gameInProgress = true; 
    } 
    repaint(); 
    } // end newGame(); 


    public void paintComponent(Graphics g) { 
    // The paint method shows the message at the bottom of the 
    // canvas, and it draws all of the dealt cards spread out 
    // across the canvas. 

    super.paintComponent(g); // fill with background color. 

    g.setFont(bigFont); 
    g.setColor(Color.green); 
    g.drawString(message, 10, getSize().height - 10); 

    // Draw labels for the two sets of cards. 

    g.drawString("Dealer's Cards:", 10, 23); 
    g.drawString("Your Cards:", 10, 153); 

    // Draw dealer's cards. Draw first card face down if 
    // the game is still in progress, It will be revealed 
    // when the game ends. 

    g.setFont(smallFont); 
    if (gameInProgress) 
    drawCard(g, null, 10, 30); 
    else 
    drawCard(g, dealerHand.getCard(0), 10, 30); 
    for (int i = 1; i < dealerHand.getCardsinHand(); i++) 
    drawCard(g, dealerHand.getCard(i), 10 + i * 90, 30); 

    // Draw the user's cards. 

    for (int i = 0; i < playerHand.getCardsinHand(); i++) 
    drawCard(g, playerHand.getCard(i), 10 + i * 90, 160); 

    } // end paint(); 


    void drawCard(Graphics g, Card card, int x, int y) { 
     // Draws a card as a 80 by 100 rectangle with 
     // upper left corner at (x,y). The card is drawn 
     // in the graphics context g. If card is null, then 
     // a face-down card is drawn. (The cards are 
     // rather primitive.) 
    if (card == null) { 
     // Draw a face-down card 
    g.setColor(Color.blue); 
    g.fillRect(x,y,80,100); 
    g.setColor(Color.white); 
    g.drawRect(x+3,y+3,73,93); 
    g.drawRect(x+4,y+4,71,91); 
    } 
    else { 
    g.setColor(Color.white); 
    g.fillRect(x,y,80,100); 
    g.setColor(Color.gray); 
    g.drawRect(x,y,79,99); 
    g.drawRect(x+1,y+1,77,97); 
    if (card.getSuit() == card.getSuit() || card.getSuit() == card.getSuit()) 
     g.setColor(Color.red); 
    else 
     g.setColor(Color.black); 
    g.drawString(card.toSymbol(), x + 10, y + 30); 
    g.drawString("of", x+ 10, y + 50); 
    g.drawString(card.toSymbol(), x + 10, y + 70); 

    } // end drawCard() 


    } // end nested class BlackjackCanvas 

    } 
    } // end class HighLowGUI 

但是我收到此以下錯誤,每當我測試一下:

Exception in thread "AWT-EventQueue-1" java.util.UnknownFormatConversionException: Conversion = 'i' 
    at java.util.Formatter$FormatSpecifier.conversion(Unknown Source) 
    at java.util.Formatter$FormatSpecifier.<init>(Unknown Source) 
    at java.util.Formatter.parse(Unknown Source) 
    at java.util.Formatter.format(Unknown Source) 
    at java.util.Formatter.format(Unknown Source) 
    at java.lang.String.format(Unknown Source) 
    at model.Card.toSymbol(Card.java:38) 
    at view.GUI21$BlackjackCanvas.drawCard(GUI21.java:266) 
    at view.GUI21$BlackjackCanvas.paintComponent(GUI21.java:232) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JLayeredPane.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
    at javax.swing.RepaintManager.paint(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
    at java.awt.Container.paint(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) 
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

任何建議會很棒,謝謝。

+2

嘗試切割出大量的代碼。給我們一些給你麻煩的部分和其他必要的東西來理解它。代碼牆的方法太難以解決了。 – twain249 2012-04-17 03:43:18

+0

你在哪一行發生錯誤? – 2012-04-17 03:43:30

+2

這不只是一個代碼牆 - 這是完全不相干的*** ***代碼,你不顯示正確的類。卡類在哪裏,特別是第38行? '在model.Card.toSymbol(Card.java:38)' – 2012-04-17 03:46:39

回答

2

,請注意堆棧跟蹤的頂部:

Exception in thread "AWT-EventQueue-1" java.util.UnknownFormatConversionException: Conversion = 'i' 
    at java.util.Formatter$FormatSpecifier.conversion(Unknown Source) 
    at java.util.Formatter$FormatSpecifier.<init>(Unknown Source) 
    at java.util.Formatter.parse(Unknown Source) 
    at java.util.Formatter.format(Unknown Source) 
    at java.util.Formatter.format(Unknown Source) 
    at java.lang.String.format(Unknown Source) 
    at model.Card.toSymbol(Card.java:38) 

這就是告訴你有你的Card類的toSymbol()方法(還沒有發佈,順便說一句)一些錯誤發生。這有什麼不好的是,你的toSymbol()方法顯然是用壞格式字符串,或至少一個格式字符串,不說是用它來格式化數據相匹配。所以看的格式字符串和閱讀的Javadoc格式說明,並找出你做錯了什麼。

+0

再次感謝您@QuantumMechanic,我並沒有注意上面,我現在已經解決了這個問題,謝謝。 – user1279780 2012-04-17 04:11:09

+0

不客氣。 – QuantumMechanic 2012-04-17 16:28:50