2015-12-24 1 views
0

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

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); 
+2

Линия: 'gameArray [gameVariables [0]] [0] = (char) 82; 'также может быть записано как gameArray [gameVariables [0]] [0] = \' R \ '; – ryyker

+1

Как точка стиля, код будет чистым без всех этих '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' закончен 'return'. –

+0

Хорошо. Тем не менее, проверка хорошая? Это худшая часть программы, и если бы она действительно могла работать, это было бы здорово. – Justplayit94

ответ

1

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

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]) 

и на других линиях тоже.

+0

Это было то, что я подозревал. Благодарю. – Justplayit94

2

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

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

//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; 
} 

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

//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] - это просто символ, поэтому приведение значения 82 не требуется. Кроме того, синтаксис С обеспечивает способ вытащить десятичное значение символа ASCII, окружая его с символом могил, позволяя следующую форму, которая является более читаемым:

gameArray[gameVariables[0]][0] = `R`;  //intuitive 
+0

Спасибо, я на самом деле внес все изменения, и теперь я собираюсь сделать заявления 'if', надеюсь, что он будет работать лучше. – Justplayit94

+1

@ Justplayit94 - Примечание: Переключатель может быть заменен оператором _single if_ :) – ryyker

+1

Это действительно работает, все, что мне нужно сделать, это сделать диагональную проверку, и это будет здорово – Justplayit94

Смежные вопросы