2014-02-18 4 views
-2

Я выяснил, как переместить моего персонажа вокруг лабиринта, используя алгоритм, который я написал, но счет не получается правильно. В конце каждой строки мой персонаж перемещается вверх и вниз несколько раз, пока счетчик не достигнет указанного числа, чтобы выйти из цикла, тогда символ перемещается вдоль следующей строки вниз, пока не достигнет другой стороны, и повторяет движение вверх и вниз, пока count снова достигает указанного числа. Может ли кто-нибудь помочь мне найти причину моего счета? Ниже приведен алгоритм и класс лабиринта, с которого я звоню.Как исправить счетчики циклов для алгоритма лабиринта?

public class P4 { 

public static void main(String[] args) { 

    // Create maze 
    String fileName = args[3]; 
    Maze maze = new Maze(fileName); 
    System.out.println("Maze name: " + fileName); 

    // Get dimensions 
    int mazeWidth = maze.getWidth(); 
    int mazeHeight = maze.getHeight(); 

    // Print maze size 
    System.out.println("Maze width: " + mazeWidth); 
    System.out.println("Maze height: " + mazeHeight); 

    int r = 0; 
    int c = 0; 

    // Move commands 
    while (true){ 


     for (c = 0; c <= mazeWidth; c++){ 

      if (maze.moveRight()){ 
       maze.isDone(); 
       c++; 
      } 


      if (maze.isDone() == true){ 
       System.exit(1); 
      } 

      if (maze.moveRight() == false && c != mazeWidth){ 
       maze.moveDown(); 
       maze.moveRight(); 
       maze.moveRight(); 
       maze.moveUp(); 
       c++; 
      } 
     } 
     for (r = 0; r % 2 == 0; r++){ 
      maze.moveDown(); 
      maze.isDone(); 

      if (maze.isDone() == true){ 
       System.exit(1); 
      } 
     } 
     for (c = mazeWidth; c >= 0; c--){ 
      if (maze.moveLeft()){ 
       c--; 
       maze.isDone(); 
       System.out.println(c); 
      } 

      if (maze.isDone() == true){ 
       System.exit(1); 
      } 
      if (maze.moveLeft() == false && c != 0){ 
       maze.moveDown(); 
       maze.moveLeft(); 
       maze.moveLeft(); 
       maze.moveUp(); 
       c--; 
      } 
     } 
     for (r = 1; r % 2 != 0; r++){ 
      maze.moveDown(); 
      maze.isDone(); 

      if (maze.isDone() == true){ 
       System.exit(1); 
      } 
     } 

    } 
} 

}

