2010-06-18 85 views
0

這裏的想法是創建一個框的網格。黑色網格下方是另一個多色盒子網格。當你點擊一個盒子時,它的蒙版消失,顯示下面的彩色框。然後,如果顏色匹配萬聖節,則單擊第二個框,如果不是則遊戲繼續。下面是GuessingGame.javaJava - 爲什麼mask不工作?

import java.applet.Applet; 
import java.awt.Button; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class GuessingGame extends Applet{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private final int START_X = 20; 
    private final int START_Y = 40; 
    private final int ROWS = 4; 
    private final int COLS = 4; 
    private final int BOX_WIDTH = 20; 
    private final int BOX_HEIGHT = 20; 
    //this is used to keep track of boxes that have been matched. 
    private boolean matchedBoxes[][]; 
    //this is used to keep track of two boxes that have been clicked. 
    private MaskableBox chosenBoxes[]; 
    private MaskableBox boxes[][]; 
    private Color boxColors[][]; 
    private Button resetButton; 


    public void init() { 
    boxes = new MaskableBox[ROWS][COLS]; 
    boxColors = new Color[ROWS][COLS]; 
    resetButton = new Button("Reset Colors"); 
    resetButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      randomizeColors(); 
      buildBoxes(); 
      repaint(); 
     } 
    }); 
    add(resetButton); 
    //separate building colors so we can add a button later 
    //to re-randomize them. 
    randomizeColors(); 
    buildBoxes(); 
    } 

    public void paint(Graphics g) { 
    for (int row =0; row < boxes.length; row ++) { 
     for (int col = 0; col < boxes[row].length; col++) { 
     if(boxes[row][col].isClicked()) { 
      //boxes[row][col].setMaskColor(Color.black); 
      //boxes[row][col].setMask(!boxes[row][col].isMask()); 
      //boxes[row][col].setClicked(false); 
     //} 
      if (!matchedBoxes[row][col]) { 
      gameLogic(boxes[row][col]); 
      //boxes[row][col].draw(g); 
      } 
     } 
     } 
    } 
    //loop through the boxes and draw them. 
    for (int row = 0; row < boxes.length; row++) { 
     for (int col = 0; col < boxes[row].length; col++) { 
     boxes[row][col].draw(g); 

     } 
    } 
    } 


    public void gameLogic(MaskableBox box) { 
    if ((chosenBoxes[0] != null)&&(chosenBoxes[1] != null)) { 
     chosenBoxes = new MaskableBox[2]; 
     if(chosenBoxes[0].getBackColor() == chosenBoxes[1].getBackColor()) { 
     for (int i=0; 0 < 2; ++i) { 
      for(int row = 0; row < boxes.length; row++) {   
      for(int col = 0; col < boxes[row].length; col++) {   
       if(boxes[row][col] == chosenBoxes[i]) { 
       System.out.println("boxes [row][col] == chosenBoxes[] at index: " + i );    
       matchedBoxes[row][col] = true; 
       break; 
       } 
      } 
      } 
     } 
     }else { 
     chosenBoxes[0].setMask(true); 
     chosenBoxes[1].setMask(true); 
     } 
    }else { 
     if (chosenBoxes[0] == null) { 
      chosenBoxes[0] = box; 
      chosenBoxes[0].setMask(false); 
      return; 
     }else{  
     if (chosenBoxes[1] == null) { 
      chosenBoxes[1] = box; 
      chosenBoxes[1].setMask(false);  
     } 
     } 
    } 
    } 


    private void removeMouseListeners() { 
    for(int row = 0; row < boxes.length; row ++) { 
     for(int col = 0; col < boxes[row].length; col++) { 
      removeMouseListener(boxes[row][col]); 
     } 
    } 
    } 

    private void buildBoxes() { 
    // need to clear any chosen boxes when building new array. 
    chosenBoxes = new MaskableBox[2]; 
    // create a new matchedBoxes array 
    matchedBoxes = new boolean [ROWS][COLS]; 
    removeMouseListeners(); 
    for(int row = 0; row < boxes.length; row++) { 
     for(int col = 0; col < boxes[row].length; col++) { 
     boxes[row][col] = 
      new MaskableBox(START_X + col * BOX_WIDTH, 
          START_Y + row * BOX_HEIGHT, 
          BOX_WIDTH, 
          BOX_HEIGHT, 
          Color.gray, 
          boxColors[row][col], 
          true, 
          true, 
          this); 
     addMouseListener(boxes[row][col]); 
     } 
    } 
    } 





    private void randomizeColors() { 
    int[] chosenColors = {0,0,0,0,0,0,0,0}; 
    Color[] availableColors = {Color.red, Color.blue, Color.green, 
     Color.yellow, Color.cyan, Color.magenta, Color.pink, Color.orange }; 
    for(int row = 0; row < boxes.length; row++) { 
     for (int col = 0; col < boxes[row].length; col++) { 
     for (;;) { 
      int rnd = (int) (Math.random() * 8); 
      if (chosenColors[rnd]< 2) { 
      chosenColors[rnd]++; 
      boxColors[row][col] = availableColors[rnd]; 
      break; 
      } 
     } 
     } 
    } 
    } 
} 

