Java while循环,超出应有的循环次数

我只是在业余时间制作一款简单的《扫雷》游戏。为了放置地雷,我运行while循环,直到地雷总数==所选级别所需的地雷数量。


但是,我总是得到比预期更多的地雷!我唯一的想法是while循环在多个线程上运行,但是我试图阻止它,但是它仍然会产生比我想要的更多的地雷。我对线程也不太满意,因为我没有尝试使用它们特别是之前。


我正在使用“处理”来简化创建窗口和绘制的过程。


我尝试了不同的事情。将同步添加到函数负载中,简单的int计数= 0; 然后每次放置地雷时都会增加计数,这会使情况变得更糟?!?!


    private synchronized void placeMines() {

  ExecutorService es = Executors.newSingleThreadExecutor();


  class placeThread implements Runnable {


    Grid grid;


    public placeThread(Grid grid) { this.grid = grid; }


    public void run() {


      final int mines = mode.mines;

      //int mCount = 0;

      while(this.grid.mineCount() < mines) {

        this.grid.addMine();

      }

      println(grid.mineCount());

    }


  }


  es.execute(new placeThread(this));


}


public synchronized boolean addMine() {

    int randX = (int) Math.floor(Math.random() * this.cols);

    int randY = (int) Math.floor(Math.random() * this.rows);

    Cell selected = getCell(randX, randY);

    if(selected.getValue() == 9) {

      selected.setValue(9);

      return true;

    }

    return false;

}


public synchronized int mineCount() {


  int mCount = 0;

  for(ArrayList<Cell> row : this.cells) {

    for(Cell c : row) {

      if(c.isMine()) mCount++;

    }

  }

编辑我已更改代码以使用for循环并修改了添加地雷的方式


    private synchronized void placeMines() {

  ExecutorService es = Executors.newSingleThreadExecutor();


  class placeThread implements Runnable {


    Grid grid;


    public placeThread(Grid grid) { this.grid = grid; }


    public void run() {


      final int mines = mode.mines;


      ArrayList<Cell> cList = new ArrayList<Cell>();

      for(ArrayList<Cell> row : this.grid.cells) {

        cList.addAll(row);

      }


      for(int j = 0; j < mines; j++) {

        int randCell = (int) Math.floor(Math.random() * cList.size());

        Cell selected = cList.get(randCell);

        if(this.grid.addMine(selected)) { cList.remove(selected); } else { j--; }

      }

      println(this.grid.mineCount());

    }


  }


  es.execute(new placeThread(this));


}




吃鸡游戏
浏览 233回答 1
1回答

慕后森

我无法完全解决您的问题,但我会给您一些提示。围绕该while语句的一般逻辑是可以的。您的退出条件应为何true时addMine()增加所需的地雷数量:&nbsp;while(this.grid.mineCount() < mines) {&nbsp; &nbsp; this.grid.addMine();&nbsp; }但是请注意,如果addMine()和mineCount()实施不正确,它将无法按预期工作。您没有显示Cell可以解释该问题的代码。为了放置地雷,我运行while循环,直到地雷总数==所选级别所需的地雷数量。while对于早期已知的多次迭代使用语句是无关紧要的。通常,您使用它是因为您不知道必须执行的迭代次数。如果您知道这个数字,使用loop似乎更合适:for (int i=0; i< mines; i++) {&nbsp; &nbsp; this.grid.addMine();}&nbsp;顺便说一句, selected.setValue(9);在这里似乎没用:if(selected.getValue() == 9) {&nbsp; selected.setValue(9);&nbsp; return true;}总之,在使整个应用程序正常工作之前,您可能应该从一些小步骤开始。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java