Проверка победы в игре четыре в ряд
Сейчас есть такой код:
void checkWon(int x, int y)
{
int hor = 1;
int vert = 1;
bool right= true;
bool left = true;
bool up = true;
bool down = true;
for(int i=1; i<4; i++)
{
if(right)
{
// char curChar() возвращает символ того игрока, чей сейчас ход ('X' или 'O')
// char at(int x, int y) возвращает символ в клетке с соответсвующиими координатами
// (' ', 'X' или 'O'), или ' ', если такой клетки нет
if(at(x+i, y) == curChar())
hor++;
else right = false;
}
if(left)
{
if(at(x-i, y) == curChar())
hor++;
else left=false;
}
if(down)
{
if(at(x, y-i) == curChar())
vert++;
else down = false;
}
if(up)
{
if(at(x, y+i) == curChar())
vert++;
else up=false;
}
}
int ul_dr = 1;
int dl_ur = 1;
bool ul = true;
bool ur = true;
bool dl = true;
bool dr = true;
for(int i=1; i<4; i++)
{
if(ul)
{
if(at(x-i, y+i) == curChar())
ul_dr++;
else ul=false;
}
if(dr)
{
if(at(x+i, y-i) == curChar())
ul_dr++;
else dr=false;
}
if(dl)
{
if(at(x-i, y-i) == curChar())
dl_ur++;
else dl=false;
}
if(ur)
{
if(at(x+i, y+i) == curChar())
dl_ur++;
else ur=false;
}
}
if(hor >= 4 || vert >= 4 || ul_dr >= 4 || dl_ur >= 4)
{
if(state == GameState::WhiteToMove)
state = GameState::WhiteWon;
if(state == GameState::BlackToMove)
state = GameState::BlackWon;
}
}
- Переменных
up,down,left,right,ul,dl,ur,dlравныtrueтолько если в данном направлении относительно точки (x, y) встречались только символы совпадающие с символом в данной клетке. - Переменных
hor,vert,ul_dr,dl_urравны длинам непрерывных рядов в соответсвующих направлениях.
Код работает, но выглядит довольно запутанно, кажется, что в нем легко пропустить ошибку. Подскажите, можно ли его как-то улучшить?