【问题标题】:Infinate While Loop. Stalling the program无限循环。停止程序
【发布时间】:2015-02-07 00:08:53
【问题描述】:

所以,我正在开发一个大型编程项目 1。我不知道如何使用网站上提供的任何其他方式来停止无限 while 循环。以下是涉及玩家移动的所有方法:

public boolean movement(Move m, int moved){
        int rowM, colM, row, col;
        Player p = m.getPlayer();
        if (moved == 0 || moved == 1 || moved == 7)
            rowM = -1;
        if (moved == 2 || moved == 6)
            rowM = 0;
        if (moved == 3 || moved == 4 || moved == 5)
            rowM = 1;
        else
            rowM = 0;
        if (moved == 5 || moved == 6 || moved == 7)
            colM = -1;
        if (moved == 0 || moved == 4)
            colM = 0;
        if (moved == 1 || moved == 2 || moved == 3)
            colM = 1;
        else
            colM = 0;
        row = rowM + m.getRow();
        col = colM + m.getColumn();
        if (!onBoard(row, col) || !getPiece(row, col).opposite(p.getPiece()))
            return false;
        while ((onBoard(row,col))&&(getPiece(row,col).opposite(p.getPiece()))){
            row += rowM;
            col += colM;
        }
        if (onBoard(row, col) && getPiece(row, col).opposite(p.getPiece()))
            return true;
        return false;

    }
    private void change(Move m, int moved){
        int rowM, colM, row, col;
        Player p = m.getPlayer();
        if (moved == 0 || moved == 1 || moved == 7)
            rowM = -1;
        if (moved == 2 || moved == 6)
            rowM = 0;
        if (moved == 3 || moved == 4 || moved == 5)
            rowM = 1;
        else
            rowM = 0;
        if (moved == 5 || moved == 6 || moved == 7)
            colM = -1;
        if (moved == 0 || moved == 4)
            colM = 0;
        if (moved == 1 || moved == 2 || moved == 3)
            colM = 1;
        else
            colM = 0;
        row = rowM + m.getRow();
        col = colM + m.getColumn();
        while (getPiece(row, col).opposite(p.getPiece())){
            setPiece(p.getPiece(), row, col);
            row += rowM;
            col += colM;
        }
    }
    public void makeMove(Move move){
        Player p = move.getPlayer();
        for (int c = 0; c < 8; c++){
            if (movement(move, c))
                change(move, c);
        }
        setPiece(p.getPiece(), move.getRow(), move.getColumn());
    }
    public int handleTurn(Display display){
        Move m = display.getMove(this.current);

        if (!moveLegal(m)){
            display. displayMessage("Illegal Move!");
            return 1;
        }
        makeMove(m);
        Player p = getNextPlayer();
        if (p == current)
            display.displayMessage("Skipped! " + other.getName().toString()); 
        if (gameOver())
            return -1;
        else {
            other = current;
            current = p;
        }
        display.displayStatus(current, "Your Move!");
        return 0; 
    }

【问题讨论】:

  • 什么死循环在哪里?你试过调试器吗?
  • 我就是这样找到它的。就是运动方式。
  • 检查方法 onBoard(row, col) 和 getPiece 这些有什么作用?

标签: java while-loop logic infinite-loop


【解决方案1】:

我需要更多的源代码来给你一个准确的答案。不过,我相信我可以帮助您进行一些观察。

  • 如果方法 参数moved 超出范围07
  • 在移动方法中,最终的if 条件永远无法计算 到true,因为需要相同的条件来评估 false 在循环退出之前。

基于这些观察,我建议你试试这个版本的移动方法:

public boolean movement(Move m, int moved)
{
    int rowM, colM, row, col;
    Player p = m.getPlayer();
    if (moved == 0 || moved == 1 || moved == 7)
        rowM = -1;
    else if (moved == 3 || moved == 4 || moved == 5)
        rowM = 1;
    else // moved == 2 || moved == 6
        rowM = 0;
    if (moved == 5 || moved == 6 || moved == 7)
        colM = -1;
    else if (moved == 1 || moved == 2 || moved == 3)
        colM = 1;
    else // moved == 0 || moved == 4
        colM = 0;
    row = rowM + m.getRow();
    col = colM + m.getColumn();
    return onBoard(row, col) && getPiece(row, col).opposite(p.getPiece());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2014-01-05
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多