1

Тема: Проблема з циклом

Є завдання в якому потрібно створити булевий масив, який потрібно заповнити з певною ймовірностю. Якщо true, то потрібно вивести * це буде бомба, якщо false то . це буде безпечна клітинка. А далі потрібно вивести масив в якому замість клітинки буде цифра з кількістю сусідніх бомб. Написав функцію, яка це обраховує, проте сам цикл після виклику функції припиняє роботу. Буду вдячний, якщо підскажете чому так відбувається.

package minesweeper;

import java.util.Random;

public class Minesweeper {

  private int rows;
  private int columns;
  private boolean[][] mineSweeperArrBoolean;
  private String[][] mineSweeperArrString;
  private double probabilityOfBombsSpawn;
  private static Random random;

  public Minesweeper(int rows, int columns, double probabilityOfBombsSpawn) {
    this.rows = rows;
    this.columns = columns;
    this.probabilityOfBombsSpawn = probabilityOfBombsSpawn * 100;
    this.mineSweeperArrBoolean = new boolean[rows][columns];
    this.mineSweeperArrString = new String[rows][columns];
    random = new Random();

  }

  public void startGame() {
    createMineSweeperArrBoolean();
    printMineSweeperArrBoolean();
    System.out.println("\n\n");
    printMineSweeperArrString();

  }

  // якщо probabilityOfBombsSpawn = 61, тоді
  // integers від 1-61 це будуть бомби
  private void createMineSweeperArrBoolean() {
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        if (random.nextInt(100) + 1 <= probabilityOfBombsSpawn) {
          mineSweeperArrBoolean[i][j] = true;
        } else {
          mineSweeperArrBoolean[i][j] = false;
        }
      }
    }
  }

  private void printMineSweeperArrBoolean() {
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        if (mineSweeperArrBoolean[i][j]) {
          System.out.print("*  ");
        } else {
          System.out.print(".  ");
        }
      }
      System.out.println();
    }
  }

  // метод який мав би друкувати масив
  // з кількістю сусідніх бомб замість .
  private void printMineSweeperArrString() {
    calculateMineSweeperArrString();
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        System.out.print(mineSweeperArrString[i][j] + "  ");
      }
      System.out.println();
    }
  }

  // в цьому методі відбувається заповнення масиву
  //
  private void calculateMineSweeperArrString() {

    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        if (!mineSweeperArrBoolean[i][j]) {
          mineSweeperArrString[i][j] = countOfBombs(i, j);
        } else {
          mineSweeperArrString[i][j] = "*";
        }
      }
    }
  }
  // цей метод повинен обраховувати кількість сусідніх бомб
  private String countOfBombs(int row, int col) {
    int count = 0;
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        if (!mineSweeperArrBoolean[row][col]) {
          if (row != 0 && mineSweeperArrBoolean[row - 1][col]) {
            count++;
          }
          if (row != rows-- && mineSweeperArrBoolean[row + 1][col]) {
            count++;
          }
          if (col != 0 && mineSweeperArrBoolean[row][col - 1]) {
            count++;
          }
          if (col != columns-- && mineSweeperArrBoolean[row][col + 1]) {
            count++;
          }
        }
      }
    }
    return Integer.toString(count);
  }
}

2

Re: Проблема з циклом

lipton написав:
  // цей метод повинен обраховувати кількість сусідніх бомб
  private String countOfBombs(int row, int col) {
    int count = 0;
   //Де ви використовуєте i та j? Ця функція rows*columns разів виконуватиме одне й те саме, і намарно. Приберіть цикли.
   for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        if (!mineSweeperArrBoolean[row][col]) {
          if (row != 0 && mineSweeperArrBoolean[row - 1][col]) {
            count++;
          }
          if (row != rows-- && mineSweeperArrBoolean[row + 1][col]) {//нащо rows зменшувати? -- ЗМІНЮЄ значення аргумента. 
            count++;
          }
          if (col != 0 && mineSweeperArrBoolean[row][col - 1]) {
            count++;
          }
          if (col != columns-- && mineSweeperArrBoolean[row][col + 1]) {//нащо columns зменшувати? -- ЗМІНЮЄ значення аргумента. 
            count++;
          }
        }
      }
    }
    return Integer.toString(count);
  }
Декалог програміста-початківця: https://replace.org.ua/post/132988/
Подякували: lipton1

3

Re: Проблема з циклом

koala написав:
lipton написав:
  // цей метод повинен обраховувати кількість сусідніх бомб
  private String countOfBombs(int row, int col) {
    int count = 0;
   //Де ви використовуєте i та j? Ця функція rows*columns разів виконуватиме одне й те саме, і намарно. Приберіть цикли.
   for (int i = 0; i < rows; i++) {
      for (int j = 0; j < columns; j++) {
        if (!mineSweeperArrBoolean[row][col]) {
          if (row != 0 && mineSweeperArrBoolean[row - 1][col]) {
            count++;
          }
          if (row != rows-- && mineSweeperArrBoolean[row + 1][col]) {//нащо rows зменшувати? -- ЗМІНЮЄ значення аргумента. 
            count++;
          }
          if (col != 0 && mineSweeperArrBoolean[row][col - 1]) {
            count++;
          }
          if (col != columns-- && mineSweeperArrBoolean[row][col + 1]) {//нащо columns зменшувати? -- ЗМІНЮЄ значення аргумента. 
            count++;
          }
        }
      }
    }
    return Integer.toString(count);
  }

Дякую, все запрацювало