這裏的代碼是第二批包含代碼maskablebox

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 

public class MaskableBox extends ClickableBox { 
    private boolean mask; 
    private Color maskColor; 
    Container parent; 

    public MaskableBox(int x, int y, int width, int height, Color borderColor, 
     Color backColor, boolean drawBorder, boolean mask, Container parent) { 
    super(x, y, width, height, borderColor, backColor, drawBorder, parent); 
    this.parent = parent; 
    this.mask = mask; 
    } 

    public void draw(Graphics g) { 
    if(mask=false) { 
     super.draw(g); 
//  setOldColor(g.getColor()); 
//  g.setColor(maskColor); 
//  g.fillRect(getX(),getY(),getWidth(), getHeight()); 
//  if(isDrawBorder()) { 
//  g.setColor(getBorderColor()); 
//  g.drawRect(getX(),getY(),getWidth(),getHeight()); 
//  } 
//  g.setColor(getOldColor()); 
    }else { 
     if(mask=true) { 
     //super.draw(g); 
     setOldColor(g.getColor()); 
     g.setColor(maskColor); 
     g.fillRect(getX(),getY(),getWidth(), getHeight()); 
     if(isDrawBorder()) { 
      g.setColor(getBorderColor()); 
      g.drawRect(getX(),getY(),getWidth(),getHeight()); 
     } 
     g.setColor(getOldColor()); 
     } 
    } 
    } 


    public boolean isMask() { 
    return mask; 
    } 

    public void setMask(boolean mask) { 
    this.mask = mask; 
    } 

    public Color getMaskColor() { 
    return maskColor; 
    } 

    public void setMaskColor(Color maskColor) { 
    this.maskColor = maskColor; 
    } 
} 

我現在得到這些錯誤消息。

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException 
    at GuessingGame.gameLogic(GuessingGame.java:74) 
    at GuessingGame.paint(GuessingGame.java:55) 
    at java.awt.Container.update(Container.java:1801) 
    at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239) 
    at sun.awt.RepaintArea.paint(RepaintArea.java:216) 
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:306) 
    at java.awt.Component.dispatchEventImpl(Component.java:4706) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Component.dispatchEvent(Component.java:4460) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

回答

0

你得到的GuessingGame.java的74行NullPointerException的方法gameLogic,相當於該行:

if(chosenBoxes[0].getBackColor() == chosenBoxes[1].getBackColor()) { 

和你得到一個NullPointerException異常的原因有,因爲之前該行就你這樣做:

chosenBoxes = new MaskableBox[2]; 

其中initailizes的MaskableBox 2個引用數組,但實際MaskableBox對象 neeed也要實例化 - 這有道理嗎?

基本上是這樣的:創建對象數組與創建對象數組不一樣,初始化數組中的每個元素。

0
因爲

在線73這樣做:

chosenBoxes = new MaskableBox[2]; 

即創建一個新的MaskableBox陣列(新陣列中的每個元素將是零)。你要做的下一行是:

chosenBoxes[0].getBackColor() == chosenBoxes[1].getBackColor() 

chosenBoxes [0]和chosenBoxes [1]都爲null,因爲您剛纔創建上一行chosenBoxes。刪除調用來創建一個新的MaskableBox數組,並且不會得到NullPointerException。