我有一个TurnIndicator
类,它的方法getTurn();
只返回“BLACK”,“BLACK”的字符串,然后在“WHITE”之间交替< / em>和“BLACK”。
在我的Board
类中,它结合了包中的所有类并使它一起工作,我创建了一个TurnIndicator
类的实例,_turn
,并声明了一个实例变量{{ 1}},初始值为_t
然后,我为_t = _turn.getTurn();
- _t
定义了一个访问器方法。
现在,当我在getT()
类中打印_t
值时,会打印“BLACK”,“BLACK”,依此类推。
但是,当我在另一个类Board
中使用_t
访问getT()
值时,会打印 SelectPieceListener
。
为什么会这样?
我在下面附上我的课程定义。不相关的部分被删除。
我最终想要做的是取决于null
条件,让游戏玩家在两个选项之间做出选择 -
1。(在这种情况下,c == _st.checkMoveImpossible()
变为 1 ,_cmi
方法为selectClicked()
阻止执行所需操作。更具体地说,它会更改if(_cmi == 1)
值的顺序,以便玩家跳过一个回合),或
2。(在这种情况下,_t
变为 2 ,并在_cmi
方法中执行类似操作以让当前玩家移动其他玩家的作品。)。
我通过将所有内容放在scrollClicked()
方法中,只做_cmi == 1
案例操作,但我必须提供selectClicked()
个案(当玩家点击滚动按钮时),所以我有将它与方法分离。
现在,我一直试图让它在_cmi==2
课程中工作,这样如果我成功,我可以稍后将它移到SelectPieceListener
课程。
但是,我几个小时的尝试都失败了。 我一次编写了一两个类,这是我第一次用很多类编写项目。我真的对这种事情缺乏经验。
如果你能给我一些建议,那将对我有所帮助。
我知道这是一项非常繁琐的工作,但我自己可能无法做到这一点。 请花一些时间阅读代码并帮助我。
Board
下面是SelectPieceListener类定义
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();
}
答案 0 :(得分:1)
那么,
我看到你有一些我不推荐的东西。 SelectPieceListener中的_t和_st字段不是必需的,因为你可以从_board字段中获取它们,为什么在没有必要时保留重复的引用呢?
另一方面,我看到你用==做了很多String比较,你应该总是使用“STRING_LITERAL”.equals(变量)。
之后,我建议您使用像Eclipse这样的IDE,以便调试部分代码。如果你的变量为null,它可能会在某些时候丢失,调试器将是找到问题的最佳方法。
答案 1 :(得分:0)
您在Board构造函数中遇到问题,订单应该更改:
public Board() {
_turn = new TurnIndicator(); // <---- this goes first
_t = _turn.getTurn();
_cmi = 0;
}
答案 2 :(得分: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;
}