Это проверка прототипа игры connect four, но похоже, что я сделал что-то не так. Я хочу, чтобы каждый раз, когда игрок делает ход, функция проверяет, выиграл он там или нет, проверяя по вертикали, горизонтали и, в конечном итоге, по диагонали. Но кажется, что он не проверяется правильно, потому что в некоторых случаях, даже если сделано всего 2 хода, функция возвращает 1.

    int verifyGame(int gamePosition, int gameVariable, char gameArray[HEIGTH][WIDTH])
{

  if(gameArray[gamePosition][gameVariable] == gameArray[gamePosition + 1][gameVariable] == gameArray[gamePosition + 2][gameVariable] == gameArray[gamePosition + 3][gameVariable]) //verify vertically
        return 1;
      else
        if(gameArray[gamePosition][gameVariable] == gameArray[gamePosition][gameVariable - 3] == gameArray[gamePosition][gameVariable - 2] == gameArray[gamePosition][gameVariable - 1]) //verify horizontally
          return 1;
      else
         if(gameArray[gamePosition][gameVariable] == gameArray[gamePosition][gameVariable - 2] == gameArray[gamePosition][gameVariable - 1] == gameArray[gamePosition][gameVariable + 1])
          return 1;
      else
         if(gameArray[gamePosition][gameVariable] == gameArray[gamePosition][gameVariable - 1] == gameArray[gamePosition][gameVariable + 1] == gameArray[gamePosition][gameVariable + 2])
          return 1;
      else
         if(gameArray[gamePosition][gameVariable] == gameArray[gamePosition][gameVariable + 1] == gameArray[gamePosition][gameVariable+ 2] == gameArray[gamePosition][gameVariable + 3])
          return 1;
      //verify diagonally


      else return 0;
};

Здесь вызывается функция. Коммутатор проверяет вводимые пользователем данные, а затем помещает значение в матрицу, а затем проверяет на выигрыш.

    printf("playerPick is : %d\n", playerPick);
  fflush(stdout);
  switch(playerPick)
  {
    case 1:
     if(gameVariables[0] >0 && gameVariables[0] < 7)
      {
        --gameVariables[0];
        gameArray[gameVariables[0]][0] = (char) 82;
       ifWon = verifyGame(gameVariables[0], 0, gameArray);
      }
      printArray(gameArray);
      break;
    case 2:

      if(gameVariables[1] >0 && gameVariables[1] < 7)
      {
        --gameVariables[1];
        gameArray[gameVariables[1]][1] = (char) 82;
        ifWon = verifyGame(gameVariables[1], 1, gameArray);
      }
      printArray(gameArray);
      break;
    case 3:
      if(gameVariables[2] >0 && gameVariables[2] < 7)
        {
          --gameVariables[2];
          gameArray[gameVariables[2]][2] = (char) 82;
          ifWon = verifyGame(gameVariables[2], 2, gameArray);
        }
      printArray(gameArray);
      break;
    case 4:
      if(gameVariables[3] >0 && gameVariables[3] < 7)
        {
          --gameVariables[3];
          gameArray[gameVariables[3]][3] = (char) 82;
          ifWon = verifyGame(gameVariables[3], 3, gameArray);
        }
      printArray(gameArray);
      break;
    case 5:
      if(gameVariables[4] >0 && gameVariables[4] < 7)
      {
        --gameVariables[4];
        gameArray[gameVariables[4]][4] = (char) 82;
        ifWon = verifyGame(gameVariables[4], 4, gameArray);
      }
      printArray(gameArray);
      break;
    case 6:
      if(gameVariables[5] >0 && gameVariables[5] < 7)
      {
        --gameVariables[5];
        gameArray[gameVariables[5]][5] = (char) 82;
        ifWon = verifyGame(gameVariables[5], 5, gameArray);
      }
      printArray(gameArray);
      break;
    case 7:
      if(gameVariables[6] >0 && gameVariables[6] < 7)
      {
        --gameVariables[6];
        gameArray[gameVariables[6]][6] = (char) 82;
        ifWon = verifyGame(gameVariables[6], 6, gameArray);
      }
      printArray(gameArray);
      break;

  }
  printf("%d %d %d %d %d %d %d\n", gameVariables[0], gameVariables[1], gameVariables[2], gameVariables[3], gameVariables[4], gameVariables[5], gameVariables[6]);
  printf("ifwon :  %d\n", ifWon);
0
Justplayit94 24 Дек 2015 в 21:57

2 ответа

Лучший ответ

Вы не можете связать тестирование равенства, когда пытаетесь. Код будет выполнен, но не так, как вы предполагали. Ваш код

if(gameArray[gamePosition][gameVariable] == 
   gameArray[gamePosition + 1][gameVariable] == 
   gameArray[gamePosition + 2][gameVariable] == 
   gameArray[gamePosition + 3][gameVariable])

Должны быть разделены на отдельные тесты, например:

if(gameArray[gamePosition][gameVariable] == gameArray[gamePosition + 1][gameVariable] &&
   gameArray[gamePosition][gameVariable] == gameArray[gamePosition + 2][gameVariable] &&
   gameArray[gamePosition][gameVariable] == gameArray[gamePosition + 3][gameVariable])

И по другим линиям тоже.

1
Weather Vane 24 Дек 2015 в 19:22

Ответ @Weather Vane правильный. Логика, использованная в вашем исходном сообщении, не подходит для проверки.

Одна из причин , что вы, возможно, не заметили этого сами, - это сложный способ написания. Попробуйте упростить проверочный код, вводимый пользователем: (Все, что необходимо - это проверка диапазона значений, вводимых пользователем.)

//User input range checking:
if((gamePosition >= x)&&    //where `x` is minimum for gamePosition
   (gamePosition <= y)&&    //where `y` is maximum for gamePosition
   (gameVariable >= z)&&    //where `z` is minimum for gameVariable
   (gameVariable <= w))     //where `w` is maximum for gameVariable
{//continue }
else 
{
    printf("Invalid value.  Please re-enter");
    return -1;
}

Еще одна возможность для упрощения состоит в том, чтобы отметить, что каждый из ваших операторов case содержит идентичный код, за исключением значения case. Из-за этого весь switch(...){...} можно заменить одним оператором if :

//assuming playerPick >= 1
  if(gameVariables[playerPick-1] >0 && gameVariables[playerPick-1] < 7)
  {
    --gameVariables[playerPick-1];
    gameArray[gameVariables[playerPick-1]][playerPick-1] = (char) 82;
    ifWon = verifyGame(gameVariables[playerPick-1], playerPick-1, gameArray);
  }
  printArray(gameArray);

Также обратите внимание , что хотя утверждение:

gameArray[gameVariables[0][0] = (char) 82; //what is 82?

Совершенно допустима, переменная gameArray [0] [0] - это просто char, поэтому преобразование значения 82 не требуется. Кроме того, синтаксис C позволяет извлечь ASCII десятичного значения символа, заключив его в символ могилы, что позволяет использовать следующую форму, которая более удобна для чтения:

gameArray[gameVariables[0]][0] = `R`;       //intuitive
2
ryyker 24 Дек 2015 в 20:22