0

我有一个TurnIndicator类,它的方法只返回"BLACK"、"BLACK"getTurn();的字符串,然后在"WHITE""BLACK"之间交替。

在我的Board类中,它结合了包中的所有类并使其一起工作,我创建了一个TurnIndicator类的实例_turn,并声明了一个_t具有初始值的实例变量然后,我为-_t = _turn.getTurn(); 定义了一个访问器方法。_tgetT()

现在,当我_t在类中打印值时Board,它会打印"BLACK"、"BLACK"等等。但是,当我在另一个类中访问_t值时,会打印.getT()SelectPieceListenernull

为什么会这样?

我在下面附上了我的类定义。不相关的部分被删除。

我最终要做的是根据c == _st.checkMoveImpossible()条件,让玩家在两个选项之间做出选择——

1.通过单击选择按钮(在这种情况下,_cmi变为1,并且selectClicked()方法为块执行所需的操作if(_cmi == 1)。更具体地说,它改变了_t值的顺序,以便玩家跳过一回合),或者

2.通过点击滚动按钮(在这种情况下,_cmi变成2,并在方法中做类似的事情scrollClicked()让当前玩家移动其他玩家的棋子。)。

_cmi == 1通过将所有内容都放在selectClicked()方法中来使案例操作起作用,但是我必须提供_cmi==2案例(当玩家单击滚动按钮时),所以我必须将它与方法分离。

现在,我一直在努力让它在课堂上工作,这样如果我成功SelectPieceListener了,我以后可以把它移到课堂上。Board

然而,我几个小时的每一次尝试都失败了。我一次编写了一两个类,这是我第一次做有很多类的项目。我对这种事情真的没有经验。

如果你能给我一些建议,那将对我有很大帮助。

我知道这确实是一项繁琐的工作,但我自己可能无法做到这一点。请花点时间阅读代码并帮助我。

public class Board {
private Structure _st;
private TurnIndicator _turn;
private String _t;
private int _cmi;

public Board() {
    _turn = new TurnIndicator();
    _t = _turn.getTurn();
    _cmi = 0;   
}

public ScrollListener getScroll(){
    return _scroll;
}

public String getT() {
    return _t;
}
public int setcmi(int cmi) {
    return _cmi = cmi;
}

public void selectClicked(char dir) {
    int index = _scroll.getX();
    HNode<ArrayList<String>> current = _st.getPosition(index);
    System.out.println("checkMoveImpossible() = " + _st.checkMoveImpossible());
    System.out.println("_t in Board = " + _t);

    if(!current.getDatum().isEmpty()) {

        if(_t == current.getDatum().get(current.getDatum().size()-1) && _cmi == 0) {
            if(0 <= index && index < 17 && index != _st.indexOfSpBack()) {
                current.forward(_t, current.getDatum().size());
            }
            else if(17 <= index && index < 25) {
                char direction = dir;
                _st.start(current, direction);
            }
            else if(index == _st.indexOfSpBack()) {
                current.backward(_t, current.getDatum().size()-1);
            }

            _t = _turn.getTurn();
            System.out.println("turn is "+ _t);
            display();
        }


        else if(_t != current.getDatum().get(current.getDatum().size()-1) && _cmi == 0) {
            String s = _t == "WHITE" ? "BLACK" : "WHITE";
            System.out.println("It's "+_t+"'s turn now and only "
            +s+" can move this piece.");
        }

    }

    if(_cmi == 1) {
        _t = _turn.getTurn();
        _cmi = 0;
        System.out.println("_cmi if block is reached");
        display();
    }
    update();

}

下面是 SelectPieceListener 类定义

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class SelectPieceListener implements ActionListener {
    private Board _board;
    private Structure _st;
    private String _t;

    public SelectPieceListener(Board board) {
        _board = board;
        _st = _board.getStructure();
        _t = _board.getT();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        char c = _t == "WHITE" ? 'b' : 'w';
        _board.selectClicked('l');          
        System.out.println(_t);
        if(c == _st.checkMoveImpossible()) {
            String theOther = _t == "WHITE" ? "BLACK" : "WHITE";
            System.out.println("No possible move for "+_t+": click select to skip turn, " +
                    "or click scroll to move " + theOther + " pieces.");
            _board.setcmi(1);
            _board.update();
            _board.selectClicked('l');          
        }

    }
}
4

3 回答 3

1

出色地,

我看你有一些我不推荐的东西。SelectPieceListener 中的 _t 和 _st 字段不是必需的,因为您可以从 _board 字段中获取它们,如果不需要,为什么要保留重复的引用?

另一方面,我看到你用 == 做了很多字符串比较,你应该总是使用“STRING_LITERAL”.equals(variable)。

之后,我建议您使用 Eclipse 之类的 IDE,以便您可以调试部分代码。如果您的变量为空,它可能会在某些时候丢失,调试器将是找到问题的最佳方法。

于 2013-04-04T08:26:59.073 回答
0

您在 Board 构造函数中有问题,应更改顺序:

public Board() {
    _turn = new TurnIndicator();   // <---- this goes first
    _t = _turn.getTurn();
    _cmi = 0;   
}
于 2013-04-04T08:27:26.373 回答
0
public class Board {
    private Structure _st;
    private TurnIndicator _turn; //instance variable, null before initialization
    private String _t;
    private int _cmi;

    public Board() {
    _t = _turn.getTurn(); //_turn is null, so... how do you are not getting a NPE?
    _cmi = 0;   
}
于 2013-04-04T08:27:45.297 回答