2016-10-03 105 views
-1

在我的幫助下,我應該修改一個greenfoot項目,通過創建私有數據類型,使用setter和getters來展示數據封裝的理解,以及修改遊戲中觸及和遺漏的病毒和細菌的值評分系統。我能夠讓評分系統工作,但是當我運行遊戲時,它只會將setter的值遞增1,並且不會計數通過該值。試圖通過setter和getter增加一個值,但值不會增加?

public class Bloodstream extends World 
{ 
    private int score; 
    private int time; 

    /**New Private variables **/ 

    private int numberOfBacteriaTouched; 
    private int numberOfBacteriaMissed; 
    private int numberOfVirusTouched; 
    private int numberOfVirusMissed; 

    /** 
    * Constructor: Set up the staring objects. 
    */ 
    public Bloodstream() 
    {  
     super(780, 360, 1); 
     setPaintOrder(Border.class); 
     prepare(); 
     score = 0; 
     time = 2000; 
     this.numberOfBacteriaTouched= 0; 
     this.numberOfBacteriaMissed = numberOfBacteriaMissed; 
     this.numberOfVirusTouched = 0; 
     this.numberOfVirusMissed = numberOfVirusMissed; 
     showScore(); 
     showTime(); 
    } 

    /** 
    * Create new floating objects at irregular intervals. 
    */ 
    public void act() 
    { 
     if (Greenfoot.getRandomNumber(100) < 3) 
     { 
      addObject(new Bacteria(), 779, Greenfoot.getRandomNumber(360)); 
     } 

     if (Greenfoot.getRandomNumber(100) < 1) 
     { 
      addObject(new Lining(), 779, 0); 
     } 

     if (Greenfoot.getRandomNumber(100) < 1) 
     { 
      addObject(new Lining(), 779, 359); 
     } 

     if (Greenfoot.getRandomNumber(100) < 1) 
     { 
      addObject(new Virus(), 779, Greenfoot.getRandomNumber(360)); 
     } 

     if (Greenfoot.getRandomNumber(100) < 6) 
     { 
      addObject(new RedCell(), 779, Greenfoot.getRandomNumber(360)); 
     } 
     countTime(); 
    } 

    /** Getters for new variables **/ 

    public int getNumberOfBacteriaTouched() 
    { 
     return numberOfBacteriaTouched; 
    } 

    public int getNumberBacteriaMissed() 
    { 
     return numberOfBacteriaMissed; 
    } 

    public int getNumberOfVirusTouched() 
    { 
     return numberOfVirusTouched; 
    } 

    public int getNumberOfVirusMissed() 
    { 
     return numberOfVirusMissed; 
    } 

     /** Setters for new variables **/ 

    public void setNumberOfBacteriaTouched(int numberOfBacteriaTouched) 
    { 
     this.numberOfBacteriaTouched = numberOfBacteriaTouched; 
    } 

    public void setNumberOfBacteriaMissed(int numberOfBacteriaMissed) 
    { 
     this.numberOfBacteriaMissed= numberOfBacteriaMissed; 
    } 

    public void setNumberOfVirusTouched(int numberOfVirusTouched) 
    { 
     this.numberOfVirusTouched= numberOfVirusTouched; 
    } 

    public void setNumberOfVirusMissed(int numberOfVirusMissed) 
    { 
     this.numberOfVirusMissed= numberOfVirusMissed; 
    } 


    /** 
    * Add some points to our current score. (May be negative.) 
    * If the score falls below 0, game's up. 
    */ 
    public void addScore(int points) 
    { 
     score = score + points; 
     showScore(); 
     if (score < 0) 
     { 
      Greenfoot.playSound("game-over.wav"); 
      Greenfoot.stop(); 
     } 
    } 

    /** 
    * Show our current score on screen. 
    */ 
    private void showScore() 
    { 
     showText("Score: " + score, 80, 25); 
     showText("Bacteria Eaten: " + getNumberOfBacteriaTouched(), 80, 325); 
     showText("Virus Missed: " + getNumberOfVirusMissed(), 80, 300); 
    } 

    /** 
    * Count down the game time and display it. Stop the game 
    * with a winning message when time is up. 
    */ 
    private void countTime() 
    { 
     time--; 
     showTime(); 
     if (time == 0) 
     { 
      showEndMessage(); 
      Greenfoot.stop(); 
     } 
    } 

    /** 
    * Show the remaining game time on screen. 
    */ 
    private void showTime() 
    { 
     showText("Time: " + time, 700, 25); 
    } 

    /** 
    * Show the end-of-game message on screen. 
    */ 
    private void showEndMessage() 
    { 
     showText("Time is up - you win!", 390, 150); 
     showText("Your final score: " + score + " points", 390, 170); 
    } 

