簡體   English   中英

試圖通過setter和getter增加值,但是值不會增加?

[英]Trying to increment a value through setter and getter, but value won't increment?

在我的評估中,我應該通過創建私有數據類型並使用setter和getter展示對數據封裝的理解,並修改得分來修改greenfoot項目,以顯示游戲中接觸和遺漏的病毒和細菌的值。系統。 我能夠使用計分系統,但是當我運行游戲時,它只會將二傳手的值增加一,而不會計入通過的次數。

 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);
        }
    }
}

謝謝您的幫助!

如果您查看設置器代碼,則意味着設置該值而不是增加它。 每次執行時,它將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++;
    }
public void setNumberOfBacteriaTouched(int numberOfBacteriaTouched)
{
    this.numberOfBacteriaTouched = numberOfBacteriaTouched;
}

看一下該方法在做什么。 它會將觸摸的數字設置為您傳遞的任何值。您沒有添加該值,而是設置了一個全新的值。

每次調用checkCollision()時,您都將重新初始化類Bloodstream。 嘗試將實例化移出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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM