我只是在业余时间制作一款简单的《扫雷》游戏。为了放置地雷,我运行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));
}
慕后森
相关分类