Объясните код - C (СИ) (157329)
Формулировка задачи:
#include <stdio.h>
#include <stdlib.h>
int a[3][3];
void print_field()
{
int i, j;
system("clear");
printf("_______\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("|");
if (a[i][j] == 1) printf("X");
else if (a[i][j] == -1) printf("0");
else printf(" ");
}
printf("|\n_______\n");
}
}
int test_for_win(int x,int y)
{
if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0)) return 1;
if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0)) return 1;
if(((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0))) return 1;
return 0;
}
int main(int argc, char *argv[])
{
int i, j, val, c;
for(c =0;c<9;c++)
{
printf("Coordinates: ");
scanf("%d %d", &i, &j);
if (a[i-1][j-1] != 0) {printf("Already set. Retype.\n"); continue;}
if(c % 2 == 0) a[i-1][j-1] = -1;
else a[i-1][j-1] = 1;
print_field();
if (test_for_win(j-1, i-1))
{
exit(0);
}
}
return 0;
}Решение задачи: «Объясните код»
textual
Листинг программы
//Название метода объясняет для чего он служит.
//test_for_win - Тест для победы.
int test_for_win(int x,int y)
{
//проверка строк.
if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0))
return 1;
//проверка столбцов.
if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0))
return 1;
//проверяется диагональ матрицы. равно ли элементы диагонали и не равны ли они нулю
if(((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0)))
return 1;
return 0;
}
Объяснение кода листинга программы
- Метод
test_for_winпроверяет наличие победителя в игре. - В методе используются массивы
a[y][x], гдеy- номер строки, аx- номер столбца. - Первая проверка - это проверка строк матрицы. Если все элементы в строке равны между собой и не равны нулю, то возвращается 1.
- Вторая проверка - это проверка столбцов матрицы. Если все элементы в столбце равны между собой и не равны нулю, то возвращается 1.
- Третья проверка - это проверка диагонали матрицы. Если элементы главной диагонали или побочной диагонали равны между собой и не равны нулю, то возвращается 1.
- Если ни одна из проверок не вернула 1, то возвращается 0.