我一直在为我的班级项目构建一个多人棋盘游戏。下面的代码在Room类中,因为每个游戏都应该有一个棋盘。
我转换为2D列表是因为Firebase不序列化数组。
列表中存储的每个对象都是Checker的一个子类,包括nullc(null的替代品(。我之所以在列表中存储nullc,是因为列表中有两行只有nulls,而Firebase不存储这两行的索引。
this.checkerList = new ArrayList<List<Checker>>();
Checker nullc = new NullChecker();
Checker [][] checkerArray = new Checker[][]
{{nullc, new RedChecker(0,1), nullc, new RedChecker(0,3),
nullc, new RedChecker(0,5), nullc, new RedChecker(0,7)},
{new RedChecker(1,0), nullc, new RedChecker(1,2),nullc, new RedChecker(1,4), nullc, new RedChecker(1,6), nullc},
{nullc, new RedChecker(2,1), nullc, new RedChecker(2,3), nullc, new RedChecker(2,5), nullc, new RedChecker(2,7)},
{nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
{nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
{new BlackChecker(5,0), nullc, new BlackChecker(5,2),nullc, new BlackChecker(5,4), nullc, new BlackChecker(5,6), nullc},
{nullc, new BlackChecker(6,1), nullc, new BlackChecker(6,3), nullc, new BlackChecker(6,5), nullc, new BlackChecker(6,7)},
{new BlackChecker(7,0), nullc, new BlackChecker(7,2),nullc, new BlackChecker(7,4), nullc, new BlackChecker(7,6), nullc}};
for(int r = 0; r < checkerArray.length; r++){
List <Checker> row = new ArrayList <Checker>();
for(int c = 0; c < checkerArray[r].length; c++){
row.add(checkerArray[r][c]);
}
this.checkerList.add(row);
}
我现在遇到的问题是该列表在Firebase数据库中存储良好。然而,当我从数据库中检索整个列表时,子类不再是子类
refThisRoom.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue(Room.class).getPlayer2() != null){
turn = dataSnapshot.getValue(Room.class).getTurn();
checkerList = dataSnapshot.getValue(Room.class).getCheckerList();
for(int r = 0; r < checkerList.size(); r++){
Log.d("checkerList", "row" + String.valueOf(r));
Log.d("checkerList", "rowSize" + String.valueOf(checkerList.size()));
for(int c = 0; c < checkerList.get(r).size(); c++){
Log.d("checkerList", "Column" + String.valueOf(c));
Log.d("checkerList", "ColumnSize" + String.valueOf(checkerList.get(r).size()));
Log.d("checkerList","hello: "+checkerList.get(r).get(c).getClass().getSimpleName());
}
}
Toast.makeText(BlackCheckerActivity.this,"Player Entered",Toast.LENGTH_LONG).show();
updateAllButtons();
disableButtons();
}
else{
Toast.makeText(BlackCheckerActivity.this,"Waiting for another player",Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
它不是返回BlackChecker、RedChecker和NullChecker,而是返回checker。我现在被卡住了,因为我正在使用instanceof来确定每个检查器的移动。
我通过在构造函数的父类中添加另一个名为"type"的类型字符串字段来解决这个问题。对于子类,当我创建一个子类时,我写了
new RedChecker(row, column, "RedChecker")
new BlackChecker(row, column, "BlackerChecker")
new NullChecker(row, column, "NullChecker").
当检索Checker类的列表时,我用新启动的子类替换了对象中的所有超类。类似的东西
if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
}