https://pastein.ru/t/OT

  скопируйте уникальную ссылку для отправки



public class Logic {
	//массив для игрового поля игрока
	public int[][] masPlay;
	public int[][] masComp;
	//признак хода компьютера (если он false - то ходит игрок) 
	public boolean compTurn;
	//признак конца игры
	//(0- игра идет, 1-победил игрок, 2-победил компьютер)
	public int gameEnd;
	
	//конструктор класса
	public Logic() {
		masPlay = new int[10][10];
		masComp = new int[10][10];
	}
	
	public void start() {
		//Очищаем игровое поле игрока
		for(int i = 0; i< 10; i++) {
			for(int j=0; j<10; j++) {
				masPlay[i][j]= 0;
			}
		}
	
		//обнуляем победу
		gameEnd = 0;
		//передаем первый ход игроку
		compTurn = false;
		//расставляем корабли игрока
		createPlayerShips(masPlay);
		createPlayerShips(masComp);
	}
	
	private void createPlayerShips(int [][] array) {
		//Создаем один четырехпалубный корабль
		createFour(array,4);
		//два трехпалубных корабля
		for(int i=1; i<=2; i++) {
			createFour(array,3);
		}
		//три двухпалубных корабля
		for(int i=1; i<=3; i++) {
			createFour(array,2);
		}
		createOne(array);
	}
	
	
	//проверка выхода за границу массива
	private boolean checkBounds(int i, int j) {
		if (( (i>=0) && (i<=9) ) && ( (j >= 0) && (j<=9) ) ) 
			return true;	
		else 
			return false;
	}
	
	
	//запись значения в массив
	private void setValue(int[][] array, int i, int j, int value) {
		if(checkBounds(i,j) == true) {
			array[i][j] = value;
		}
	}
	
	private void surroundFinal(int[][] array) { //okrEnd
		for(int i =0; i< 10; i++) {
			for(int j = 0; j < 10; j++) {
				//Если значение элемента в массиве равно -2,то заменяем его на -1
				if(array[i][j] == -2) 
					array[i][j] = -1;
			}
		}
	}
	
	private boolean shipCheckAvailable(int[][] array, int i, int j) {
		//Если выход за границы массива
		if(checkBounds(i,j) == false)
			return false;
		//Если в этой ячейки находится значение 0 или -2, то она нам подходит
		if((array[i][j] == 0) || (array[i][j] == -2)) 
			return true;
		
		return false;
	}
	
	//создание 4х палубного корабля
	private void createFour(int[][] array, int number) {
		while(true) {
			
		boolean flag = false;
		
		//координаты головы корабля
		int i = 0, j = 0;
		//создаем первую палубу
		i = (int)(Math.random() * 10);
		j = (int)(Math.random() * 10);
		
		//Помещаем в ячейку число 4
		array[i][j] = 4;
		//окружаем минус двойками
		surroundCreating(array,i,j,-2);
		
		//Выбираем случайное направление построения корабля
		//0 -- вверх, 1 - вправо, 2 - вниз, 3 влево
		int direction = (int)(Math.random()*4);
		
		if(shipCheckAvailable(array,i,j) == true) {
			
			if(direction == 0) {
				if(shipCheckAvailable(array, i-(number-1), j) == true) {
					flag = true;
				}
			}
			
			else if(direction == 1) {//вправо
				if(shipCheckAvailable(array, i, j+(number-1)) == true) {
					flag=true;
				}
			}
			else if (direction == 2) {
				//вниз 
				if(shipCheckAvailable(array, i+(number-1), j) == true) {
					flag = true;
				}
			}
			else if(direction == 3) {
				//Если выход за границу массива
				if(shipCheckAvailable(array, i, j-(number-1)) == true) {
					flag = true;
				}
			}
			
			if(flag == true) {
				//Помещаем в ячейку число палуб
				array[i][j] = number;
				//окружаем минус два
				
			}
		}
	
		
		if(direction == 0) {
			//помещаем в ячейку число четыре
			array[i-3][j] = 4;
			surroundCreating(array,i-3,j, -2); // окружение -2 
			//surroundShip меняем -2 на -1
			array[i-2][j] = 4;
			surroundCreating(array, i-2, j, -2);
			array[i-1][j] = 4;
			surroundCreating(array, i-1, j, -2);
		}
		if(direction == 1) {
			array[i][j+3] = 4;
			surroundCreating(array,i,j+3, -2);
			array[i][j+2] = 4;
			surroundCreating(array,i,j+2, -2);
			array[i][j+1] = 4;
			surroundCreating(array,i,j+1, -2);
		}
		if(direction == 2) { 
			array[i+3][j] = 4;
			surroundCreating(array,i+3,j,-2);
			array[i+2][j] = 4;
			surroundCreating(array,i+2,j,-2);
			array[i+1][j] = 4;
			surroundCreating(array,i+1,j,-2);			
		}
		if(direction == 3) { 
			array[i][j-3] = 4;
			surroundCreating(array,i,j-3,-2);
			array[i][j-2] = 4;
			surroundCreating(array,i,j-2,-2);
			array[i][j-1] = 4;
			surroundCreating(array,i,j-1,-2);			
		}
		
		surroundFinal(array);
	}
	}
	private void createOne(int [][] array) {
		 for(int k = 0; k<=4; k++) {
			 while(true) {
				 int i = (int)(Math.random() * 10);
				 int j = (int)(Math.random() * 10);
				 //Проверяем что там ничего нет
				 if(array[i][j] == 0) {
					 //размещаем корабль
					 array[i][j] = 1;
					 surroundCreating(array, i, j, -1);
					 break;
				 }
			 }
		 }
	}
	
	
	
	private void setSurround(int [][] array, int i, int j, int value) { //setOkr
		if((checkBounds(i,j))&&(array [i][j] == 0)){
			setValue(array,i,j,value);
		}
	}
	
	private void surroundCreating(int [][] array, int i, int j, int value) { //okrBegin
		setSurround(array, i-1, j-1, value); //сверху слева
		setSurround(array, i-1, j, value); //сверху 
		setSurround(array, i-1, j+1, value); //сверху справа
		setSurround(array, i, j+1, value); //справа
		setSurround(array, i+1, j+1, value); //снизу справа
		setSurround(array, i+1, j, value); //снизу
		setSurround(array, i+1, j-1, value); //снизу слева
		setSurround(array, i, j-1, value); //слева
	}
}