Как проверить элементы строки в 2D-массиве - PullRequest
0 голосов
/ 02 марта 2020

Итак, я пытаюсь сделать игру «три в ряд», и до сих пор мне удавалось заставить ее работать, но я немного борюсь за то, чтобы получить победителя, так как мне нужно это проверить. все элементы строки, столбца или диагонали одинаковы.

До сих пор мне удавалось заставить его работать, используя логическое значение, счетчик и a для l oop. Вот пример того, как мой код выглядит

//Code to check the rows horizontally
public void checkH(){
int cont1 = 0;
Boolean winner1 = false;
for(int i=0;i<size;i++){
    if(a[0][i]==1 || a[1][i]==1 || a[2][i]==1){
        cont1++;
        if(cont1==3){
            winner1 = true;
        }

Итак, как вы можете видеть, что я делаю в этом коде, говорит программе, что если массив в одной из строк равен один и если тот же самый случай случится, когда он пройдет все позиции в строке, то счетчик добавит плюс один, и как только счетчик достигнет 3, логическое значение будет истинным, и будет победитель, но здесь подвох: если, например, двумерный массив выглядит так:

int a[][] = {{1,0,0},
         {1,1,0},
         {0,0,0}};

, то счетчик по-прежнему достигает трех, даже если они не выровнены. Я знаю, что не указывал такого рода условия в программе, но с этим я борюсь. То, что я хотел бы сделать, - это иметь возможность выполнить это условие с помощью циклов, так что мне не нужно заполнять все это с помощью операторов if. , Заранее спасибо!

1 Ответ

0 голосов
/ 02 марта 2020

Если вам трудно найти решение / учебник в Интернете, обратите внимание, что игра три в ряд также называется ti c -ta c - схождение . Итак, если вы ищете «алгоритм ti c ta c toe», вы найдете несколько примеров того, как его решить, так как это довольно обычный вопрос для интервью. Вот справочник для удобства читателя.

Теперь, для желания использовать для циклов вместо цепочек ifs (или если с несколькими логическими сравнениями), это вопрос о построчном, столбцовом и диагональном обходе матрицы. Вот ссылка для обхода строк и столбцов , а вот еще одна ссылка для диагонального обхода .

Specifi c на ваш вопрос, ниже приведен псевдокод, показывающий проверку для столбца и строки с использованием для и значений ячеек, имеющих небольшое количество if операторов. Но, пожалуйста, обратите внимание, что это только пример, так как есть много интересных способов решить игру ti c -ta c -toe, на которую вы, возможно, захотите взглянуть, от обходных деревьев до с использованием строки и регулярного выражения .

public bool checkRow() { 

  int i, j; 
  int count = 0;

  // accessing element row wise 
  for (i = 0; i < MAX; i++) { 
    for (j = 0; j < MAX; j++) { 
        // Considering we were checking for 1
        // And array can have 0 or 1
        // You can add the cell value and avoid an if
        count += arr[i][j];
       // if you go with arr[j][i] you will be traversing the columns and not the rows.
    } 

    // if all cells in the row are 1, we have a winner
    if(count == MAX)
        return true;
  } 

  return false
} 
...