Возникли проблемы с распечаткой моей доски в игре Snake Game

Miguel Gonzalez спросил: 14 ноября 2017 в 05:48 в: java

Я не эксперт по java и столкнулся с проблемой в моей игре Snake. Я создал класс под названием GameManager:

public class GameManager {  private GameObject board[][];
  private int xR;
  private int yR;
  public Snake snk;
  private Food food;  public GameManager (String fileName) {
      BufferedReader fileInput = null;      try {
          fileInput = new BufferedReader(new FileReader(fileName));
          Scanner fileScanner = new Scanner(fileInput);
          int rows = fileScanner.nextInt();
          int cols = fileScanner.nextInt();          board = new GameObject[rows][cols];
          for (int row = 0; row < rows; row++) {
              for (int col = 0; col < cols; col++) {
                  board[row][col] = new Empty();
              }
          }           while(fileScanner.hasNext()) {
              fileScanner.nextLine();
              int xStart = fileScanner.nextInt();
              int yStart = fileScanner.nextInt();
              int xEnd = fileScanner.nextInt();
              int yEnd = fileScanner.nextInt();            addWall(xStart, yStart, xEnd, yEnd);
        }        addGameObject(snk);
        addGameObject(food);        fileScanner.close();    } catch(IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if(fileInput != null) {fileInput.close();}
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}public void newRandomXY() {
    Random r = new Random(0);
    this.xR = r.nextInt(board.length);
    this.yR = r.nextInt(board.length);
}public void addGameObject(GameObject s) {
    newRandomXY();
    while(board[xR][yR].isOccupied()) {
        newRandomXY();
    }    if(s instanceof Snake) {
        s = new Snake(xR, yR);
        board[xR][yR] = s;
    } else if(s instanceof Food) {
        s = new Food(xR, yR);
        board[xR][yR] = s;
    }
}public void addWall(int xStart, int yStart, int xEnd, int yEnd) {        
    for(int x = xStart; x <= xEnd; x++) {
        for(int y = yStart; y <= yEnd; y++) {
            board[x][y] = new Wall();
        }
    }
}@Override
public String toString() {    String ret = "";
    for (int row = 0; row < board.length; row++) {
        for (int col = 0; col < board[row].length; col++) {
            ret += board[row][col].toString();
        }
        ret += "\n";
    }
    return ret;
}

}

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

Вот мой класс Snake (Примечание: у меня также есть некоторые другие методы в этом классе, которые я не использую в настоящее время, поэтому я не думаю, что они являются проблемой):

public class Snake extends GameObject {
    private Point head;
    private Deque<Point> snakeBody;
    private int lenght = 0;
    private String direction = "UP";    public Snake(int x, int y) {
        this.head = super.newCell(x, y);
        this.snakeBody = new ArrayDeque<Point>();
        this.snakeBody.push(head);
    }

и мой toString of Snake:

 public String toString(Deque<Point> s) {
        String str = "";
        for(Point p : s) {
            String snk = p.toString();
            snk = "S";
            str += snk;
        }
        return str;
    }

Вот мой класс еды:

public class Food extends GameObject {
    private Point foodLoc;    public Food(int x, int y) {
        this.foodLoc = new Point(x, y);
    }    public Point getLocation() {
        return foodLoc.getLocation();
    }    public String toString() {
        return "F";
    }
}

, а вот мой класс GameObject:

import java.awt.Point;public class GameObject {    public final int CELL_SIZE = 1;    public Point newCell(int x, int y) {
        return new Point(x, y);
    }    public boolean isOccupied() {
        return true;
    }    public boolean isOccupied(Point p, Point o) {
        boolean flag = false;
        if(p.getLocation().equals(o.getLocation())) {
            flag = true;
        } else {
            flag = false;
        }        return flag;
    }}

У меня хорошее чувство, что мой метод toString в Snake совершенно неправильный, но я не обязательно понимаю, как это исправить и почему другие мои методы toString не работают , Я просмотрел форумы, чтобы узнать, смогу ли я найти и ответить, но ничего не нашел для этого.

0 ответов