为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

吃鸡游戏 2021-05-05 13:01:49
我只是在业余时间制作一款简单的《扫雷》游戏。为了放置地雷,我运行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));}
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

我无法完全解决您的问题,但我会给您一些提示。


围绕该while语句的一般逻辑是可以的。您的退出条件应为何true时addMine()增加所需的地雷数量:


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

    this.grid.addMine();

  }

但是请注意,如果addMine()和mineCount()实施不正确,它将无法按预期工作。您没有显示Cell可以解释该问题的代码。


为了放置地雷,我运行while循环,直到地雷总数==所选级别所需的地雷数量。


while对于早期已知的多次迭代使用语句是无关紧要的。

通常,您使用它是因为您不知道必须执行的迭代次数。如果您知道这个数字,

使用loop似乎更合适:


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

    this.grid.addMine();

顺便说一句, selected.setValue(9);在这里似乎没用:


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

  selected.setValue(9);

  return true;

}

总之,在使整个应用程序正常工作之前,您可能应该从一些小步骤开始。


查看完整回答
反对 回复 2021-05-26
  • 1 回答
  • 0 关注
  • 231 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信