Метод GameOver при вызове создает новую сетку. Поэтому при проверке значений в строках, столбцах и диагоналях обнаруживается, что значения совпадают, поскольку все они пусты. Дайте методу GameOver новый параметр, который принимает сетку, и используйте его. Однако будьте осторожны с этим, поскольку теперь все строки и столбцы будут иметь в качестве значения «_». Так же, как вы проверили "_" в диагональных условиях, вы должны проверить его в if-выражении строки и столбца.
Это показывает содержимое пустого массива сетки:
Кроме того, вы должны сделать отступ в коде, чтобы его было легче читать и отлаживать. Я бы также предложил создать метод печати сетки вместо дублирования вложенных циклов for для ее печати.