Другое значение после setValue - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в Java. У меня есть один проект для школы - это создание игры 2048. У нас есть шаблон, созданный моим лектором и основанный на Greenfoot.

EDIT: еще одна вещь, которую я заметил:

       fields[x][y].setValue(10);
        System.out.println("x1"+fields[x][y].getIntValue());
       fields[x-1][y].setValue(newValue);
        System.out.println("x1"+fields[x][y].getIntValue());

Я изменяю поле в позиции x на 10, после этого я печатаю значение поля в позиции x и его 10, затем я устанавливаю значение поля в позиции x-1, которое равно 2, затем я печатаю поле в позиции x и значение 2, а не 10. Почему?

Существует функция для установки значения текущего поля, но после установки нового значения программа возвращает другое значение.

Здесь я попытался получить строковое значение и значение типа int (не знаю, где может быть проблема, поэтому я попробовал это - не помогло):

package cz.mendelu.pjj.game2048.greenfoot;

import greenfoot.Actor;
import greenfoot.GreenfootImage;
import greenfoot.World;

import java.awt.*;

public class FieldActor extends Actor {

    private static final float ONE = Game2048World.SIZE * Game2048World.SIZE;
    private static final Font FONT = new Font(Font.MONOSPACED, Font.BOLD, 64);
    private static final int MARGIN = 5;
    private static String number = "";
    private static int sentValue = 0;

    public void setValue(int value) {
        GreenfootImage image = new GreenfootImage(Game2048World.CELL, Game2048World.CELL);

        sentValue = value;

        // Calculate nice color for background
        Color color = Color.LIGHT_GRAY;
        if (value > 1) {
            float base = Integer.SIZE - Integer.numberOfLeadingZeros(value);
            float c = base / ONE;
            color = new Color(1f - c, 1f, c);
        }

        // Draw background rectangle
        image.setColor(color);
        image.fillRect(MARGIN, MARGIN, Game2048World.CELL - (MARGIN * 2), Game2048World.CELL - (MARGIN * 2));

        // If not 0 draw Number
        if (value != 0) {
            image.setColor(Color.BLACK);
            number = Integer.toString(value);
            image.setFont(FONT);
            int x = Game2048World.CELL / 2 - (number.length() * 19);
            int y = Game2048World.CELL / 2 + 26;
            image.drawString(number, x, y);
        }
        setImage(image);
    }

    public String getValue() {
        return number;
    }

    public int getIntValue() {
        return sentValue;
    }

}

В этом классе я пытаюсь изменить значение текущего поля:

    package cz.mendelu.pjj.game2048;


import cz.mendelu.pjj.game2048.greenfoot.FieldActor;

public class Game2048 {

    public Game2048(int size) {

    }

    public int get(int x, int y, FieldActor[][] fields) {

        return 1;

    }

    public void addNewNumber() {
        System.out.println("addNewNumber");

        // Pokud číslo nejde pridat čísla (všechna pole jsou plná), pak vyvolejte kontrolovanou výjimku AddNewNumberException.
    }


    public boolean moveLeft(FieldActor[][] fields) {
        System.out.println("moveLeft");
        int x = 1;
        int y = 1;
        FieldActor currentField = fields[x][y];
        FieldActor previousField = fields[x-1][y];

        if (currentField.getValue() == previousField.getValue()) {
            System.out.println("true  condition: ");
            System.out.println("current field: "+currentField.getIntValue());
            System.out.println("previous field: "+previousField.getIntValue());

            int valueOfCurrent = currentField.getIntValue();
            int valueOfPrevious = previousField.getIntValue();
            int newValue = valueOfCurrent+valueOfPrevious;

            previousField.setValue(newValue);
            currentField.setValue(0);
            System.out.println("after setValue: ");
            System.out.println("current field: "+currentField.getIntValue());
            System.out.println("ValueOfCurrent "+valueOfCurrent);
            System.out.println("previous field: "+previousField.getIntValue());
            System.out.println("newValue "+newValue);
            System.out.println("previous field: "+previousField.getIntValue());
            System.out.println("valueOfPrevious "+valueOfPrevious);
            System.out.println("string value "+previousField.getValue());
        } else {
            System.out.println("false  condition: ");
        }

        return false;
    }

    public boolean moveRight() {
        System.out.println("moveRight");
        return false;
    }

    public boolean moveUp() {
        System.out.println("moveUp");
        return false;
    }

    public boolean moveDown() {
        System.out.println("moveDown");
        return false;
    }
}

Печатные значения:

currentField.setValue (0); двигай влево истинное состояние: текущее поле: 1 предыдущее поле: 1 после setValue: текущее поле: 0 ValueOfCurrent 1 предыдущее поле: 0 newValue 2 предыдущее поле: 0 valueOfPrevious 1 строковое значение 2

Отображаемые значения в игре: 1-й шаг влево: значения 2 и 0 2-й ход влево: значения 0 и 0

currentField.setValue (10); двигай влево истинное состояние: текущее поле: 1 предыдущее поле: 1 после setValue: текущее поле: 10 ValueOfCurrent 1 предыдущее поле: 10 newValue 2 предыдущее поле: 10 valueOfPrevious 1 строковое значение 10

Отображаемые значения в игре: 1-й шаг влево: значения 2 и 10 2-й ход влево: значения 20 и 10 3-й ... еще 20 и 10

этот класс является частью шаблона:

package cz.mendelu.pjj.game2048.greenfoot;

import cz.mendelu.pjj.game2048.Game2048;
import greenfoot.Greenfoot;
import greenfoot.World;

public class Game2048World extends World {

    static final int SIZE = 4;
    static final int CELL = 200;

    private Game2048 game2048 = new Game2048(SIZE);

    private FieldActor[][] fields = new FieldActor[SIZE][SIZE];

    public Game2048World() {
        super(SIZE, SIZE, CELL);
        for (int x = 0; x < SIZE ; x++) {
            for (int y = 0; y < SIZE; y++) {
                fields[x][y] = new FieldActor();
                addObject(fields[x][y], x, y);
            }
        }
        update();
    }

    @Override
    public void act() {
        String key = Greenfoot.getKey();
        if (key != null) {
            boolean valid = false;
            if (key == "left") {
                valid = game2048.moveLeft(fields);
            } else if (key == "right") {
                valid = game2048.moveRight();
            } else if (key == "up") {
                valid = game2048.moveUp();
            } else if (key == "down") {
                valid = game2048.moveDown();
            }

            if (valid == true) {
                try {
                    game2048.addNewNumber();
//                    update();
                } catch (RuntimeException e) {
                    //Gr
                }

            }
        }
    }


    private void update() {
        for (int x = 0; x < SIZE ; x++) {
            for (int y = 0; y < SIZE; y++) {
                fields[x][y].setValue(game2048.get(x, y, fields));
            }
        }
    }
}

классы FieldActor и Game2048World были в шаблоне. В FieldActor я просто добавил getValue и getIntValue и изменил number и intValue как глобальные переменные

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 06 ноября 2018

Я думаю, что путаница, вероятно, заключается в том, что sentValue является статичным. Слово static означает, что одно поле sentValue является общим для всех экземпляров FieldActor. Таким образом, когда вы устанавливаете значение для одного FieldActor (на самом деле: задаете общее значение для всех них), оно, похоже, меняется для другого FieldActor. Я думаю, что если вы сделаете соответствующие поля нестатичными, вы начнете получать ожидаемое поведение.

...