    /** 
    * Prepare the world for the start of the program. In this case: Create 
    * a white blood cell and the lining at the edge of the blood stream. 
    */ 
    private void prepare() 
    { 
     WhiteCell whitecell = new WhiteCell(); 
     addObject(whitecell, 128, 179); 

     Lining lining = new Lining(); 
     addObject(lining, 126, 1); 
     Lining lining2 = new Lining(); 
     addObject(lining2, 342, 5); 
     Lining lining3 = new Lining(); 
     addObject(lining3, 589, 2); 
     Lining lining4 = new Lining(); 
     addObject(lining4, 695, 5); 
     Lining lining5 = new Lining(); 
     addObject(lining5, 114, 359); 
     Lining lining6 = new Lining(); 
     Lining lining7 = new Lining(); 
     addObject(lining7, 295, 353); 
     Lining lining8 = new Lining(); 
     Lining lining9 = new Lining(); 
     Lining lining10 = new Lining(); 
     addObject(lining10, 480, 358); 
     Lining lining11 = new Lining(); 
     addObject(lining11, 596, 359); 
     Lining lining12 = new Lining(); 
     addObject(lining12, 740, 354); 

     Border border = new Border(); 
     addObject(border, 0, 180); 
     Border border2 = new Border(); 
     addObject(border2, 770, 180); 
    } 
} 

這是主類的副本,這裏是計數器用於的子類?

import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) 


public class WhiteCell extends Actor 
{ 
    /** 
    * Act: move up and down when cursor keys are pressed. 
    */ 
    public void act() 
    { 
     checkKeyPress(); 
     checkCollision(); 
    } 

    /** 
    * Check whether a keyboard key has been pressed and react if it has. 
    */ 
    private void checkKeyPress() 
    { 
     if (Greenfoot.isKeyDown("up")) 
     { 
      setLocation(getX(), getY()-8); 
     } 

     if (Greenfoot.isKeyDown("down")) 
     { 
      setLocation(getX(), getY()+8); 
     } 

     if (Greenfoot.isKeyDown("right")) 
     { 
      setLocation(getX()+4, getY()); 
     } 

     if (Greenfoot.isKeyDown("left")) 
     { 
      setLocation(getX()-4, getY()); 
     } 
    } 

    /** 
    * Check whether we are touching a bacterium or virus. Remove bacteria. 
    * Game over if we hit a virus. 
    */ 
    private void checkCollision() 
    { 
     if (isTouching(Bacteria.class)) 
     { 
      Greenfoot.playSound("slurp.wav"); 
      removeTouching(Bacteria.class); 
      Bloodstream bloodstream = (Bloodstream)getWorld(); 
      bloodstream.addScore(1); 
      bloodstream.setNumberOfBacteriaTouched(+1); 
     } 

     if (isTouching(Virus.class)) 
     { 
      removeTouching(Virus.class); 
      Bloodstream bloodstream = (Bloodstream)getWorld(); 
      bloodstream.addScore(-2); 
      bloodstream.setNumberOfVirusTouched(+1); 
     } 
    } 
} 

感謝您的幫助!

+1

的變量,如果你向我們展示了'setLocation代碼()' – FredK

回答

0

,如果你看一下二傳的代碼,它的目的是設置的價值,而不是增量它。每執行一次,它就會將值numberOfBacteriaTouched設置爲1。這就是爲什麼你的計數器第一次工作,但不算通過一個。

public void setNumberOfBacteriaTouched(int numberOfBacteriaTouched) 
    { 
     this.numberOfBacteriaTouched = numberOfBacteriaTouched; 
    } 

增加值的正確方法是使用getter獲取值,將值加1並使用setter對其進行設置。

bloodstream.setNumberOfBacteriaTouched(bloodstream.getNumberOfBacteriaTouched()+1); 
    bloodstream.setNumberOfVirusTouched(bloodstream.getNumberOfVirusTouched()+1); 

或者,您也可以編寫遞增1

public void incrementNumberOfBacteriaTouched() 
    { 
     this.numberOfBacteriaTouched++; 
    } 
+0

由於這將是有益的不同的方法,你的第一個解決方案最終成爲我需要的解決方案。我遇到的唯一的其他問題是計數器的第一次迭代保持爲零,然後它開始正常工作。 –

0
public void setNumberOfBacteriaTouched(int numberOfBacteriaTouched) 
{ 
    this.numberOfBacteriaTouched = numberOfBacteriaTouched; 
} 

看看該方法在做什麼。它將接觸的數字設置爲您通過的任何值。您沒有添加該值,而是設置了一個全新的值。

0

您每次checkCollision()時都會重新初始化血流類。嘗試移動實例化出checkCollision()方法

private Bloodstream bloodstream; 
     onCreate(){ 
     bloodstream = (Bloodstream)getWorld();   
    } 
    private void checkCollision(){ 
     if (isTouching(Bacteria.class)) 
     { 
      Greenfoot.playSound("slurp.wav"); 
      removeTouching(Bacteria.class); 
      bloodstream.addScore(1); 
      bloodstream.setNumberOfBacteriaTouched(+1); 
     } 

     if (isTouching(Virus.class)) 
     { 
      removeTouching(Virus.class); 
      bloodstream.addScore(-2); 
      bloodstream.setNumberOfVirusTouched(+1); 
     } 
    }