-1

戦艦の10x10グリッドに船をランダムに配置する方法に取り組んでいます。うまくいくこともありますが、明らかに船を配置できる場所を思いついたとしても、船を配置せずに永遠に実行されることがあります.

乱数生成と関係があるような気がします。

これが私のコードです:

public void placeAllShips() {
    int dir = 0;
    int xCoord = 0;
    int yCoord = 0;
    boolean flag;
    boolean overlap;
    for (int i=0; i<5; i++) {
      flag = true;
      overlap = false;
      while (flag) {
        xCoord = (int)(Math.random()*(10)); //get a random x coordinate
        yCoord = (int)(Math.random()*(10)); //get a random y coordinate
        dir = (int)(Math.random()*(2)); //get a random direction, 0 = horizontal, 1 = vertical
        if ((cellArr[xCoord][yCoord].hasShip()==false)&&(((dir==0)&&((xCoord+i)<=9))||((dir==1)&&((yCoord+i)<=9)))) {
          for (int j=0; j<i+1; j++) {
            if ((dir==0)&&(cellArr[xCoord+j][yCoord].hasShip())) {
              overlap = true;
            }
            else if ((dir==1)&&(cellArr[xCoord][yCoord+j].hasShip())) {
              overlap = true;
            }
          }
          if (overlap==false) {
            flag = false;
          }
        }
        System.out.print("A");
      }
      System.out.println(xCoord+":"+yCoord+":"+dir);
      for (int k=0; k<i+1; k++) {
        if (dir==0) {
          cellArr[xCoord+k][yCoord].setHasShip(true);
        }
        else {
          cellArr[xCoord][yCoord+k].setHasShip(true);
        }
      }
    }
  }
4

1 に答える 1

3
  • overlapに設定されていfalseます。
  • while ループが始まります。
  • オーバーラップが見つかった場合、overlapに設定されtrueます。
  • ループが再開します。
  • overlapまだまだtrueです。
  • ループは決して終了しません。

overlap = false;したがって、 1 行下に移動します。

于 2013-02-23T19:33:18.023 に答える