Как исправить ошибку с бесконечной записью чисел, используя FileWriter с аргументом добавления - PullRequest
0 голосов
/ 09 марта 2019

Я столкнулся с одной проблемой, которую я пытаюсь решить.Представьте себе простую игру, в которой какой-то объект, назовем его автомобилем, остается неподвижным по оси X (х = 50) и может двигаться только по оси Y (вверх и вниз).В то же время другие объекты создаются вне экрана в случайной точке (и движутся к моему первому объекту), поэтому их координаты уменьшаются по оси X.Как только каждый объект достигает координат моего первого объекта, некоторая переменная int Scores; увеличивается.

int scores;
if(cars.getX() == getCarPos_X() && cars.getY() != getCarPos_Y() )
   scores++;

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

Так в чем же проблема? Я использую таймер, который считает время между перекрасками.Все объекты передаются в paintComponent, где фактически рисуется весь графический объект.В actionPerformed я вызываю методы для всех ходов и один метод, который проверяет, не произошло ли столкновение с другим автомобилем.В случае столкновения игра останавливается, и результаты должны быть записаны в некоторый текстовый файл.Проблема в том, что, хотя два объекта имеют одинаковые координаты, JVM записывает в файл бесконечное количество цифр ( баллов ) (я думаю, это потому, что координаты перестают уменьшаться и каждый интервал таймера проверяется на столкновение, и это == true, так как игра остановлена, и объект остается там, где они есть.) Таким образом, мои результаты в текстовом файле выглядят так:

0
0
0
0

В одном столбце.Или он отображает любой счет, который у меня есть.И так далее ...


Вот фрагмент кода, который я использовал

public void actionPerformed(ActionEvent e)
{
  animate();
  checkTouch();
}
private void animate()
{
  //here code that creates obstacles and moves them
}
 checkTouch()
{
  //objects creating in some inner class Cars and add to ArrayList ( I don’t mention about it as it is beside the point )
  for(Cars car : cars)
   {
     if((cars.getX() == getCarPos_X && cars. getY() == getCarPos_Y())
     {
       //boolean var which stops game
       inGame = false;
       writeScore();
     }
   }
}
 public void writeScore()
{
  File scoresTxt = new File("scores.txt");
  FileWriter fw = null;
  BufferedWriter bw = null;
  try
   {
     fw = new FileWriter(scoresTxt, true);
     bw = new BufferedWriter(fw);
     bw.write(scores + "\n");
   }catch (IOException e)
    {
     e.printStackTrace();
    }finally
    {
     try
      {
        bw.flush();
        bw.close();
        fw.close();
      }catch(IOException e)
       {
         e.printStackTrace();
       }
    }
}
public void paintComponent (Graphics g)
{
 if(inGame)
 {
 g.drawImage(myCar, 50, 100, this);

 for(Cars car : cars)
 {
   g.drawImage(obstacleCar, car.getX(), car.getY(), this);
 }
  }
}

Если вам понадобится какой-то дополнительный код, который я использовал, напишите комментарий, и я добавлю его, И снова мне нужно исправить ошибку, которая записывает бесконечный столбец чисел вместо одного окончательного результата с момента столкновения. Что не так с моим кодом и как решить эту проблему?Дайте мне совет для самого простого решения, так как я начинающий.Заранее спасибо!

1 Ответ

0 голосов
/ 10 марта 2019

Если ваш таймер запускается так или что-то подобное, вы можете отменить его, когда переменная inGame станет false. Хорошая статья о таймерах .

TimerTask task = new TimerTask() {
    public void run() {
        if (!inGame)
            cancel();
        else
            // whatever it is that you are doing now
    }
};

Возможно, вы захотите остановить обработку событий в методе actionPerformed (e) аналогичным образом.

if (!inGame) 
    return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...