Java 用户绘制的线条消失,但其背后的功能不会消失

Java 用户绘制的线条消失,但其背后的功能不会消失,java,android,Java,Android,我正在创建一个益智游戏,基本上游戏的目的是使用连接(桥)和节点(岛)解决一个益智游戏。 为了解决这个难题,用户必须将相同数量的网桥连接到相应的节点权重 允许用户使用来自一个岛的2个网桥加入岛,但在他/她尝试连接来自同一节点的3个网桥后,连接应消失,并允许用户从该节点创建一个新网桥 问题: 用户可以从同一个节点绘制两个网桥,但一旦他尝试绘制第三个网桥,连接就会消失,这意味着节点仍然连接,然后用户无法再次绘制网桥 在这里,这些桥被直观地删除了 我试图调试它,但不幸的是,我似乎无法找出问题所在 这

我正在创建一个益智游戏,基本上游戏的目的是使用连接(桥)和节点(岛)解决一个益智游戏。
为了解决这个难题,用户必须将相同数量的网桥连接到相应的节点权重

允许用户使用来自一个岛的2个网桥加入岛,但在他/她尝试连接来自同一节点的3个网桥后,连接应消失,并允许用户从该节点创建一个新网桥

问题: 用户可以从同一个节点绘制两个网桥,但一旦他尝试绘制第三个网桥,连接就会消失,这意味着节点仍然连接,然后用户无法再次绘制网桥

在这里,这些桥被直观地删除了

我试图调试它,但不幸的是,我似乎无法找出问题所在

这是解决我问题的代码

public class BoardCreation {
  // This class member is used for random initialization purposes.
  static private final Random random = new Random();

  // The difficulty levels.
  private static final int EASY = 0;
  static public final int MEDIUM = 1;
  static public final int HARD = 2;

  static public final int EMPTY = 0;

  private static int ConnectionFingerprint(BoardElement start, BoardElement end) {
    int x = start.row * 100 + start.col;
    int y = end.row * 100 + end.col;
    // Swap to get always the same fingerprint independent whether we are called
    // start-end or end-start
    if (x > y ) {
      int temp = x;
      x = y;
      y = temp;
    }
    Log.d("", String.format("%d %d" , x ,y));
    return x ^ y;
  }

  public class State {
    // The elements of the board are stored in this array.
    // A value defined by "EMPTY" means that its not set yet.
    public BoardElement [][] board_elements = null;

    public int [][] cell_occupied = null;

    // The width of the board. We only assume squared boards.
    public int board_width=0;


    public State(int width) {
      board_width = width;
      board_elements = new BoardElement[width][width];
      cell_occupied = new int[width][width];
    }

    public State CloneWithoutConnections() {
      State newstate = new State(board_width);
      if (board_elements != null) {
    newstate.board_elements = new BoardElement[board_elements.length][board_elements.length];
    for (int i = 0; i < board_elements.length; ++i) {
      for (int j = 0; j < board_elements.length; ++j) {
        if (board_elements[i][j] == null)
              continue;
        newstate.board_elements[i][j] = board_elements[i][j].clone();
      }
    }
      }
      if (cell_occupied != null) {
          assert board_elements != null;
          newstate.cell_occupied = new int[board_elements.length][board_elements.length];
    for (int i = 0; i < board_elements.length; ++i) {
        System.arraycopy(cell_occupied[i], 0, newstate.cell_occupied[i], 0, board_elements.length);
    }
      }
      return newstate;
    }

    public void AddToBridgeCache(BoardElement first, BoardElement second) {
      if (first == null || second == null) { return; }
      final int fingerprint = ConnectionFingerprint(first, second);
      Log.d(getClass().getName(),
          String.format("Fingerprint of this bridge %d", fingerprint));
      // mark the end points as occupied.
      cell_occupied[first.row][first.col] = fingerprint;
      cell_occupied[second.row][second.col] = fingerprint;

      int dcol = second.col - first.col;
      int drow = second.row - first.row;

      if (first.row == second.row) {
    for (int i = (int) (first.col + Math.signum(dcol)); i != second.col; i += Math.signum(dcol)) {
      cell_occupied[first.row][i] = fingerprint;
        String.format("deleting bridge");
    }
      } else {
    assert first.col == second.col;
    for (int i = (int) (first.row + Math.signum(drow)); i != second.row; i+= Math.signum(drow)) {
      cell_occupied[i][first.col] = fingerprint;
        String.format("deleting bridge", fingerprint);

    }
      }
    }
  } // end of state
}
公共类创建{
//该类成员用于随机初始化目的。
静态私有最终随机=新随机();
//难度等级。
私有静态final int EASY=0;
静态公共最终int介质=1;
静态公共最终int硬=2;
静态公共最终整数为空=0;
专用静态int ConnectionFingerprint(BoardElement开始,BoardElement结束){
int x=start.row*100+start.col;
int y=end.row*100+end.col;
//交换以获得始终相同的指纹,无论我们是否被调用
//开始-结束或结束-开始
如果(x>y){
int-temp=x;
x=y;
y=温度;
}
Log.d(“,String.format(“%d%d”,x,y));
返回x^y;
}
公共阶级国家{
//电路板的元素存储在此阵列中。
//由“EMPTY”定义的值表示尚未设置该值。
公共BoardElement[]board_elements=null;
public int[][]单元占用=null;
//板的宽度。我们只假设为方形板。
公共int板_宽度=0;
公共状态(整数宽度){
板宽度=宽度;
board_elements=新的BoardElement[宽度][宽度];
单元占用=新整数[宽度][宽度];
}
公共状态CloneWithoutConnections(){
State newstate=新状态(电路板宽度);
if(电路板元素!=null){
newstate.board_elements=新的BoardElement[board_elements.length][board_elements.length];
对于(int i=0;i
我无法完全理解代码(不均匀的缩进没有帮助),但您似乎在不同的点设置
单元格占用[??][??]=指纹
(用于各种索引),我假设您正在“记录”桥,但我看不到您将其设置回空/无桥值的任何地方。@TripeHound我正试图使用它删除桥,我正试图打印“删除桥”进行调试,但如果(first.row==second.row){for(int I=(int)(first.col+Math.signum(dcol));I!=second.col;I+=Math.signum(dcol))在日志中看不到它{cell_occulated[first.row][i]=fingerprint;String.format(“删除桥”);}您实际上并没有在上面的代码中打印或记录这些消息:您只是格式化一个字符串并将其丢弃。但主要问题是:将该单元格设置为
fingerprint
是删除网桥的正确方法吗?是否应该将其设置为
null
或零或其他?(我不知道……我没有充分遵循代码,但您似乎没有将这些单元格设置为除
指纹
,这似乎不正确)以外的任何其他值。