package ru.job4j.bomberman;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Класс для игрового поля.
 * @author vkovrov
 * @version 0.1
 * @since 0.1
 */
public class GameField {

    /**
     * Поле для двумерного массива замков.
     */
    private final ReentrantLock[][] board;

    /**
     * Конструктор класса.
     * @param height высота поля.
     * @param width ширина поля.
     */
    public GameField(int height, int width) {
        board = new ReentrantLock[height][width];
        this.boardInitiate();
    }

    /**
     * Метод для создания игрового поля.
     */
    private synchronized void boardInitiate() {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                board[i][j] = new ReentrantLock();
            }
        }
    }

    /**
     * Метод для захвата ячейки игрового поля.
     * @param x координата ячейки по оси абсцисс.
     * @param y координата ячейки по оси ординат.
     * @return true, если получилось занять ячейку.
     */
    public boolean lockCell(int x, int y) {
        synchronized (board[x][y]) {
            boolean isLocked = false;
            try {
                isLocked = board[x][y].tryLock(500, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (isLocked) {
                System.out.println(String.format("Cell %s x %s is locked by %s thread", x, y, Thread.currentThread().getName()));
            } else {
                System.out.println(String.format("Cell %s x %s is not locked by %s thread", x, y, Thread.currentThread().getName()));
            }
            return isLocked;
        }
    }

    /**
     * Метод для получения высоты игрового поля.
     * @return высота игрового поля.
     */
    public synchronized int getHeight() {
        return board.length;
    }

    /**
     * Метод для получения ширины игрового поля.
     * @return ширина игрового поля.
     */
    public synchronized int getWidth() {
        return board[0].length;
    }

    /**
     * Метод для освобождения ячейки игрового поля.
     * @param x координата ячейки по оси абсцисс.
     * @param y координата ячейки по оси ординат.
     */
    public void unlockCell(int x, int y) {
        synchronized (board[x][y]) {
            board[x][y].unlock();
            System.out.println(String.format("Cell %s x %s is unlocked by %s thread", x, y, Thread.currentThread().getName()));
        }
    }
}

@@ -1122,49 +1122,8 @@
 ) %7B%0A
-        synchronized (board%5Bx%5D%5By%5D) %7B%0A    
     
@@ -1160,20 +1160,16 @@
         
-    
 try %7B%0A  
@@ -1178,20 +1178,16 @@
         
-   
- 
 isLocked
@@ -1246,20 +1246,16 @@
         
-    
 %7D catch 
@@ -1293,20 +1293,16 @@
         
- 
-   
 e.printS
@@ -1318,34 +1318,26 @@
 ();%0A        
-   
- 
 %7D%0A
-    
         if (
@@ -1344,28 +1344,24 @@
 isLocked) %7B%0A
-    
             
@@ -1482,20 +1482,16 @@
         
-   
- 
 %7D else %7B
@@ -1491,20 +1491,16 @@
  else %7B%0A
-    
         
@@ -1625,34 +1625,26 @@
 ));%0A        
-    %7D%0A    
+%7D%0A
         retu
@@ -1656,26 +1656,16 @@
 Locked;%0A
-        %7D%0A
     %7D%0A%0A 

fix task 2 - Тестовое задание. [#1108]