-2

我在测试二十一点 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)

任何建议都会很棒,谢谢。

4

1 回答 1

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)

toSymbol()那是在告诉您您的课程方法中发生了错误Card(顺便说一句,您还没有发布)。问题是您的toSymbol()方法显然使用了错误的格式字符串,或者至少使用了与要使用它格式化的数据不匹配的格式字符串。因此,请查看格式字符串并阅读 Javadocs 中的格式说明符并找出您做错了什么。

于 2012-04-17T03:47:17.210 回答