public class Maze { 

// Maze variables 
private char mazeData[][]; 
private int mazeHeight, mazeWidth; 
private int finalRow, finalCol; 
int currRow; 
private int currCol; 
private int prevRow = -1; 
private int prevCol = -1; 

// User interface 
private JFrame frame; 
private JPanel panel; 
private Image java, student, success, donotpass; 
private ArrayList<JButton> buttons; 

// Maze constructor 
public Maze(String fileName) { 

    // Read maze 
    readMaze(fileName); 

    // Graphics setup 
    setupGraphics(); 
} 

// Get height 
public int getHeight() { 
    return mazeHeight; 
} 

// Get width 
public int getWidth() { 
    return mazeWidth; 
} 

// Move right 
public boolean moveRight() { 

    // Legal move? 
    if (currCol + 1 < mazeWidth) { 

     // Do not pass? 
     if (mazeData[currRow][currCol + 1] != 'D') 
     { 
      currCol++; 
      redraw(true); 
      return true; 
     } 
    } 
    return false; 
} 

// Move left 
public boolean moveLeft() { 

    // Legal move? 
    if (currCol - 1 >= 0) { 

     // Do not pass? 
     if (mazeData[currRow][currCol - 1] != 'D') 
     { 
      currCol--; 
      redraw(true); 
      return true; 
     } 
    } 
    return false; 
} 

// Move up 
public boolean moveUp() { 

    // Legal move? 
    if (currRow - 1 >= 0) { 

     // Do not pass? 
     if (mazeData[currRow - 1][currCol] != 'D') 
     { 
      currRow--; 
      redraw(true); 
      return true; 
     } 
    } 
    return false; 
} 

// Move down 
public boolean moveDown() { 

    // Legal move? 
    if (currRow + 1 < mazeHeight) { 

     // Do not pass? 
     if (mazeData[currRow + 1][currCol] != 'D') 
     { 
      currRow++; 
      redraw(true); 
      return true; 
     } 
    } 
    return false; 
} 

public boolean isDone() { 

    // Maze solved? 
    if ((currRow == finalRow) && (currCol == finalCol)) 
     return true; 
    else 
     return false; 
} 

private void redraw(boolean print) { 

    // Wait for awhile 
    try { 
     Thread.sleep(500); 
    } catch (InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 

    if (print) 
     System.out.println("Moved to row " + currRow + ", column " + currCol); 

    // Compute index and remove icon 
    int index = (prevRow * mazeWidth) + prevCol; 
    if ((prevRow >= 0) && (prevCol >= 0)) { 
     buttons.get(index).setIcon(null); 
    } 

    // Compute index and add icon 
    index = (currRow * mazeWidth) + currCol; 
    if ((currRow == finalRow) && (currCol == finalCol)) 
     buttons.get(index).setIcon(new ImageIcon(success)); 
    else 
     buttons.get(index).setIcon(new ImageIcon(student)); 

    // Store previous location 
    prevRow = currRow; 
    prevCol = currCol; 
} 

// Set button 
private void setButton(JButton button, int row, int col) { 

    if (mazeData[row][col] == 'S') { 
     button.setIcon(new ImageIcon(student)); 
     currRow = row; 
     currCol = col; 
    } else if (mazeData[row][col] == 'J') { 
     button.setIcon(new ImageIcon(java)); 
     finalRow = row; 
     finalCol = col; 
    } else if (mazeData[row][col] == 'D') { 
     button.setIcon(new ImageIcon(donotpass)); 
    } 
} 

// Read maze 
private void readMaze(String filename) { 
    try { 

     // Open file 
     Scanner scan = new Scanner(new File(filename)); 

     // Read numbers 
     mazeHeight = scan.nextInt(); 
     mazeWidth = scan.nextInt(); 

     // Allocate maze 
     mazeData = new char[mazeHeight][mazeWidth]; 

     // Read maze 
     for (int row = 0; row < mazeHeight; row++) { 

      // Read line 
      String line = scan.next(); 
      for (int col = 0; col < mazeWidth; col++) { 
       mazeData[row][col] = line.charAt(col); 
      } 
     } 

     // Close file 
     scan.close(); 

    } catch (IOException e) { 
     System.out.println("Cannot read maze: " + filename); 
     System.exit(0); 
    } 
} 

// Setup graphics 
private void setupGraphics() { 

    // Create grid 
    frame = new JFrame(); 
    panel = new JPanel(); 
    panel.setLayout(new GridLayout(mazeHeight, mazeWidth, 0, 0)); 
    frame.add(Box.createRigidArea(new Dimension(0, 5)), BorderLayout.NORTH); 
    frame.add(panel, BorderLayout.CENTER); 

    // Look and feel 
    try { 
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // Configure window 
    frame.setSize(mazeWidth * 100, mazeHeight * 100); 
    frame.setTitle("Maze"); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setAlwaysOnTop(true); 

    // Load and scale images 
    ImageIcon icon0 = new ImageIcon("Java.jpg"); 
    Image image0 = icon0.getImage(); 
    java = image0.getScaledInstance(100, 100, Image.SCALE_DEFAULT); 

    ImageIcon icon1 = new ImageIcon("Student.jpg"); 
    Image image1 = icon1.getImage(); 
    student = image1.getScaledInstance(100, 100, Image.SCALE_DEFAULT); 

    ImageIcon icon2 = new ImageIcon("Success.jpg"); 
    Image image2 = icon2.getImage(); 
    success = image2.getScaledInstance(100, 100, Image.SCALE_DEFAULT); 

    ImageIcon icon3 = new ImageIcon("DoNotPass.jpg"); 
    Image image3 = icon3.getImage(); 
    donotpass = image3.getScaledInstance(100, 100, Image.SCALE_DEFAULT); 

    // Build panel of buttons 
    buttons = new ArrayList<JButton>(); 

    for (int row = 0; row < mazeHeight; row++) { 
     for (int col = 0; col < mazeWidth; col++) { 

      // Initialize and add button 
      JButton button = new JButton(); 
      Border border = new LineBorder(Color.darkGray, 4); 
      button.setOpaque(true); 
      button.setBackground(Color.gray); 
      button.setBorder(border); 
      setButton(button, row, col); 
      panel.add(button); 
      buttons.add(button); 
     } 
    } 

    // Show window 
    redraw(false); 
    frame.setVisible(true); 
} 

}

+1

Что именно вы пытаетесь подсчитать? Код, который вы опубликовали, невозможно понять, не зная, что делает класс 'Maze', поэтому я сомневаюсь, что вы получите ответы на все вопросы. Пожалуйста, либо объясните словами, что ваш алгоритм и методы этого класса, либо включите код. Вероятно, вы также должны добавить тег 'java', если это некоторая языковая функция, с которой вы спотыкаетесь (я не вижу ничего очевидного, но я не писал java через 10 лет, так что это не означает слишком много). – Blckknght

+0

Я подсчитываю, как движется персонаж, когда он идет с одной стороны лабиринта на другую сторону. Как только он достигнет определенного счета, он должен пойти вниз и вернуться через лабиринт. В конце концов это происходит, но персонаж застревает в конце каждой строки, пока счет не достигнет определенного числа. Либо mazeWidth на нужный размер, либо 0 слева. – drewless

ответ

0

Одна ошибка, я могу видеть в своем коде, что вы приращение вашего c счетчика чаще, чем следовало бы. Вы начинаете с него, управляемый вашим циклом for, а это означает, что он будет увеличиваться (или уменьшаться, для движущейся влево) в конце каждого прохода через цикл. Тем не менее, вы также увеличиваете его дополнительное время в двух ваших операциях if. Это означает, что c может увеличиться на два или три на один проход через цикл, что, вероятно, не то, что вы намереваетесь.

Кроме того, счетчик не обязательно имеет ничего общего с количеством ходов, которые вы совершаете. Код цикла всегда будет увеличивать его на единицу, даже если вы неоднократно пытаетесь пройти через непроходимую стену.

Я действительно не понимаю, каким должен быть ваш алгоритм, поэтому у меня нет подробных рекомендаций по исправлению кода.

Одно из предложений, которое у меня есть, заключается в том, что вы, вероятно, никогда не хотите, чтобы вы вызывали методы на своем классе Maze, не обращая внимания на их возвращаемые значения. У вас есть куча мест, где вы вызываете isDone, но игнорируете возвращаемое значение, что не имеет никакого смысла. Аналогично, вы всегда должны проверять возвращаемые значения из своих вызовов moveX, чтобы узнать, было ли движение успешным или нет. В противном случае вы можете просто промахнуться вокруг кучки, без вашего кода, имеющего какую-либо подсказку, где вы находитесь в лабиринте.

+0

Большое спасибо за советы. Я попытаюсь выполнить предложенные вами изменения. К сожалению, у меня просто не хватило времени, чтобы сделать это, но ваш ответ определенно помог мне разобраться в моих ошибках. – drewless

Смежные вопросы