Проблема с проверкой условия 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...