Другие языки программирования и технологии

Почему вечно выдаёт "false"( разный цвет)?

ЗАДАНИЕ: 20)поля (x1, y1) и (x2, y2) шахматной доски имеют одинаковый цвет (x1, x2, y1, y2 – целые от 1 до 8);

МОЙ КОД:
#include "stdio.h"
#include "math.h"
#include "clocale"
#include "conio.h"
int main()
{
setlocale(LC_ALL, "Russian");
bool U;
int a, a1, b, b1;

printf("Выберите две одинаковые ячейки: \n");

printf_s("a: ");
scanf_s("%d", &a);

printf_s("a1: ");
scanf_s("%d", &a1);

printf_s("b: ");
scanf_s("%d", &b);

printf_s("b1: ");
scanf_s("%d", &b1);

if ((a > 0) && (a <= 8) && (a1 > 0) && (a1 <= 8) && (b > 0) && (b <= 8) && (b1 > 0) && (b1 <= 8)) U = true;
else U = false;

// условия для черных
if (((a % 2 == 0) && (a1 % 2 == 0)) && ((b % 2 != 0) && (b1 % 2 != 0))) U = true;
else U = false;
if (((a % 2 != 0) && (a1 % 2 != 0)) && ((b % 2 == 0) && (b1 % 2 == 0))) U = true;
else U = false;
if (((a % 2 != 0) && (a1 % 2 != 0)) && ((b % 2 != 0) && (b1 % 2 != 0))) U = true;
else U = false;
if (((a % 2 == 0) && (a1 % 2 == 0)) && ((b % 2 == 0) && (b1 % 2 == 0))) U = true;
else U = false;
// условия для белых
if (((a % 2 != 0) && (a1 % 2 == 0)) && ((b % 2 == 0) && (b1 % 2 != 0))) U = true;
else;
if (((a % 2 != 0) && (a1 % 2 == 0)) && ((b % 2 != 0) && (b1 % 2 == 0))) U = true;
else U = false;
if (((a % 2 == 0) && (a1 % 2 != 0)) && ((b % 2 == 0) && (b1 % 2 != 0))) U = true;
else U = false;
if (((a % 2 == 0) && (a1 % 2 != 0)) && ((b % 2 != 0) && (b1 % 2 == 0))) U = true;
else U = false;

if (U) {
printf("Одного цвета! \n");
}
else {
printf("Разного цвета! \n");
}
}
Для "шахматной" доски цвет клетки с координатами row, col равен:
(row + col) % 2

Потому проверка того, что две клетки имеют один цвет выполняется простейшим выражением:

U = (row1 + col1) % 2 == (row2 + col2) % 2;

Результатом операции == УЖЕ является true / false, потому if НЕ НУЖЕН.
Денис Сергеевич
Денис Сергеевич
82 581
Лучший ответ
Влияние на U оказывает только самый последний if. То, что делают все предыдущие, им перезаписывается.

Вообще, код очень грязный. Я понимаю, что до красивой формулы в одну строчку можно и не додуматься, но когда у тебя стена похожих друг на друга строчек, идущих подряд, это почти всегда очень плохо и легко исправляется.
Ты не думал, например, ввести для каждой клетки по переменной и в каждую из которых занести 0/1 в зависимости от того, черная эта клетка или белая, и потом их сравнить? Или вообще вынести код вычисления цвета клетки в отдельную функцию?
Олег Гвоздев
Олег Гвоздев
51 164
Юрий Прозоровский извините, я только начал изучать с++
Если присмотреться к доске, то можно заметить, что:
Для чёрных клеток чётность горизонтали и вертикали одинакова.
Для белых клеток чётность горизонтали и вертикали различна.

==========================================================================
Важное свойство чётности суммы: Сумма двух чисел одинаковой чётности всегда чётна, сумма двух чисел различной чётности всегда нечётна
==========================================================================

Это значит, что:
Сумма номеров горизонтали и вертикали чёрной клетки всегда чётная.
Сумма номеров горизонтали и вертикали белой клетки всегда нечётная.

Из этого следует:
Сумма номеров горизонталей и вертикалей двух клеток ОДИНАКОВОГО цвета всегда чётная!
Сумма номеров горизонталей и вертикалей одной белой и одной чёрной клеток всегда нечётная! (чёрной или белой может быть любая из клеток).

Таким образом достаточно вычислить сумму заданных номеров горизонталей и вертикалей обеих клеток и определить её чётность.
Денис Максимовский Вариант вывода:

     printf ("%s цвета! \n", (bool)((a + a1 + b + b1) & 1) ? "Разного" : "Одного");
Денис Максимовский И кстати, сократи приглашение:

     printf ("Выберите две клетки: \n");

// слово „одинаковые” неуместно!