Проблема с проверкой условия If в игре крестики-нолики

В программе идёт двойная проверка if(-ом), первую переменную (первую часть) успешно проверяет. Следующую часть ― нет. В else переход по метке goto ― не переходит. Вот код:

#include <iostream>
#include <conio.h>
using namespace std;
char a[3][3] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
void forfor() {
    for (int i = 0; i < 3; i++) {
        cout << a[i][0] << " | " << a[i][1] << " | " << a[i][2];
        if (i < 2) { cout << endl << "----------"; }
        cout << endl;
    }
}
void noliki() {
S:
    int l = 0;
    switch (_getch())
    {
    case 49:l = 1;
        break;
    case 50:l = 2;
        break;
    case 51:l = 3;
        break;
    case 52:l = 4;
        break;
    case 53:l = 5;
        break;
    case 54:l = 6;
        break;
    case 55:l = 7;
        break;
    case 56:l = 8;
        break;
    case 57:l = 9;
        break;
    }
    if (l == 1 || l == 2 || l == 3 || l == 4 || l == 5 || l == 6 || l == 7 || l == 8 || l == 9) {
        if (l == 1 && a[0][0] == ' ') { a[0][0] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 2 && a[0][1] == ' ') { a[0][1] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 3 && a[0][2] == ' ') { a[0][2] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 4 && a[1][0] == ' ') { a[1][0] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 5 && a[1][1] == ' ') { a[1][1] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 6 && a[1][2] == ' ') { a[1][2] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 7 && a[2][0] == ' ') { a[2][0] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 8 && a[2][1] == ' ') { a[2][1] = 'O'; }
        else
        {
            goto S;
        }
        if (l == 9 && a[2][2] == ' ') { a[2][2] = 'O'; }
        else
        {
            goto S;
        }
 
    }
    
}
 void iks()
 {
    L:  int l=0;
    switch (_getch())
{
case 49:l = 1;
    break;
case 50:l = 2;
    break;
case 51:l = 3;
    break;
case 52:l = 4;
    break;
case 53:l = 5;
    break;
case 54:l = 6;
    break;
case 55:l = 7;
    break;
case 56:l = 8;
    break;
case 57:l = 9;
    break;
}
   if (l == 1 || l == 2 || l == 3 || l == 4 || l == 5 || l == 6 || l == 7 || l == 8 || l == 9) 
   {
    if (l == 1 && a[0][0] == ' ') { a[0][0] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 2 && a[0][1] == ' ') { a[0][1] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 3 && a[0][2] == ' ') { a[0][2] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 4 && a[1][0] == ' ') { a[1][0] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 5 && a[1][1] == ' ') { a[1][1] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 6 && a[1][2] == ' ') { a[1][2] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 7 && a[2][0] == ' ') { a[2][0] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 8 && a[2][1] == ' ') { a[2][1] = 'X'; }
    else
    {
        goto L;
    }
    if (l == 9 && a[2][2] == ' ') { a[2][2] = 'X'; }
    else
    {
        goto L;
    }
   }
 }
int main() {
        setlocale(LC_ALL, "ru");
        iks();
        forfor();
        noliki();
        cout << "\n";
        forfor();
        iks();
        cout << "\n";
        forfor();
        return 0;
}

Программу не дописал до конца т.к решил сначала разобраться с этой проблемой. Функции проверки победы и поражения будут.


Ответы (2 шт):

Автор решения: AlexGlebe

Всё в логике дело.

if (l == 1 && a[0][0] == ' ') { a[0][0] = 'X'; }
else
{
    goto L;
}

при ходе l == 2 сразу-же будет goto L;.

(условие else выполнится если l != 1 || a[0][0] != ' ')

Правильнее так :

if (l == 1 ) {
  if ( a[0][0] == ' ') { a[0][0] = 'X'; }
  else
  {
    goto L;
  } }
→ Ссылка
Автор решения: Harry

Если я правильно понял, что вы писали, то вся ваша функциональность укладывается в:

void setSym(char c)
{
    for(;;)
    {
        char in;
        while(isalpha(in = _getch()) && in != '0');
        in -= '1';
        if (a[in/3][in%3] == ' ')
        {
            a[in/3][in%3] = c;
            break;
        }
    }
}

void noliki() { setSym('O'); }
void iks()    { setSym('X'); }

Кстати, так куда понятнее, что вы вводите именно цифры, а не какие-то (которые обычно никто не помнит) коды 52 или 49... Хотя бы уж 0x30-0x39...

→ Ссылка