Крестики-нолики на SFML. Проблемы с условиями
Не думал, что когда-то буду сюда писать, но видимо придётся. Относительно недавно(год-полгода) начал изучать С++ и с ним же графическую библиотеку SFML. Делал функцию с условиями, которая возвращает номер клетки на поле 3х3: 0 1 2 3 4 5 6 7 8
int CallReturn = -10;
int GetCellPressed()
{
float PressX, PressY;
PressX = Mouse::getPosition(win).x;
PressY = Mouse::getPosition(win).y;
if (Mouse::isButtonPressed(Mouse::Left))
{
if(0.f < PressY < 190.f && Mouse::isButtonPressed(Mouse::Left))
{
if(0 < PressX < 190) CallReturn = 0;
if(210 < PressX < 390) CallReturn = 1;
if(410 < PressX < 590) CallReturn = 2;
}
if(210 < PressY < 390 && Mouse::isButtonPressed(Mouse::Left))
{
if(0 < PressX < 190) CallReturn = 3;
if(210 < PressX < 390) CallReturn = 4;
if(410 < PressX < 590) CallReturn = 5;
}
if(410 < PressY < 590 && Mouse::isButtonPressed(Mouse::Left))
{
if(0 < PressX < 190) CallReturn = 6;
if(210 < PressX < 390) CallReturn = 7;
if(410 < PressX < 590) CallReturn = 8;
}
}
std::cout << CallReturn << std::endl;
return CallReturn;
}
Само поле же 600 на 600 пикселей. Возможно ответ на вопрос максимально простой, но что-то я посидел и ничего на ум не пришло.
При выводе CallReturn все время выходит 8, несмотря на то, что нажимал я на ячейку 1, что не так?
Ответы (2 шт):
Не по сути вопроса - но зачем вы все время проверяете && Mouse::isButtonPressed(Mouse::Left)? Одного раза на входе разве недостаточно? Второй вопрос - зачем CallReturn - глобальная переменная?
А по сути - 0.f < PressY < 190.f - это всегда true. Потому что < - бинарный левоассоциативный оператор, так что это выражение - то же, что и
(0.f < PressY) < 190.f
Каким бы ни было PressY, результат (0.f < PressY) - true или false, т.е. 1 или 0 - что, конечно же, меньше 190.f, и общий результат - true.
0.f < PressY && PressY < 190.f
Вот так правильнее...
Разделите целочисленно PressY на 200. Row = PressY/200
Посчитайте также остаток от этого деления.
Если остаток меньше 10 или больше 190 - попали в мертвый промежуток, иначе запоминаем Row
То же самое для PressX, получаем Column
Номер ячейки, если оба значения не в мертвых промежутках
Cell = 3 * Row + Column
Получается примерно так (стоить заменить магические числа на константы или переменные, это поможет при модификации программы):
Row = PressY / 200;
Rem = PressY % 200;
if (Rem < 10 || Rem >=190)
return -1;
Col = PressX / 200;
Rem = PressX % 200;
if (Rem < 10 || Rem >=190)
return -1;
return 3 * Row + Column;