我只是在业余时间制作一款简单的《扫雷》游戏。为了放置地雷,我运行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;
}
总之,在使整个应用程序正常工作之前,您可能应该从一些小步骤开始。
添加回答
举报
0/150
提交
取消